iio: inv_mpu6050: Make interrupt optional
authorLars-Peter Clausen <lars@metafoo.de>
Thu, 25 Mar 2021 13:10:46 +0000 (14:10 +0100)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Wed, 7 Apr 2021 07:36:35 +0000 (08:36 +0100)
The inv_mpu6050 driver requires an interrupt for buffered capture. But non
buffered reading for measurements works just fine without an interrupt
connected.

Make the interrupt optional to support this case.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: Jean-Baptiste Maneyrol <jmaneyrol@invensense.com>
Link: https://lore.kernel.org/r/20210325131046.13383-2-lars@metafoo.de
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c

index 99ee0a2..cda7b48 100644 (file)
@@ -1458,15 +1458,21 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
                st->plat_data = *pdata;
        }
 
-       desc = irq_get_irq_data(irq);
-       if (!desc) {
-               dev_err(dev, "Could not find IRQ %d\n", irq);
-               return -EINVAL;
-       }
+       if (irq > 0) {
+               desc = irq_get_irq_data(irq);
+               if (!desc) {
+                       dev_err(dev, "Could not find IRQ %d\n", irq);
+                       return -EINVAL;
+               }
 
-       irq_type = irqd_get_trigger_type(desc);
-       if (!irq_type)
+               irq_type = irqd_get_trigger_type(desc);
+               if (!irq_type)
+                       irq_type = IRQF_TRIGGER_RISING;
+       } else {
+               /* Doesn't really matter, use the default */
                irq_type = IRQF_TRIGGER_RISING;
+       }
+
        if (irq_type & IRQF_TRIGGER_RISING)     // rising or both-edge
                st->irq_mask = INV_MPU6050_ACTIVE_HIGH;
        else if (irq_type == IRQF_TRIGGER_FALLING)
@@ -1592,18 +1598,25 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
 
        indio_dev->info = &mpu_info;
 
-       result = devm_iio_triggered_buffer_setup(dev, indio_dev,
-                                                iio_pollfunc_store_time,
-                                                inv_mpu6050_read_fifo,
-                                                NULL);
-       if (result) {
-               dev_err(dev, "configure buffer fail %d\n", result);
-               return result;
-       }
-       result = inv_mpu6050_probe_trigger(indio_dev, irq_type);
-       if (result) {
-               dev_err(dev, "trigger probe fail %d\n", result);
-               return result;
+       if (irq > 0) {
+               /*
+                * The driver currently only supports buffered capture with its
+                * own trigger. So no IRQ, no trigger, no buffer
+                */
+               result = devm_iio_triggered_buffer_setup(dev, indio_dev,
+                                                        iio_pollfunc_store_time,
+                                                        inv_mpu6050_read_fifo,
+                                                        NULL);
+               if (result) {
+                       dev_err(dev, "configure buffer fail %d\n", result);
+                       return result;
+               }
+
+               result = inv_mpu6050_probe_trigger(indio_dev, irq_type);
+               if (result) {
+                       dev_err(dev, "trigger probe fail %d\n", result);
+                       return result;
+               }
        }
 
        result = devm_iio_device_register(dev, indio_dev);