i2c: pxa: fix i2c_pxa_wait_bus_not_busy() boundary condition
authorRussell King <rmk+kernel@armlinux.org.uk>
Mon, 27 Apr 2020 18:49:32 +0000 (19:49 +0100)
committerWolfram Sang <wsa@kernel.org>
Tue, 5 May 2020 12:51:07 +0000 (14:51 +0200)
Fix i2c_pxa_wait_bus_not_busy()'s boundary conditions, so that a
coincidental success and timeout results in the function returning
success.

Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
drivers/i2c/busses/i2c-pxa.c

index 7aa35de..c1e50c0 100644 (file)
@@ -416,19 +416,26 @@ static void i2c_pxa_abort(struct pxa_i2c *i2c)
 static int i2c_pxa_wait_bus_not_busy(struct pxa_i2c *i2c)
 {
        int timeout = DEF_TIMEOUT;
+       u32 isr;
 
-       while (timeout-- && readl(_ISR(i2c)) & (ISR_IBB | ISR_UB)) {
-               if ((readl(_ISR(i2c)) & ISR_SAD) != 0)
+       while (1) {
+               isr = readl(_ISR(i2c));
+               if (!(isr & (ISR_IBB | ISR_UB)))
+                       return 0;
+
+               if (isr & ISR_SAD)
                        timeout += 4;
 
+               if (!timeout--)
+                       break;
+
                msleep(2);
                show_state(i2c);
        }
 
-       if (timeout < 0)
-               show_state(i2c);
+       show_state(i2c);
 
-       return timeout < 0 ? I2C_RETRY : 0;
+       return I2C_RETRY;
 }
 
 static int i2c_pxa_wait_master(struct pxa_i2c *i2c)