Message ID | 20240814143735.327302-1-inv.git-commit@tdk.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | iio: imu: inv_mpu6050: fix interrupt status read for old buggy chips | expand |
14.08.24 5:37 пп, inv.git-commit@tdk.com: > From: Jean-Baptiste Maneyrol <jean-baptiste.maneyrol@tdk.com> > > Interrupt status read seems to be broken on some old MPU-6050 like > chips. Fix by reverting to previous driver behavior bypassing interrupt > status read. This is working because these chips are not supporting > WoM and data ready is the only interrupt source. > > Fixes: 5537f653d9be ("iio: imu: inv_mpu6050: add new interrupt handler for WoM events") > Cc: stable@vger.kernel.org > Signed-off-by: Jean-Baptiste Maneyrol <jean-baptiste.maneyrol@tdk.com> Tested-by: Andreas Westman Dorcsak <hedmoo@yahoo.com> # LG P880 Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # LG P895 > --- > drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c | 13 +++++++++++-- > 1 file changed, 11 insertions(+), 2 deletions(-) > > diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c > index 84273660ca2e..3bfeabab0ec4 100644 > --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c > +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c > @@ -248,12 +248,20 @@ static irqreturn_t inv_mpu6050_interrupt_handle(int irq, void *p) > int result; > > switch (st->chip_type) { > + case INV_MPU6000: > case INV_MPU6050: > + case INV_MPU9150: > + /* > + * WoM is not supported and interrupt status read seems to be broken for > + * some chips. Since data ready is the only interrupt, bypass interrupt > + * status read and always assert data ready bit. > + */ > + wom_bits = 0; > + int_status = INV_MPU6050_BIT_RAW_DATA_RDY_INT; > + goto data_ready_interrupt; > case INV_MPU6500: > case INV_MPU6515: > case INV_MPU6880: > - case INV_MPU6000: > - case INV_MPU9150: > case INV_MPU9250: > case INV_MPU9255: > wom_bits = INV_MPU6500_BIT_WOM_INT; > @@ -279,6 +287,7 @@ static irqreturn_t inv_mpu6050_interrupt_handle(int irq, void *p) > } > } > > +data_ready_interrupt: > /* handle raw data interrupt */ > if (int_status & INV_MPU6050_BIT_RAW_DATA_RDY_INT) { > indio_dev->pollfunc->timestamp = st->it_timestamp; > -- > 2.34.1 >
On Wed, 14 Aug 2024 18:50:43 +0300 Svyatoslav Ryhel <clamor95@gmail.com> wrote: > 14.08.24 5:37 пп, inv.git-commit@tdk.com: > > From: Jean-Baptiste Maneyrol <jean-baptiste.maneyrol@tdk.com> > > > > Interrupt status read seems to be broken on some old MPU-6050 like > > chips. Fix by reverting to previous driver behavior bypassing interrupt > > status read. This is working because these chips are not supporting > > WoM and data ready is the only interrupt source. > > > > Fixes: 5537f653d9be ("iio: imu: inv_mpu6050: add new interrupt handler for WoM events") > > Cc: stable@vger.kernel.org > > Signed-off-by: Jean-Baptiste Maneyrol <jean-baptiste.maneyrol@tdk.com> > Tested-by: Andreas Westman Dorcsak <hedmoo@yahoo.com> # LG P880 > > Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # LG P895 Applied to the fixes-togreg branch of iio.git. Thanks, Jonathan > > > --- > > drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c | 13 +++++++++++-- > > 1 file changed, 11 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c > > index 84273660ca2e..3bfeabab0ec4 100644 > > --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c > > +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c > > @@ -248,12 +248,20 @@ static irqreturn_t inv_mpu6050_interrupt_handle(int irq, void *p) > > int result; > > > > switch (st->chip_type) { > > + case INV_MPU6000: > > case INV_MPU6050: > > + case INV_MPU9150: > > + /* > > + * WoM is not supported and interrupt status read seems to be broken for > > + * some chips. Since data ready is the only interrupt, bypass interrupt > > + * status read and always assert data ready bit. > > + */ > > + wom_bits = 0; > > + int_status = INV_MPU6050_BIT_RAW_DATA_RDY_INT; > > + goto data_ready_interrupt; > > case INV_MPU6500: > > case INV_MPU6515: > > case INV_MPU6880: > > - case INV_MPU6000: > > - case INV_MPU9150: > > case INV_MPU9250: > > case INV_MPU9255: > > wom_bits = INV_MPU6500_BIT_WOM_INT; > > @@ -279,6 +287,7 @@ static irqreturn_t inv_mpu6050_interrupt_handle(int irq, void *p) > > } > > } > > > > +data_ready_interrupt: > > /* handle raw data interrupt */ > > if (int_status & INV_MPU6050_BIT_RAW_DATA_RDY_INT) { > > indio_dev->pollfunc->timestamp = st->it_timestamp; > > -- > > 2.34.1 > >
diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c index 84273660ca2e..3bfeabab0ec4 100644 --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c @@ -248,12 +248,20 @@ static irqreturn_t inv_mpu6050_interrupt_handle(int irq, void *p) int result; switch (st->chip_type) { + case INV_MPU6000: case INV_MPU6050: + case INV_MPU9150: + /* + * WoM is not supported and interrupt status read seems to be broken for + * some chips. Since data ready is the only interrupt, bypass interrupt + * status read and always assert data ready bit. + */ + wom_bits = 0; + int_status = INV_MPU6050_BIT_RAW_DATA_RDY_INT; + goto data_ready_interrupt; case INV_MPU6500: case INV_MPU6515: case INV_MPU6880: - case INV_MPU6000: - case INV_MPU9150: case INV_MPU9250: case INV_MPU9255: wom_bits = INV_MPU6500_BIT_WOM_INT; @@ -279,6 +287,7 @@ static irqreturn_t inv_mpu6050_interrupt_handle(int irq, void *p) } } +data_ready_interrupt: /* handle raw data interrupt */ if (int_status & INV_MPU6050_BIT_RAW_DATA_RDY_INT) { indio_dev->pollfunc->timestamp = st->it_timestamp;