iio: adc: at91: fix acking DRDY irq on simple conversions
authorEugen Hristev <eugen.hristev@microchip.com>
Mon, 24 Sep 2018 07:51:43 +0000 (10:51 +0300)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 29 Sep 2018 11:30:19 +0000 (12:30 +0100)
When doing simple conversions, the driver did not acknowledge the DRDY irq.
If this irq status is not acked, it will be left pending, and as soon as a
trigger is enabled, the irq handler will be called, it doesn't know why
this status has occurred because no channel is pending, and then it will go
int a irq loop and board will hang.
To avoid this situation, read the LCDR after a raw conversion is done.

Fixes: 0e589d5fb ("ARM: AT91: IIO: Add AT91 ADC driver.")
Cc: Maxime Ripard <maxime.ripard@bootlin.com>
Signed-off-by: Eugen Hristev <eugen.hristev@microchip.com>
Acked-by: Ludovic Desroches <ludovic.desroches@microchip.com>
Cc: <Stable@vger.kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/at91_adc.c

index 44b516863c9d4d220f3323ca580d98fbb6f8e772..e3be88e7192c25a178c4b5759fd15cbe42b106c6 100644 (file)
@@ -279,6 +279,8 @@ static void handle_adc_eoc_trigger(int irq, struct iio_dev *idev)
                iio_trigger_poll(idev->trig);
        } else {
                st->last_value = at91_adc_readl(st, AT91_ADC_CHAN(st, st->chnb));
+               /* Needed to ACK the DRDY interruption */
+               at91_adc_readl(st, AT91_ADC_LCDR);
                st->done = true;
                wake_up_interruptible(&st->wq_data_avail);
        }