If SCL is stuck low, the bus cannot be recovered. No need to check SDA
or futilely trying to send a STOP. Just exit.

Signed-off-by: Wolfram Sang <[email protected]>
---
 drivers/i2c/i2c-core-base.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
index bfefeb2ab2fd..cbbfe3fd387b 100644
--- a/drivers/i2c/i2c-core-base.c
+++ b/drivers/i2c/i2c-core-base.c
@@ -189,7 +189,7 @@ int i2c_generic_scl_recovery(struct i2c_adapter *adap)
                                dev_err(&adap->dev,
                                        "SCL is stuck low, exit recovery\n");
                                ret = -EBUSY;
-                               break;
+                               goto exit_unprepare;
                        }
                        /* Break if SDA is high */
                        if (bri->get_sda && bri->get_sda(adap))
@@ -227,6 +227,7 @@ int i2c_generic_scl_recovery(struct i2c_adapter *adap)
                ndelay(RECOVERY_NDELAY / 2);
        }
 
+ exit_unprepare:
        if (bri->unprepare_recovery)
                bri->unprepare_recovery(adap);
 
-- 
2.11.0

Reply via email to