diff mbox series

iio: imu/mpu6050: support dual-edge IRQ

Message ID e03daea84ce5fe5e79311a07fee4636c2a884a8e.1578156240.git.mirq-linux@rere.qmqm.pl (mailing list archive)
State New, archived
Headers show
Series iio: imu/mpu6050: support dual-edge IRQ | expand

Commit Message

Michał Mirosław Jan. 4, 2020, 4:44 p.m. UTC
Make mpu6050 usable on platforms which provide only any-edge interrupts.

Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
---
 drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 3 ++-
 drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h  | 1 +
 drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c | 6 ++++--
 3 files changed, 7 insertions(+), 3 deletions(-)

Comments

Jean-Baptiste Maneyrol Jan. 6, 2020, 9:42 a.m. UTC | #1
Hello Michal,

interesting, thanks a lot.

It would be far better to simply delete the warning log for spurious interrupt. I was thinking that it would only be triggered by a real bug somewhere. I wasn't thinking about systems with any-edge trigger like yours.

So just delete the warn message and no need to add the irq_ignore_spurious logic and variable.

Thanks,
JB

From: linux-iio-owner@vger.kernel.org <linux-iio-owner@vger.kernel.org> on behalf of Michał Mirosław <mirq-linux@rere.qmqm.pl>

Sent: Saturday, January 4, 2020 17:44

To: Jonathan Cameron <jic23@kernel.org>; Hartmut Knaack <knaack.h@gmx.de>; Lars-Peter Clausen <lars@metafoo.de>; Peter Meerwald-Stadler <pmeerw@pmeerw.net>

Cc: linux-iio@vger.kernel.org <linux-iio@vger.kernel.org>; linux-kernel@vger.kernel.org <linux-kernel@vger.kernel.org>

Subject: [PATCH] iio: imu/mpu6050: support dual-edge IRQ

 


 CAUTION: This email originated from outside of the organization. Please make sure the sender is who they say they are and do not click links or open attachments unless you recognize the sender and know the content is safe.



Make mpu6050 usable on platforms which provide only any-edge interrupts.



Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>

---

 drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 3 ++-

 drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h  | 1 +

 drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c | 6 ++++--

 3 files changed, 7 insertions(+), 3 deletions(-)



diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c

index 0686e41bb8a1..36b6a3922d15 100644

--- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c

+++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c

@@ -1239,9 +1239,10 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,

         }

 

         irq_type = irqd_get_trigger_type(desc);

+       st->irq_ignore_spurious = irq_type == (IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING);

         if (!irq_type)

                 irq_type = IRQF_TRIGGER_RISING;

-       if (irq_type == IRQF_TRIGGER_RISING)

+       if (irq_type == IRQF_TRIGGER_RISING || st->irq_ignore_spurious)

                 st->irq_mask = INV_MPU6050_ACTIVE_HIGH;

         else if (irq_type == IRQF_TRIGGER_FALLING)

                 st->irq_mask = INV_MPU6050_ACTIVE_LOW;

diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h

index b096e010d4ee..94ee7b18b198 100644

--- a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h

+++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h

@@ -158,6 +158,7 @@ struct inv_mpu6050_state {

         struct regmap *map;

         int irq;

         u8 irq_mask;

+       u8 irq_ignore_spurious;

         unsigned skip_samples;

         s64 chip_period;

         s64 it_timestamp;

diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c

index 10d16ec5104b..52f02de3d9b0 100644

--- a/drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c

+++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c

@@ -184,8 +184,10 @@ irqreturn_t inv_mpu6050_read_fifo(int irq, void *p)

                 goto flush_fifo;

         }

         if (!(int_status & INV_MPU6050_BIT_RAW_DATA_RDY_INT)) {

-               dev_warn(regmap_get_device(st->map),

-                       "spurious interrupt with status 0x%x\n", int_status);

+               if (!st->irq_ignore_spurious)

+                       dev_warn(regmap_get_device(st->map),

+                                "spurious interrupt with status 0x%x\n",

+                                int_status);

                 goto end_session;

         }
diff mbox series

Patch

diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
index 0686e41bb8a1..36b6a3922d15 100644
--- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
+++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c
@@ -1239,9 +1239,10 @@  int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
 	}
 
 	irq_type = irqd_get_trigger_type(desc);
+	st->irq_ignore_spurious = irq_type == (IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING);
 	if (!irq_type)
 		irq_type = IRQF_TRIGGER_RISING;
-	if (irq_type == IRQF_TRIGGER_RISING)
+	if (irq_type == IRQF_TRIGGER_RISING || st->irq_ignore_spurious)
 		st->irq_mask = INV_MPU6050_ACTIVE_HIGH;
 	else if (irq_type == IRQF_TRIGGER_FALLING)
 		st->irq_mask = INV_MPU6050_ACTIVE_LOW;
diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h
index b096e010d4ee..94ee7b18b198 100644
--- a/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h
+++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h
@@ -158,6 +158,7 @@  struct inv_mpu6050_state {
 	struct regmap *map;
 	int irq;
 	u8 irq_mask;
+	u8 irq_ignore_spurious;
 	unsigned skip_samples;
 	s64 chip_period;
 	s64 it_timestamp;
diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c
index 10d16ec5104b..52f02de3d9b0 100644
--- a/drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c
+++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_ring.c
@@ -184,8 +184,10 @@  irqreturn_t inv_mpu6050_read_fifo(int irq, void *p)
 		goto flush_fifo;
 	}
 	if (!(int_status & INV_MPU6050_BIT_RAW_DATA_RDY_INT)) {
-		dev_warn(regmap_get_device(st->map),
-			"spurious interrupt with status 0x%x\n", int_status);
+		if (!st->irq_ignore_spurious)
+			dev_warn(regmap_get_device(st->map),
+				 "spurious interrupt with status 0x%x\n",
+				 int_status);
 		goto end_session;
 	}