summaryrefslogtreecommitdiff
path: root/drivers/iio/imu
diff options
context:
space:
mode:
authorJean-Baptiste Maneyrol <jean-baptiste.maneyrol@tdk.com>2026-08-24 14:30:07 +0200
committerJonathan Cameron <jonathan.cameron@oss.qualcomm.com>2026-08-31 02:58:31 +0100
commitb0a08c48debce09d7f585c73a342a488945dcb68 (patch)
tree89769982878ada42c342ca74f54fca5707142e73 /drivers/iio/imu
parent783211907c2df6e8a1cce892a67d99c943ef6404 (diff)
iio: imu: inv_icm42600: sleep before enabling FIFO data
When turning accel or gyro on, a sleep is required for letting the mechanical part stabilize before reporting correct data. Move the sleep before enabling FIFO data to prevent push of incorrect data. We need to unlock the driver mutex while sleeping to not block data of the other sensor if it is running. There is no possible race here because we are already under IIO mode mutex locked since it is a IIO buffer callback. Signed-off-by: Jean-Baptiste Maneyrol <jean-baptiste.maneyrol@tdk.com> Signed-off-by: Jonathan Cameron <jonathan.cameron@oss.qualcomm.com>
Diffstat (limited to 'drivers/iio/imu')
-rw-r--r--drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c16
-rw-r--r--drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c16
2 files changed, 24 insertions, 8 deletions
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c
index 4b0e3cd8a506..3197081a808a 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c
@@ -254,15 +254,23 @@ static int inv_icm42600_accel_update_scan_mode(struct iio_dev *indio_dev,
fifo_en |= INV_ICM42600_SENSOR_ACCEL;
}
+ /*
+ * Sleep maximum stabilization time before enabling data in FIFO.
+ * We need to release the driver lock to not block gyro data processing.
+ * There is no possible race here since we are under IIO mutex locked.
+ */
+ sleep = max(sleep_accel, sleep_temp);
+ if (sleep) {
+ mutex_unlock(&st->lock);
+ msleep(sleep);
+ mutex_lock(&st->lock);
+ }
+
/* update data FIFO write */
ret = inv_icm42600_buffer_set_fifo_en(st, fifo_en | st->fifo.en);
out_unlock:
mutex_unlock(&st->lock);
- /* sleep maximum required time */
- sleep = max(sleep_accel, sleep_temp);
- if (sleep)
- msleep(sleep);
return ret;
}
diff --git a/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c b/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c
index 253bf571439d..9de5c383665f 100644
--- a/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c
+++ b/drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c
@@ -126,15 +126,23 @@ static int inv_icm42600_gyro_update_scan_mode(struct iio_dev *indio_dev,
fifo_en |= INV_ICM42600_SENSOR_GYRO;
}
+ /*
+ * Sleep maximum stabilization time before enabling data in FIFO.
+ * We need to release the driver lock to not block accel data processing.
+ * There is no possible race here since we are under IIO mutex locked.
+ */
+ sleep = max(sleep_gyro, sleep_temp);
+ if (sleep) {
+ mutex_unlock(&st->lock);
+ msleep(sleep);
+ mutex_lock(&st->lock);
+ }
+
/* update data FIFO write */
ret = inv_icm42600_buffer_set_fifo_en(st, fifo_en | st->fifo.en);
out_unlock:
mutex_unlock(&st->lock);
- /* sleep maximum required time */
- sleep = max(sleep_gyro, sleep_temp);
- if (sleep)
- msleep(sleep);
return ret;
}