iio: imu: inv_mpu6050: stabilized timestamping in interrupt
Subsystems (3)
PATCH v2 1/1 iio: imu: inv_mpu6050: stabilized timestamping in interrupt
From: Jean-Baptiste Maneyrol <[email protected]>
Use IRQ ONESHOT flag to ensure the timestamp is not updated in the hard handler during the thread handler. And use a fixed value of 1 sample that correspond to this first timestamp.
This way we can ensure the timestamp is always corresponding to the value used by the timestamping mechanism. Otherwise, it is possible that between FIFO count read and FIFO processing the timestamp is overwritten in the hard handler.
--- drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c | 4 ++-- drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c | 1 + 2 files changed, 3 insertions(+), 2 deletions(-)
drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c +2 -2
@@ -100,8 +100,8 @@ irqreturn_t inv_mpu6050_read_fifo(int irq, void *p) goto end_session;/* Each FIFO data contains all sensors, so same number for FIFO and sensor data */ fifo_period =NSEC_PER_SEC /INV_MPU6050_DIVIDER_TO_FIFO_RATE (st->chip_config.divider); -inv_sensors_timestamp_interrupt (&st->timestamp, nb, pf->timestamp); -inv_sensors_timestamp_apply_odr (&st->timestamp, fifo_period, nb,0 ); +inv_sensors_timestamp_interrupt (&st->timestamp,1 , pf->timestamp); +inv_sensors_timestamp_apply_odr (&st->timestamp, fifo_period,1 ,0 );/* clear internal data buffer for avoiding kernel data leak */ memset (data,0 ,sizeof (data));
drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c +1 -0
@@ -300,6 +300,7 @@ int inv_mpu6050_probe_trigger(struct iio_dev *indio_dev, int irq_type)if (!st->trig)return -ENOMEM ; + irq_type |=IRQF_ONESHOT ; ret = devm_request_threaded_irq(&indio_dev->dev, st->irq, &inv_mpu6050_interrupt_timestamp, &inv_mpu6050_interrupt_handle,
Signature · 1 line
2.34.1
Quoted 6 lines · On Mon, 27 May 2024 15:01:17 +0000 [email protected] wrote:
From: Jean-Baptiste Maneyrol <[email protected]>
Use IRQ ONESHOT flag to ensure the timestamp is not updated in the hard handler during the thread handler. And use a fixed value of 1 sample that correspond to this first timestamp.
Quoted 8 lines
This way we can ensure the timestamp is always corresponding to the value used by the timestamping mechanism. Otherwise, it is possible that between FIFO count read and FIFO processing the timestamp is overwritten in the hard handler.
Fixes 111e1abd0045 ("iio: imu: inv_mpu6050: use the common inv_sensors timestamp module")Signed-off-by Jean-Baptiste Maneyrol <[email protected]>
Applied
Quoted 32 lines
--- drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c | 4 ++-- drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c | 1 + 2 files changed, 3 insertions(+), 2 deletions(-)drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c +2
-2@@ -100,8 +100,8 @@ irqreturn_t inv_mpu6050_read_fifo(int irq, void *p) goto end_session;/* Each FIFO data contains all sensors, so same number for FIFO and sensor data */ fifo_period =NSEC_PER_SEC /INV_MPU6050_DIVIDER_TO_FIFO_RATE (st->chip_config.divider); -inv_sensors_timestamp_interrupt (&st->timestamp, nb, pf->timestamp); -inv_sensors_timestamp_apply_odr (&st->timestamp, fifo_period, nb,0 ); +inv_sensors_timestamp_interrupt (&st->timestamp,1 , pf->timestamp); +inv_sensors_timestamp_apply_odr (&st->timestamp, fifo_period,1 ,0 );/* clear internal data buffer for avoiding kernel data leak */ memset (data,0 ,sizeof (data));drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c +1
-0@@ -300,6 +300,7 @@ int inv_mpu6050_probe_trigger(struct iio_dev *indio_dev, int irq_type)if (!st->trig)return -ENOMEM ; + irq_type |=IRQF_ONESHOT ; ret = devm_request_threaded_irq(&indio_dev->dev, st->irq, &inv_mpu6050_interrupt_timestamp, &inv_mpu6050_interrupt_handle,