i2c: generic recovery: check SCL before SDA
Move the check for a stuck SCL before the check for a high SDA. This prevent false positives in the specific case that SDA is fine and SCL is stuck, which previously returned 0. Also check SDA again after the loop, if we can. Together, these changes should lead to a lot more failed recoveries being caught and returning error codes. Signed-off-by: Claudio Foellmi <claudio.foellmi@ergon.ch> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
This commit is contained in:
parent
3ded0512e9
commit
1f35b86536
1 changed files with 7 additions and 3 deletions
|
@ -205,9 +205,6 @@ static int i2c_generic_recovery(struct i2c_adapter *adap)
|
|||
*/
|
||||
while (i++ < RECOVERY_CLK_CNT * 2) {
|
||||
if (val) {
|
||||
/* Break if SDA is high */
|
||||
if (bri->get_sda && bri->get_sda(adap))
|
||||
break;
|
||||
/* SCL shouldn't be low here */
|
||||
if (!bri->get_scl(adap)) {
|
||||
dev_err(&adap->dev,
|
||||
|
@ -215,6 +212,9 @@ static int i2c_generic_recovery(struct i2c_adapter *adap)
|
|||
ret = -EBUSY;
|
||||
break;
|
||||
}
|
||||
/* Break if SDA is high */
|
||||
if (bri->get_sda && bri->get_sda(adap))
|
||||
break;
|
||||
}
|
||||
|
||||
val = !val;
|
||||
|
@ -222,6 +222,10 @@ static int i2c_generic_recovery(struct i2c_adapter *adap)
|
|||
ndelay(RECOVERY_NDELAY);
|
||||
}
|
||||
|
||||
/* check if recovery actually succeeded */
|
||||
if (bri->get_sda && !bri->get_sda(adap))
|
||||
ret = -EBUSY;
|
||||
|
||||
if (bri->unprepare_recovery)
|
||||
bri->unprepare_recovery(adap);
|
||||
|
||||
|
|
Loading…
Reference in a new issue