]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iio: adc: ad7768-1: disable IRQ autoenable
authorJonathan Santos <Jonathan.Santos@analog.com>
Mon, 23 Feb 2026 11:59:44 +0000 (08:59 -0300)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 1 Mar 2026 12:07:11 +0000 (12:07 +0000)
The device continuously converts data while powered up, generating
interrupts in the background. Configure the IRQ to be enabled and
disabled manually as needed to avoid unnecessary CPU load.

Signed-off-by: Jonathan Santos <Jonathan.Santos@analog.com>
Reviewed-by: David Lechner <dlechner@baylibre.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/ad7768-1.c

index a927ae288fbb828f81649c505d6518867a755c8c..b77523393a18310a01395835495bbc077b8cf57a 100644 (file)
@@ -464,9 +464,11 @@ static int ad7768_scan_direct(struct iio_dev *indio_dev)
        int readval, ret;
 
        reinit_completion(&st->completion);
+       enable_irq(st->spi->irq);
 
        ret = wait_for_completion_timeout(&st->completion,
                                          msecs_to_jiffies(1000));
+       disable_irq(st->spi->irq);
        if (!ret)
                return -ETIMEDOUT;
 
@@ -1339,8 +1341,22 @@ static const struct iio_buffer_setup_ops ad7768_buffer_ops = {
        .predisable = &ad7768_buffer_predisable,
 };
 
+static int ad7768_set_trigger_state(struct iio_trigger *trig, bool enable)
+{
+       struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
+       struct ad7768_state *st = iio_priv(indio_dev);
+
+       if (enable)
+               enable_irq(st->spi->irq);
+       else
+               disable_irq(st->spi->irq);
+
+       return 0;
+}
+
 static const struct iio_trigger_ops ad7768_trigger_ops = {
        .validate_device = iio_trigger_validate_own_device,
+       .set_trigger_state = ad7768_set_trigger_state,
 };
 
 static int ad7768_set_channel_label(struct iio_dev *indio_dev,
@@ -1704,7 +1720,7 @@ static int ad7768_probe(struct spi_device *spi)
                return ret;
 
        ret = devm_request_irq(&spi->dev, spi->irq, &ad7768_interrupt,
-                              IRQF_TRIGGER_RISING | IRQF_NO_THREAD,
+                              IRQF_TRIGGER_RISING | IRQF_NO_THREAD | IRQF_NO_AUTOEN,
                               indio_dev->name, indio_dev);
        if (ret)
                return ret;