i2c: uniphier-f: fix misdetection of incomplete STOP condition
[cascardo/linux.git] / drivers / i2c / busses / i2c-uniphier-f.c
index 829df91..db9105e 100644 (file)
@@ -14,6 +14,7 @@
 
 #include <linux/clk.h>
 #include <linux/i2c.h>
+#include <linux/iopoll.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
 #include <linux/module.h>
@@ -348,14 +349,19 @@ static int uniphier_fi2c_master_xfer_one(struct i2c_adapter *adap,
        dev_dbg(&adap->dev, "complete\n");
 
        if (unlikely(priv->flags & UNIPHIER_FI2C_DEFER_STOP_COMP)) {
-               u32 status = readl(priv->membase + UNIPHIER_FI2C_SR);
-
-               if (!(status & UNIPHIER_FI2C_SR_STS) ||
-                   status & UNIPHIER_FI2C_SR_BB) {
+               u32 status;
+               int ret;
+
+               ret = readl_poll_timeout(priv->membase + UNIPHIER_FI2C_SR,
+                                        status,
+                                        (status & UNIPHIER_FI2C_SR_STS) &&
+                                        !(status & UNIPHIER_FI2C_SR_BB),
+                                        1, 20);
+               if (ret) {
                        dev_err(&adap->dev,
                                "stop condition was not completed.\n");
                        uniphier_fi2c_recover(priv);
-                       return -EBUSY;
+                       return ret;
                }
        }