• Olivier Moysan's avatar
    iio: adc: stm32-adc: fix a regression when using dma and irq · 695e2f5c
    Olivier Moysan authored
    Since overrun interrupt support has been added, there's a regression when
    two ADCs are used at the same time, 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. 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).
    
    This is a regression as similar issue had been fixed earlier by
    commit dcb10920 ("iio: adc: stm32-adc:
    fix a race when using several adcs with dma and irq").
    Issue is that stm32_adc_eoc_enabled() returns non-zero value (always)
    since OVR bit has been added and enabled for both DMA and IRQ case.
    
    Remove OVR mask in IER register, and rely only on CSR status for overrun.
    To avoid subsequent calls to interrupt routine on overrun, CSR OVR bit has
    to be cleared. CSR OVR bit cannot be cleared directly by software.
    To do this ADC must be stopped first, and OVR bit in ADC ISR has
    to be cleared.
    Also add a check in ADC IRQ handler to report spurious IRQs.
    
    Fixes: cc06e67d ("iio: adc: stm32-adc: Add check on overrun interrupt")
    Signed-off-by: default avatarOlivier Moysan <olivier.moysan@st.com>
    Signed-off-by: default avatarFabrice Gasnier <fabrice.gasnier@st.com>
    Cc: <Stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20201021085313.5335-1-olivier.moysan@st.comSigned-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
    695e2f5c
stm32-adc-core.c 21.9 KB