]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
i2c: isch: Use read_poll_timeout()
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 16 Sep 2024 12:01:34 +0000 (15:01 +0300)
committerAndi Shyti <andi.shyti@kernel.org>
Wed, 13 Nov 2024 22:29:45 +0000 (23:29 +0100)
Simplify the code by using read_poll_timeout().

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
drivers/i2c/busses/i2c-isch.c

index d0098b7139a0d1ee9c71e6298107ff016375cbfd..e6b99913f4f3d1bf9775d1c5c9fbd85859d4c5f4 100644 (file)
@@ -17,9 +17,9 @@
 #include <linux/container_of.h>
 #include <linux/delay.h>
 #include <linux/device.h>
-#include <linux/ioport.h>
 #include <linux/i2c.h>
-#include <linux/io.h>
+#include <linux/iopoll.h>
+#include <linux/ioport.h>
 #include <linux/stddef.h>
 #include <linux/string_choices.h>
 #include <linux/types.h>
@@ -34,9 +34,6 @@
 #define SMBHSTDAT1     0x07
 #define SMBBLKDAT      0x20
 
-/* Other settings */
-#define MAX_RETRIES    5000
-
 /* I2C constants */
 #define SCH_QUICK              0x00
 #define SCH_BYTE               0x01
@@ -83,7 +80,6 @@ static int sch_transaction(struct i2c_adapter *adap)
        struct sch_i2c *priv = container_of(adap, struct sch_i2c, adapter);
        int temp;
        int result = 0;
-       int retries = 0;
 
        dev_dbg(&adap->dev,
                "Transaction (pre): CNT=%02x, CMD=%02x, ADD=%02x, DAT0=%02x, DAT1=%02x\n",
@@ -112,15 +108,11 @@ static int sch_transaction(struct i2c_adapter *adap)
        temp |= 0x10;
        sch_io_wr8(priv, SMBHSTCNT, temp);
 
-       do {
-               usleep_range(100, 200);
-               temp = sch_io_rd8(priv, SMBHSTSTS) & 0x0f;
-       } while ((temp & 0x08) && (retries++ < MAX_RETRIES));
-
+       result = read_poll_timeout(sch_io_rd8, temp, !(temp & 0x08), 200, 500000, true,
+                                  priv, SMBHSTSTS);
        /* If the SMBus is still busy, we give up */
-       if (retries > MAX_RETRIES) {
+       if (result) {
                dev_err(&adap->dev, "SMBus Timeout!\n");
-               result = -ETIMEDOUT;
        } else if (temp & 0x04) {
                result = -EIO;
                dev_dbg(&adap->dev, "Bus collision! SMBus may be locked until next hard reset. (sorry!)\n");
@@ -130,7 +122,7 @@ static int sch_transaction(struct i2c_adapter *adap)
                dev_err(&adap->dev, "Error: no response!\n");
        } else if (temp & 0x01) {
                dev_dbg(&adap->dev, "Post complete!\n");
-               sch_io_wr8(priv, SMBHSTSTS, temp);
+               sch_io_wr8(priv, SMBHSTSTS, temp & 0x0f);
                temp = sch_io_rd8(priv, SMBHSTSTS) & 0x07;
                if (temp & 0x06) {
                        /* Completion clear failed */