summaryrefslogtreecommitdiffstats
path: root/drivers/dma/stm32-dma.c
diff options
context:
space:
mode:
authorPierre-Yves MORDRET <pierre-yves.mordret@st.com>2019-01-03 05:17:29 -0500
committerVinod Koul <vkoul@kernel.org>2019-01-06 23:22:24 -0500
commitca4c72c01e349ff6313ced02e8e66f8e691530a9 (patch)
tree03417789b0fb71b41e7ca9cf2d0321dac386a7ed /drivers/dma/stm32-dma.c
parent906b40b246b0acb54c4dc97e815cf734761c9820 (diff)
dmaengine: stm32-dma: check FIFO error interrupt enable
For avoiding false FIFO detection, check FIFO Error interrupt is enabled prior raising any errors. This will prevent having spurious FIFO error where it shouldn't. Signed-off-by: Pierre-Yves MORDRET <pierre-yves.mordret@st.com> Signed-off-by: Vinod Koul <vkoul@kernel.org>
Diffstat (limited to 'drivers/dma/stm32-dma.c')
-rw-r--r--drivers/dma/stm32-dma.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/dma/stm32-dma.c b/drivers/dma/stm32-dma.c
index 4903a408fc14..48f7c0fc1af9 100644
--- a/drivers/dma/stm32-dma.c
+++ b/drivers/dma/stm32-dma.c
@@ -641,12 +641,13 @@ static irqreturn_t stm32_dma_chan_irq(int irq, void *devid)
641{ 641{
642 struct stm32_dma_chan *chan = devid; 642 struct stm32_dma_chan *chan = devid;
643 struct stm32_dma_device *dmadev = stm32_dma_get_dev(chan); 643 struct stm32_dma_device *dmadev = stm32_dma_get_dev(chan);
644 u32 status, scr; 644 u32 status, scr, sfcr;
645 645
646 spin_lock(&chan->vchan.lock); 646 spin_lock(&chan->vchan.lock);
647 647
648 status = stm32_dma_irq_status(chan); 648 status = stm32_dma_irq_status(chan);
649 scr = stm32_dma_read(dmadev, STM32_DMA_SCR(chan->id)); 649 scr = stm32_dma_read(dmadev, STM32_DMA_SCR(chan->id));
650 sfcr = stm32_dma_read(dmadev, STM32_DMA_SFCR(chan->id));
650 651
651 if (status & STM32_DMA_TCI) { 652 if (status & STM32_DMA_TCI) {
652 stm32_dma_irq_clear(chan, STM32_DMA_TCI); 653 stm32_dma_irq_clear(chan, STM32_DMA_TCI);
@@ -661,10 +662,12 @@ static irqreturn_t stm32_dma_chan_irq(int irq, void *devid)
661 if (status & STM32_DMA_FEI) { 662 if (status & STM32_DMA_FEI) {
662 stm32_dma_irq_clear(chan, STM32_DMA_FEI); 663 stm32_dma_irq_clear(chan, STM32_DMA_FEI);
663 status &= ~STM32_DMA_FEI; 664 status &= ~STM32_DMA_FEI;
664 if (!(scr & STM32_DMA_SCR_EN)) 665 if (sfcr & STM32_DMA_SFCR_FEIE) {
665 dev_err(chan2dev(chan), "FIFO Error\n"); 666 if (!(scr & STM32_DMA_SCR_EN))
666 else 667 dev_err(chan2dev(chan), "FIFO Error\n");
667 dev_dbg(chan2dev(chan), "FIFO over/underrun\n"); 668 else
669 dev_dbg(chan2dev(chan), "FIFO over/underrun\n");
670 }
668 } 671 }
669 if (status) { 672 if (status) {
670 stm32_dma_irq_clear(chan, status); 673 stm32_dma_irq_clear(chan, status);