[PATCH v2 1/4] iio: imu: inv_icm42600: sleep before enabling FIFO data

From: Jean-Baptiste Maneyrol via B4 Relay

Date: Mon Aug 24 2026 - 08:38:30 EST


From: Jean-Baptiste Maneyrol <jean-baptiste.maneyrol@xxxxxxx>

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@xxxxxxx>
---
drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c | 16 ++++++++++++----
drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c | 16 ++++++++++++----
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;
}


--
2.55.0