iio:imu:adis: Use IRQF_NO_AUTOEN instead of irq request then disable
authorJonathan Cameron <Jonathan.Cameron@huawei.com>
Fri, 2 Apr 2021 18:45:43 +0000 (19:45 +0100)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Wed, 7 Apr 2021 07:36:39 +0000 (08:36 +0100)
This is a bit involved as the adis library code already has some
sanity checking of the flags of the requested irq that we need
to ensure is happy to pass through the IRQF_NO_AUTOEN flag untouched.

Using this flag avoids us autoenabling the irq in the adis16460 and
adis16475 drivers which cover parts that don't have any means of
masking the interrupt on the device end.

Note, compile tested only!

Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Cc: Alexandru Ardelean <ardeleanalex@gmail.com>
Reviewed-by: Nuno Sa <nuno.sa@analog.com>
Reviewed-by: Barry Song <song.bao.hua@hisilicon.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Reviewed-by: Lars-Peter Clausen <lars@metafoo.de>
Link: https://lore.kernel.org/r/20210402184544.488862-7-jic23@kernel.org
drivers/iio/imu/adis16460.c
drivers/iio/imu/adis16475.c
drivers/iio/imu/adis_trigger.c

index 74a161e3973323ae408e0c20fdbe23bb8187c9ab..73bf45e859b848ad4f543b010eafe44b4590e2b4 100644 (file)
@@ -403,12 +403,12 @@ static int adis16460_probe(struct spi_device *spi)
        if (ret)
                return ret;
 
+       /* We cannot mask the interrupt, so ensure it isn't auto enabled */
+       st->adis.irq_flag |= IRQF_NO_AUTOEN;
        ret = devm_adis_setup_buffer_and_trigger(&st->adis, indio_dev, NULL);
        if (ret)
                return ret;
 
-       adis16460_enable_irq(&st->adis, 0);
-
        ret = __adis_initial_startup(&st->adis);
        if (ret)
                return ret;
index 8f6bea4b6608cacf19c3200974668aa59af05d57..1de62fc79e0fc4a2d224821eed08d9bc5d9615f9 100644 (file)
@@ -1258,6 +1258,9 @@ static int adis16475_config_irq_pin(struct adis16475 *st)
                return -EINVAL;
        }
 
+       /* We cannot mask the interrupt so ensure it's not enabled at request */
+       st->adis.irq_flag |= IRQF_NO_AUTOEN;
+
        val = ADIS16475_MSG_CTRL_DR_POL(polarity);
        ret = __adis_update_bits(&st->adis, ADIS16475_REG_MSG_CTRL,
                                 ADIS16475_MSG_CTRL_DR_POL_MASK, val);
@@ -1362,8 +1365,6 @@ static int adis16475_probe(struct spi_device *spi)
        if (ret)
                return ret;
 
-       adis16475_enable_irq(&st->adis, false);
-
        ret = devm_iio_device_register(&spi->dev, indio_dev);
        if (ret)
                return ret;
index 0f29e56200af30e4047420787e94d3f84928aa4e..fa5540fabaccdc67b562f39e39cd601f338c0bde 100644 (file)
@@ -29,18 +29,19 @@ static const struct iio_trigger_ops adis_trigger_ops = {
 
 static int adis_validate_irq_flag(struct adis *adis)
 {
+       unsigned long direction = adis->irq_flag & IRQF_TRIGGER_MASK;
        /*
         * Typically this devices have data ready either on the rising edge or
         * on the falling edge of the data ready pin. This checks enforces that
         * one of those is set in the drivers... It defaults to
-        * IRQF_TRIGGER_RISING for backward compatibility wiht devices that
+        * IRQF_TRIGGER_RISING for backward compatibility with devices that
         * don't support changing the pin polarity.
         */
-       if (!adis->irq_flag) {
-               adis->irq_flag = IRQF_TRIGGER_RISING;
+       if (direction == IRQF_TRIGGER_NONE) {
+               adis->irq_flag |= IRQF_TRIGGER_RISING;
                return 0;
-       } else if (adis->irq_flag != IRQF_TRIGGER_RISING &&
-                  adis->irq_flag != IRQF_TRIGGER_FALLING) {
+       } else if (direction != IRQF_TRIGGER_RISING &&
+                  direction != IRQF_TRIGGER_FALLING) {
                dev_err(&adis->spi->dev, "Invalid IRQ mask: %08lx\n",
                        adis->irq_flag);
                return -EINVAL;