dmaengine: stm32-dma: fix sleeping function called from invalid context
authorAmelie Delaunay <amelie.delaunay@st.com>
Wed, 29 Jan 2020 15:36:27 +0000 (16:36 +0100)
committerVinod Koul <vkoul@kernel.org>
Tue, 25 Feb 2020 05:45:05 +0000 (11:15 +0530)
commit409ffc4d990c157f876f105d06e11c1f21444cb7
tree97c70db56329ad0ff7d6bc176f909a953963c5d5
parent32ce108833a8424c686d9f82db231a6039290d41
dmaengine: stm32-dma: fix sleeping function called from invalid context

This patch fixes BUG: sleeping function called from invalid context in
stm32_dma_disable_chan function.

The goal of this function is to force channel disable if it has not been
disabled by hardware. This consists in clearing STM32_DMA_SCR_EN bit and
read it as 0 to ensure the channel is well disabled and the last transfer
is over.

In previous implementation, the waiting loop was based on a do...while (1)
with a call to cond_resched to give the scheduler a chance to run a higher
priority process.

But in some conditions, stm32_dma_disable_chan can be called while
preemption is disabled, on a stm32_dma_stop call for example. So
cond_resched must not be used.

To avoid this, use readl_relaxed_poll_timeout_atomic to poll
STM32_DMA_SCR_EN bit cleared.

Signed-off-by: Amelie Delaunay <amelie.delaunay@st.com>
Link: https://lore.kernel.org/r/20200129153628.29329-8-amelie.delaunay@st.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/stm32-dma.c