i2c: s3c24xx: fix read transfers in polling mode
[platform/kernel/linux-starfive.git] / drivers / i2c / busses / i2c-s3c2410.c
index 127eb38..fdd7a42 100644 (file)
@@ -216,8 +216,17 @@ static bool is_ack(struct s3c24xx_i2c *i2c)
        int tries;
 
        for (tries = 50; tries; --tries) {
-               if (readl(i2c->regs + S3C2410_IICCON)
-                       & S3C2410_IICCON_IRQPEND) {
+               unsigned long tmp = readl(i2c->regs + S3C2410_IICCON);
+
+               if (!(tmp & S3C2410_IICCON_ACKEN)) {
+                       /*
+                        * Wait a bit for the bus to stabilize,
+                        * delay estimated experimentally.
+                        */
+                       usleep_range(100, 200);
+                       return true;
+               }
+               if (tmp & S3C2410_IICCON_IRQPEND) {
                        if (!(readl(i2c->regs + S3C2410_IICSTAT)
                                & S3C2410_IICSTAT_LASTBIT))
                                return true;