i2c: recovery: refactor recovery function
authorWolfram Sang <wsa+renesas@sang-engineering.com>
Tue, 10 Jul 2018 21:42:17 +0000 (23:42 +0200)
committerWolfram Sang <wsa@the-dreams.de>
Tue, 17 Jul 2018 08:42:48 +0000 (10:42 +0200)
After exiting the while loop, we checked if recovery was successful and
sent a STOP to the clients. Meanwhile however, we send a STOP after
every pulse, so it is not needed after the loop. If we move the check
for a free bus to the end of the while loop, we can shorten and simplify
the logic. It is still ensured that at least one STOP will be sent to
the wire even if SDA was not stuck low.

Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Reviewed-by: Peter Rosin <peda@axentia.se>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/i2c-core-base.c

index 871a9731894fb6c4cf10479cf7ec47fcc120aae6..c7995efd58ea78a32d8b1767580f73fcfaec9868 100644 (file)
@@ -191,9 +191,6 @@ int i2c_generic_scl_recovery(struct i2c_adapter *adap)
                                ret = -EBUSY;
                                break;
                        }
-                       /* Break if SDA is high */
-                       if (bri->get_sda && bri->get_sda(adap))
-                               break;
                }
 
                val = !val;
@@ -209,22 +206,13 @@ int i2c_generic_scl_recovery(struct i2c_adapter *adap)
                if (bri->set_sda)
                        bri->set_sda(adap, val);
                ndelay(RECOVERY_NDELAY / 2);
-       }
-
-       /* check if recovery actually succeeded */
-       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);
+               /* Break if SDA is high */
+               if (val && bri->get_sda) {
+                       ret = bri->get_sda(adap) ? 0 : -EBUSY;
+                       if (ret == 0)
+                               break;
+               }
        }
 
        if (bri->unprepare_recovery)