Commit c4ae05b9 authored by Wolfram Sang's avatar Wolfram Sang Committed by Wolfram Sang

i2c: recovery: make pin init look like STOP

When we initialize the pins, make sure it looks like STOP by dividing
the delay into halves. It shouldn't matter because SDA is expected to be
held low by a device, but for super-safety, let's do it.
Signed-off-by: default avatarWolfram Sang <wsa+renesas@sang-engineering.com>
Reviewed-by: default avatarUlrich Hecht <ulrich.hecht+renesas@gmail.com>
Reviewed-by: default avatarPeter Rosin <peda@axentia.se>
Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
parent ea3cfbd8
...@@ -190,10 +190,17 @@ int i2c_generic_scl_recovery(struct i2c_adapter *adap) ...@@ -190,10 +190,17 @@ int i2c_generic_scl_recovery(struct i2c_adapter *adap)
if (bri->prepare_recovery) if (bri->prepare_recovery)
bri->prepare_recovery(adap); bri->prepare_recovery(adap);
/*
* If we can set SDA, we will always create a STOP to ensure additional
* pulses will do no harm. This is achieved by letting SDA follow SCL
* half a cycle later. Check the 'incomplete_write_byte' fault injector
* for details.
*/
bri->set_scl(adap, scl); bri->set_scl(adap, scl);
ndelay(RECOVERY_NDELAY / 2);
if (bri->set_sda) if (bri->set_sda)
bri->set_sda(adap, 1); bri->set_sda(adap, scl);
ndelay(RECOVERY_NDELAY); ndelay(RECOVERY_NDELAY / 2);
/* /*
* By this time SCL is high, as we need to give 9 falling-rising edges * By this time SCL is high, as we need to give 9 falling-rising edges
...@@ -211,13 +218,7 @@ int i2c_generic_scl_recovery(struct i2c_adapter *adap) ...@@ -211,13 +218,7 @@ int i2c_generic_scl_recovery(struct i2c_adapter *adap)
scl = !scl; scl = !scl;
bri->set_scl(adap, scl); bri->set_scl(adap, scl);
/* Creating STOP again, see above */
/*
* If we can set SDA, we will always create STOP here to ensure
* the additional pulses will do no harm. This is achieved by
* letting SDA follow SCL half a cycle later. Check the
* 'incomplete_write_byte' fault injector for details.
*/
ndelay(RECOVERY_NDELAY / 2); ndelay(RECOVERY_NDELAY / 2);
if (bri->set_sda) if (bri->set_sda)
bri->set_sda(adap, scl); bri->set_sda(adap, scl);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment