]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 21 Jun 2024 12:40:35 +0000 (14:40 +0200)
commit 0340dc4c82590d8735c58cf904a8aa1173273ab5 upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/iio/common/inv_sensors/inv_sensors_timestamp.c

index 235e1029874341b573c6227d7902f606764d5104..adceb1b7a07ff43e8e52abae45483d870bebdcd9 100644 (file)
@@ -105,6 +105,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;
 
@@ -112,11 +115,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;