aboutsummaryrefslogtreecommitdiffstats
path: root/queue-6.6/iio-accel-adxl367-fix-devid-read-after-reset.patch
diff options
context:
space:
mode:
Diffstat (limited to 'queue-6.6/iio-accel-adxl367-fix-devid-read-after-reset.patch')
-rw-r--r--queue-6.6/iio-accel-adxl367-fix-devid-read-after-reset.patch55
1 files changed, 55 insertions, 0 deletions
diff --git a/queue-6.6/iio-accel-adxl367-fix-devid-read-after-reset.patch b/queue-6.6/iio-accel-adxl367-fix-devid-read-after-reset.patch
new file mode 100644
index 0000000000..ec34585caf
--- /dev/null
+++ b/queue-6.6/iio-accel-adxl367-fix-devid-read-after-reset.patch
@@ -0,0 +1,55 @@
+From 1b926914bbe4e30cb32f268893ef7d82a85275b8 Mon Sep 17 00:00:00 2001
+From: Cosmin Tanislav <demonsingur@gmail.com>
+Date: Wed, 7 Feb 2024 05:36:50 +0200
+Subject: iio: accel: adxl367: fix DEVID read after reset
+
+From: Cosmin Tanislav <demonsingur@gmail.com>
+
+commit 1b926914bbe4e30cb32f268893ef7d82a85275b8 upstream.
+
+regmap_read_poll_timeout() will not sleep before reading,
+causing the first read to return -ENXIO on I2C, since the
+chip does not respond to it while it is being reset.
+
+The datasheet specifies that a soft reset operation has a
+latency of 7.5ms.
+
+Add a 15ms sleep between reset and reading the DEVID register,
+and switch to a simple regmap_read() call.
+
+Fixes: cbab791c5e2a ("iio: accel: add ADXL367 driver")
+Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
+Reviewed-by: Nuno Sa <nuno.sa@analog.com>
+Link: https://lore.kernel.org/r/20240207033657.206171-1-demonsingur@gmail.com
+Cc: <Stable@vger.kernel.org>
+Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/iio/accel/adxl367.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+--- a/drivers/iio/accel/adxl367.c
++++ b/drivers/iio/accel/adxl367.c
+@@ -1429,9 +1429,11 @@ static int adxl367_verify_devid(struct a
+ unsigned int val;
+ int ret;
+
+- ret = regmap_read_poll_timeout(st->regmap, ADXL367_REG_DEVID, val,
+- val == ADXL367_DEVID_AD, 1000, 10000);
++ ret = regmap_read(st->regmap, ADXL367_REG_DEVID, &val);
+ if (ret)
++ return dev_err_probe(st->dev, ret, "Failed to read dev id\n");
++
++ if (val != ADXL367_DEVID_AD)
+ return dev_err_probe(st->dev, -ENODEV,
+ "Invalid dev id 0x%02X, expected 0x%02X\n",
+ val, ADXL367_DEVID_AD);
+@@ -1510,6 +1512,8 @@ int adxl367_probe(struct device *dev, co
+ if (ret)
+ return ret;
+
++ fsleep(15000);
++
+ ret = adxl367_verify_devid(st);
+ if (ret)
+ return ret;