diff options
author | Wolfram Sang <wsa+renesas@sang-engineering.com> | 2018-01-09 16:58:58 +0300 |
---|---|---|
committer | Wolfram Sang <wsa@the-dreams.de> | 2018-01-16 02:04:42 +0300 |
commit | 2806e6ad77c71dd2538cb698aad476e8cf3af004 (patch) | |
tree | 78c855e0e041056bcc408b5ba768a511ca273c4a /drivers | |
parent | 72b08fcc15dc6a2d211880e4dc7cf5314e9ab750 (diff) | |
download | linux-2806e6ad77c71dd2538cb698aad476e8cf3af004.tar.xz |
i2c: send STOP after successful bus recovery
If we managed to get a client release SDA again, send a STOP afterwards
to make sure we have a consistent state on the bus again.
Tested-by: Phil Reid <preid@electromag.com.au>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/i2c/i2c-core-base.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index 54cef80990a1..23f353630db3 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -199,6 +199,18 @@ int i2c_generic_scl_recovery(struct i2c_adapter *adap) if (bri->get_sda && !bri->get_sda(adap)) ret = -EBUSY; + /* If all went well, send STOP for a sane bus state. */ + if (ret == 0 && bri->set_sda) { + bri->set_scl(adap, 0); + ndelay(RECOVERY_NDELAY / 2); + bri->set_sda(adap, 0); + ndelay(RECOVERY_NDELAY / 2); + bri->set_scl(adap, 1); + ndelay(RECOVERY_NDELAY / 2); + bri->set_sda(adap, 1); + ndelay(RECOVERY_NDELAY / 2); + } + if (bri->unprepare_recovery) bri->unprepare_recovery(adap); |