| From bc1b45326223e7e890053cf6266357adfa61942d Mon Sep 17 00:00:00 2001 |
| From: Eugen Hristev <eugen.hristev@microchip.com> |
| Date: Mon, 24 Sep 2018 10:51:43 +0300 |
| Subject: iio: adc: at91: fix acking DRDY irq on simple conversions |
| |
| From: Eugen Hristev <eugen.hristev@microchip.com> |
| |
| commit bc1b45326223e7e890053cf6266357adfa61942d upstream. |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/iio/adc/at91_adc.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/drivers/iio/adc/at91_adc.c |
| +++ b/drivers/iio/adc/at91_adc.c |
| @@ -278,6 +278,8 @@ static void handle_adc_eoc_trigger(int i |
| 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); |
| } |