From patchwork Thu Nov 23 11:42:36 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Zhang, Sean C. (NSB - CN/Hangzhou)" X-Patchwork-Id: 840735 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-i2c-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=nokia.onmicrosoft.com header.i=@nokia.onmicrosoft.com header.b="UIGxCzuz"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yjHW64phmz9s83 for ; Thu, 23 Nov 2017 22:42:42 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752446AbdKWLml (ORCPT ); Thu, 23 Nov 2017 06:42:41 -0500 Received: from mail-eopbgr10097.outbound.protection.outlook.com ([40.107.1.97]:29130 "EHLO EUR02-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751799AbdKWLmj (ORCPT ); Thu, 23 Nov 2017 06:42:39 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nokia.onmicrosoft.com; s=selector2-nokia-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=nP/AuTIIROzOBkW3V3/imf9v+u6mXUFbdudvYXAkD54=; b=UIGxCzuzqVGfc6rBzcEtpy6snCmDK/sIDGwMKY7p7VYFPZljh+6NikWen+CHLgMP/ASTCpU7+HaQpV70xNsisxojU98JLhL+ggPVqReheN4qyCXqEXkwpG/U6ymiMfjWZ2zQbZ2JWVjCM10cAyy+uHAYUQdabGQ2ZXamKd+o/Ec= Received: from VI1PR0702MB3615.eurprd07.prod.outlook.com (52.134.1.140) by VI1PR0702MB3613.eurprd07.prod.outlook.com (52.134.1.138) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.260.2; Thu, 23 Nov 2017 11:42:36 +0000 Received: from VI1PR0702MB3615.eurprd07.prod.outlook.com ([fe80::3188:c91e:bf44:c714]) by VI1PR0702MB3615.eurprd07.prod.outlook.com ([fe80::3188:c91e:bf44:c714%13]) with mapi id 15.20.0260.004; Thu, 23 Nov 2017 11:42:36 +0000 From: "Zhang, Sean C. (NSB - CN/Hangzhou)" To: "jglauber@cavium.com" , "david.daney@cavium.com" , "wsa@the-dreams.de" , "linux-i2c@vger.kernel.org" , "linux-kernel@vger.kernel.org" Subject: [Bug fix] octeon-i2c driver updates Thread-Topic: [Bug fix] octeon-i2c driver updates Thread-Index: AdNkUCeee/NagH5vSSOVY6BQA+iQtg== Date: Thu, 23 Nov 2017 11:42:36 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=sean.c.zhang@nokia-sbell.com; x-originating-ip: [131.228.32.175] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; VI1PR0702MB3613; 6:5e9MLR9lGBoR7eeMryeGCHZjFN600QJuZCdWAC4NFE1SMEfYTx/2UrDKrJFuv6I63BJFVb0Odq0T5iZoSkHlu5qIT59qdBNRPdujrKHLyLZsmah1MGV9cwcYOTZlLAwKMSrgQaJ90x8uhhYxDsiv8Bkn9EfUuNpthVe/SHwRipjH2wyumV/YthvIHous27Ahrw1IueTIoLQqh85McnFOvemdL8WH5qIhtyyll3vVqd20I2tQseCrn/9+EETVaDD134ECt++UvwwybUUFNceW6ewFte7nCwZWqRrEnqEk8Xs79Hfoo+SsY5eZiVVN0AhlEY6iL/bh/MaAEPBSDOEHqgRYhvicUUS82epNmjbZTAk=; 5:K7lDNQvbieZiAPyb3T/WgderNe1xF1p8sZiwVTV+pXk9KFjECWs+nWdvtZoRDWuS31WpkqaTi8E4KHfxf9z+eQGEM2/jJShNJ1ngAqvUn94HyzQGP92gaYjVGlDGltblu2PsSQmw/QnJgYmEl0wHbmIxSFM7C5Bl/qPNHbmQe6I=; 24:PrBa0/UNSUGjujvirElc1M27pZbS0X56B6Xq9CEojQm7nKV7Stmfg30u78dApqVPaDt5rTgNEleGJO/T2yOuClJwpYTMB1IUR8PhZ1N5aVs=; 7:2T1SLAkS3Xd7NhfFkoGd6RSo1OqxjhdoBj4qKc5DVI67g75IvKuN/F+3I2h/DffbwKb1rlZJKxm/QgzuROniMTYYgvhdyI8aoLMLx7hR43aapFZJx5BCo0OqQnWAkMSPWOhbVd0yy49XMKjPct0SjllHCDYvgUk8m3JIhMiy2JGdk9d7d4bYo5srU3XiqCyS/Zusg2aYpK32w9+94plkhcwK/xGTRdbiW9hDZVNFtZZQzweVVQpLTGBUdKQpDfm4 x-ms-exchange-antispam-srfa-diagnostics: SSOS; x-ms-office365-filtering-ht: Tenant x-ms-office365-filtering-correlation-id: de4a8cd2-3b98-46c9-ea19-08d532674af9 x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(48565401081)(5600025)(4604075)(2017052603199)(49563074); SRVR:VI1PR0702MB3613; x-ms-traffictypediagnostic: VI1PR0702MB3613: x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(82608151540597); x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(102415395)(6040450)(2401047)(5005006)(8121501046)(100000703101)(100105400095)(93006095)(93001095)(3002001)(10201501046)(3231022)(6055026)(6041248)(20161123562025)(20161123558100)(20161123564025)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123555025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:VI1PR0702MB3613; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:VI1PR0702MB3613; x-forefront-prvs: 05009853EF x-forefront-antispam-report: SFV:NSPM; SFS:(10019020)(6009001)(376002)(366004)(39860400002)(346002)(51874003)(199003)(189002)(105586002)(413944005)(81166006)(55016002)(316002)(478600001)(14454004)(6116002)(8936002)(3846002)(68736007)(102836003)(53936002)(9686003)(2201001)(99936001)(305945005)(33656002)(86362001)(106356001)(101416001)(5890100001)(575784001)(54356999)(50986999)(8676002)(189998001)(2900100001)(5250100002)(97736004)(25786009)(7736002)(66066001)(2906002)(3660700001)(15650500001)(74316002)(2501003)(7696004)(99286004)(110136005)(53546010)(6436002)(5660300001)(6506006)(81156014)(3280700002); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0702MB3613; H:VI1PR0702MB3615.eurprd07.prod.outlook.com; FPR:; SPF:None; PTR:InfoNoRecords; A:0; MX:1; LANG:en; received-spf: None (protection.outlook.com: nokia-sbell.com does not designate permitted sender hosts) spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: nokia-sbell.com X-MS-Exchange-CrossTenant-Network-Message-Id: de4a8cd2-3b98-46c9-ea19-08d532674af9 X-MS-Exchange-CrossTenant-originalarrivaltime: 23 Nov 2017 11:42:36.2143 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 5d471751-9675-428d-917b-70f44f9630b0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0702MB3613 Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org Dear Maintainer, For octeon TWSI controller, I found below two cases, maybe can be improved. From 09d9f0ce658d7f6a50d1af352dde619c29bc8bcf Mon Sep 17 00:00:00 2001 From: hgt463 Date: Thu, 23 Nov 2017 18:46:09 +0800 Subject: [PATCH] Driver updates: - In the case of I2C bus dead lock occurred during driver probing, it is better try to recovery it. so added bus recovery step in octeon_i2c_probe(); - The purpose of function octeon_i2c_start() is to send START, so after bus recovery, also need try to send START again. Signed-off-by: hgt463 --- drivers/i2c/busses/i2c-octeon-core.c | 31 ++++++++++++++++++++++++++++++- drivers/i2c/busses/i2c-octeon-platdrv.c | 15 +++++++++------ 2 files changed, 39 insertions(+), 7 deletions(-) Attached patch for you review. Thanks in advance. BR, Sean Zhang diff --git a/drivers/i2c/busses/i2c-octeon-core.c b/drivers/i2c/busses/i2c-octeon-core.c index 1d87757..3ae1e03 100644 --- a/drivers/i2c/busses/i2c-octeon-core.c +++ b/drivers/i2c/busses/i2c-octeon-core.c @@ -255,6 +255,35 @@ static int octeon_i2c_recovery(struct octeon_i2c *i2c) return ret; } +/* + * octeon_i2c_start_retry - send START to the bus after bus recovery. + * @i2c: The struct octeon_i2c + * + * Returns 0 on success, otherwise a negative errno. + */ +static int octeon_i2c_start_retry(struct octeon_i2c *i2c) +{ + int ret; + u8 stat; + + ret = octeon_i2c_recovery(i2c); + if (ret) + goto error; + + octeon_i2c_ctl_write(i2c, TWSI_CTL_ENAB | TWSI_CTL_STA); + ret = octeon_i2c_wait(i2c); + if (ret) + goto error; + + stat = octeon_i2c_stat_read(i2c); + if (stat == STAT_START || stat == STAT_REP_START) + /* START successful, bail out */ + return 0; + +error: + return (ret) ? ret : -EAGAIN; +} + /** * octeon_i2c_start - send START to the bus * @i2c: The struct octeon_i2c @@ -280,7 +309,7 @@ static int octeon_i2c_start(struct octeon_i2c *i2c) error: /* START failed, try to recover */ - ret = octeon_i2c_recovery(i2c); + ret = octeon_i2c_start_retry(i2c); return (ret) ? ret : -EAGAIN; } diff --git a/drivers/i2c/busses/i2c-octeon-platdrv.c b/drivers/i2c/busses/i2c-octeon-platdrv.c index 64bda83..98063af 100644 --- a/drivers/i2c/busses/i2c-octeon-platdrv.c +++ b/drivers/i2c/busses/i2c-octeon-platdrv.c @@ -228,12 +228,6 @@ static int octeon_i2c_probe(struct platform_device *pdev) if (OCTEON_IS_MODEL(OCTEON_CN38XX)) i2c->broken_irq_check = true; - result = octeon_i2c_init_lowlevel(i2c); - if (result) { - dev_err(i2c->dev, "init low level failed\n"); - goto out; - } - octeon_i2c_set_clock(i2c); i2c->adap = octeon_i2c_ops; @@ -245,6 +239,15 @@ static int octeon_i2c_probe(struct platform_device *pdev) i2c_set_adapdata(&i2c->adap, i2c); platform_set_drvdata(pdev, i2c); + stat = octeon_i2c_stat_read(i2c); + if (stat != STAT_IDLE) { + result = octeon_i2c_recovery(i2c); + if (result) { + dev_err(i2c->dev, "octeon i2c recovery failed\n"); + goto out; + } + } + result = i2c_add_adapter(&i2c->adap); if (result < 0) goto out;