iio: invensense: fix interrupt timestamp alignment
authorJean-Baptiste Maneyrol <jean-baptiste.maneyrol@tdk.com>
Fri, 26 Apr 2024 13:58:14 +0000 (13:58 +0000)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Wed, 1 May 2024 07:26:36 +0000 (08:26 +0100)
Restrict interrupt timestamp alignment for not overflowing max/min
period thresholds.

Fixes: 0ecc363ccea7 ("iio: make invensense timestamp module generic")
Cc: stable@vger.kernel.org
Signed-off-by: Jean-Baptiste Maneyrol <jean-baptiste.maneyrol@tdk.com>
Link: https://lore.kernel.org/r/20240426135814.141837-1-inv.git-commit@tdk.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/common/inv_sensors/inv_sensors_timestamp.c

index 3b0f959..4b8ec16 100644 (file)
@@ -101,6 +101,9 @@ static bool inv_update_chip_period(struct inv_sensors_timestamp *ts,
 
 static void inv_align_timestamp_it(struct inv_sensors_timestamp *ts)
 {
+       const int64_t period_min = ts->min_period * ts->mult;
+       const int64_t period_max = ts->max_period * ts->mult;
+       int64_t add_max, sub_max;
        int64_t delta, jitter;
        int64_t adjust;
 
@@ -108,11 +111,13 @@ static void inv_align_timestamp_it(struct inv_sensors_timestamp *ts)
        delta = ts->it.lo - ts->timestamp;
 
        /* adjust timestamp while respecting jitter */
+       add_max = period_max - (int64_t)ts->period;
+       sub_max = period_min - (int64_t)ts->period;
        jitter = INV_SENSORS_TIMESTAMP_JITTER((int64_t)ts->period, ts->chip.jitter);
        if (delta > jitter)
-               adjust = jitter;
+               adjust = add_max;
        else if (delta < -jitter)
-               adjust = -jitter;
+               adjust = sub_max;
        else
                adjust = 0;