iio: imu: inv_mpu6050: stabilized timestamping in interrupt
Subsystems (2)
PATCH 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
Jonathan Cameron
maintainerQuoted 6 lines · On Thu, 23 May 2024 13:52:45 +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 6 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.
Signed-off-by Jean-Baptiste Maneyrol <[email protected]>
Fixes tag appropriate?
Otherwise LGTM
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,
Jean-Baptiste Maneyrol
maintainerHi Jonathan,
I wasn't expecting first to do a Fixes tag, but you're right it would be better to backport this fix and it is quite small.
I will send a V2 with the appropriate Fixes tag.
Thanks,
JB
________________________________________
From: Jonathan Cameron <[email protected]>
Sent: Saturday, May 25, 2024 19:22
To: INV Git Commit <[email protected]>
Cc: [email protected] <[email protected]>; [email protected] <[email protected]>; Jean-Baptiste Maneyrol <[email protected]> Subject: Re: [PATCH] iio: imu: inv_mpu6050: stabilized timestamping in interrupt
This Message Is From an External Sender
This message came from outside your organization.
Quoted 6 lines · On Thu, 23 May 2024 13:52:45 +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 6 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.
Signed-off-by Jean-Baptiste Maneyrol <[email protected]>
Fixes tag appropriate?
Otherwise LGTM
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,