]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iio: magnetometer: ak8975: modernize polling loops with iopoll() macros
authorJoshua Crofts <joshua.crofts1@gmail.com>
Mon, 11 May 2026 11:26:10 +0000 (13:26 +0200)
committerJonathan Cameron <jic23@kernel.org>
Sun, 31 May 2026 09:59:39 +0000 (10:59 +0100)
The driver currently uses while loops and msleep() for polling during
conversion waits.

Replace the custom polling loops with readx_poll_timeout() and
read_poll_timeout() macros from <linux/iopoll.h>. This reduces
boilerplate, standardizes timeout handling and improves overall code
readability, keeping the original timing and error behaviour. Add
<linux/time.h> for USEC_PER_MSEC macro instead of using magic numbers.

Assisted-by: Gemini:3.1-Pro
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Signed-off-by: Joshua Crofts <joshua.crofts1@gmail.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/magnetometer/ak8975.c

index 6be72e1cc0a8321e767da5e65d54c0fe88712304..b990c123e2808c2078abcfaf6b2ef86c09393e6b 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/pm_runtime.h>
 #include <linux/property.h>
 #include <linux/regulator/consumer.h>
+#include <linux/time.h>
 #include <linux/types.h>
 #include <linux/wait.h>
 
@@ -649,16 +650,14 @@ static int wait_conversion_complete_gpio(struct ak8975_data *data,
 {
        struct i2c_client *client = data->client;
        int ret;
+       int val;
 
        /* Wait for the conversion to complete. */
-       while (timeout_ms) {
-               msleep(poll_ms);
-               if (gpiod_get_value(data->eoc_gpiod))
-                       break;
-               timeout_ms -= poll_ms;
-       }
-       if (!timeout_ms)
-               return -ETIMEDOUT;
+       ret = readx_poll_timeout(gpiod_get_value, data->eoc_gpiod, val, val != 0,
+                                poll_ms * USEC_PER_MSEC,
+                                timeout_ms * USEC_PER_MSEC);
+       if (ret)
+               return ret;
 
        ret = i2c_smbus_read_byte_data(client, data->def->ctrl_regs[ST1]);
        if (ret < 0)
@@ -672,27 +671,21 @@ static int wait_conversion_complete_polled(struct ak8975_data *data,
                                           unsigned int timeout_ms)
 {
        struct i2c_client *client = data->client;
-       u8 read_status;
        int ret;
+       int val;
 
        /* Wait for the conversion to complete. */
-       while (timeout_ms) {
-               msleep(poll_ms);
-               ret = i2c_smbus_read_byte_data(client,
-                                              data->def->ctrl_regs[ST1]);
-               if (ret < 0) {
-                       dev_err(&client->dev, "Error in reading ST1\n");
-                       return ret;
-               }
-               read_status = ret;
-               if (read_status)
-                       break;
-               timeout_ms -= poll_ms;
-       }
-       if (!timeout_ms)
-               return -ETIMEDOUT;
+       ret = read_poll_timeout(i2c_smbus_read_byte_data, val, val != 0,
+                               poll_ms * USEC_PER_MSEC,
+                               timeout_ms * USEC_PER_MSEC,
+                               true,
+                               client, data->def->ctrl_regs[ST1]);
+       if (ret)
+               return ret;
+       if (val < 0)
+               dev_err(&client->dev, "Error in reading ST1\n");
 
-       return read_status;
+       return val;
 }
 
 /* Returns 0 if the end of conversion interrupt occurred or -ETIMEDOUT otherwise */