OSDN Git Service

iio: adc: stm32-adc: fix a race when using several adcs with dma and irq
authorFabrice Gasnier <fabrice.gasnier@st.com>
Tue, 17 Sep 2019 12:38:16 +0000 (14:38 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Wed, 9 Oct 2019 18:11:26 +0000 (19:11 +0100)
commitdcb10920179ab74caf88a6f2afadecfc2743b910
treeadae8a51062c3dbea4d81bf84ba1395b279323a1
parent31922f62bb527d749b99dbc776e514bcba29b7fe
iio: adc: stm32-adc: fix a race when using several adcs with dma and irq

End of conversion may be handled by using IRQ or DMA. There may be a
race when two conversions complete at the same time on several ADCs.
EOC can be read as 'set' for several ADCs, with:
- an ADC configured to use IRQs. EOCIE bit is set. The handler is normally
  called in this case.
- an ADC configured to use DMA. EOCIE bit isn't set. EOC triggers the DMA
  request instead. It's then automatically cleared by DMA read. But the
  handler gets called due to status bit is temporarily set (IRQ triggered
  by the other ADC).
So both EOC status bit in CSR and EOCIE control bit must be checked
before invoking the interrupt handler (e.g. call ISR only for
IRQ-enabled ADCs).

Fixes: 2763ea0585c9 ("iio: adc: stm32: add optional dma support")

Signed-off-by: Fabrice Gasnier <fabrice.gasnier@st.com>
Cc: <Stable@vger.kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/stm32-adc-core.c
drivers/iio/adc/stm32-adc-core.h