]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iio: imu: inv_icm42600: fix timestamping by limiting FIFO reading
authorJean-Baptiste Maneyrol <jean-baptiste.maneyrol@tdk.com>
Mon, 29 Jun 2026 19:51:55 +0000 (21:51 +0200)
committerJonathan Cameron <jic23@kernel.org>
Sat, 4 Jul 2026 23:01:48 +0000 (00:01 +0100)
Timestamps are made by measuring the chip clock using the watermark
interrupts. If we read more than watermark samples as done today, we
are reducing the period between interrupts and distort the time
measurement. Fix that by reading only watermark samples in the
interrupt case.

Fixes: 7f85e42a6c54 ("iio: imu: inv_icm42600: add buffer support in iio devices")
Cc: stable@vger.kernel.org
Signed-off-by: Jean-Baptiste Maneyrol <jean-baptiste.maneyrol@tdk.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.c
drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.h

index 68a395758031884792781d6eee748d273a86a22e..5c3840acf085799ce9f723ac26c22468584fec08 100644 (file)
@@ -248,6 +248,7 @@ int inv_icm42600_buffer_update_watermark(struct inv_icm42600_state *st)
 
        /* compute watermark value in bytes */
        wm_size = watermark * packet_size;
+       st->fifo.watermark.value = watermark;
 
        /* changing FIFO watermark requires to turn off watermark interrupt */
        ret = regmap_update_bits_check(st->map, INV_ICM42600_REG_INT_SOURCE0,
@@ -454,11 +455,10 @@ int inv_icm42600_buffer_fifo_read(struct inv_icm42600_state *st,
        st->fifo.nb.accel = 0;
        st->fifo.nb.total = 0;
 
-       /* compute maximum FIFO read size */
+       /* compute maximum FIFO read size (watermark for max = 0 interrupt case) */
        if (max == 0)
-               max_count = sizeof(st->fifo.data);
-       else
-               max_count = max * inv_icm42600_get_packet_size(st->fifo.en);
+               max = st->fifo.watermark.value;
+       max_count = max * inv_icm42600_get_packet_size(st->fifo.en);
 
        /* read FIFO count value */
        raw_fifo_count = (__be16 *)st->buffer;
@@ -574,6 +574,7 @@ int inv_icm42600_buffer_init(struct inv_icm42600_state *st)
 
        st->fifo.watermark.eff_gyro = 1;
        st->fifo.watermark.eff_accel = 1;
+       st->fifo.watermark.value = 1;
 
        /*
         * Default FIFO configuration (bits 7 to 5)
index ffca4da1e249364c75fff12bdba68c8429420129..88b8b9f780af3bd16c2833973225f83a7bb16b44 100644 (file)
@@ -34,6 +34,7 @@ struct inv_icm42600_fifo {
                unsigned int accel;
                unsigned int eff_gyro;
                unsigned int eff_accel;
+               unsigned int value;
        } watermark;
        size_t count;
        struct {