]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Input: drv260x - handle calibration timeout
authorYauhen Kharuzhy <jekhor@gmail.com>
Tue, 17 Feb 2026 18:10:27 +0000 (10:10 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Wed, 18 Feb 2026 07:05:16 +0000 (23:05 -0800)
If something goes wrong during calibration (for instance, if the
'enable' GPIO was not properly defined), the GO bit may not be cleared
after some time, causing the driver to get stuck.

To prevent this, add a timeout check to the waiting loop and return an
error if it times out.

Signed-off-by: Yauhen Kharuzhy <jekhor@gmail.com>
Link: https://patch.msgid.link/20260215141435.727872-6-jekhor@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/misc/drv260x.c

index d73175024abb71b9552596e0857e74e8aa5feed4..b3076aa682c4db636b4eab14b67ba9b5a2bb7848 100644 (file)
 #define DRV260X_AUTOCAL_TIME_500MS             (2 << 4)
 #define DRV260X_AUTOCAL_TIME_1000MS            (3 << 4)
 
+/*
+ * Timeout for waiting for the GO status bit, in seconds. Should be reasonably
+ * large to wait for a auto-calibration cycle completion.
+ */
+#define DRV260X_GO_TIMEOUT_S 5
+
 /**
  * struct drv260x_data -
  * @input_dev: Pointer to the input device
@@ -309,6 +315,7 @@ static int drv260x_init(struct drv260x_data *haptics)
 {
        int error;
        unsigned int cal_buf;
+       unsigned long timeout;
 
        error = regmap_write(haptics->regmap,
                             DRV260X_RATED_VOLT, haptics->rated_voltage);
@@ -398,6 +405,7 @@ static int drv260x_init(struct drv260x_data *haptics)
                return error;
        }
 
+       timeout = jiffies + DRV260X_GO_TIMEOUT_S * HZ;
        do {
                usleep_range(15000, 15500);
                error = regmap_read(haptics->regmap, DRV260X_GO, &cal_buf);
@@ -407,6 +415,11 @@ static int drv260x_init(struct drv260x_data *haptics)
                                error);
                        return error;
                }
+               if (time_after(jiffies, timeout)) {
+                       dev_err(&haptics->client->dev,
+                               "Calibration timeout. The device cannot be used.\n");
+                       return -ETIMEDOUT;
+               }
        } while (cal_buf == DRV260X_GO_BIT);
 
        return 0;