]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
dmaengine: tegra-apb: Error out if DMA_PREP_INTERRUPT flag is unset
authorDmitry Osipenko <digetx@gmail.com>
Wed, 29 May 2019 21:43:55 +0000 (00:43 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 6 Aug 2019 17:08:04 +0000 (19:08 +0200)
[ Upstream commit dc161064beb83c668e0f85766b92b1e7ed186e58 ]

Apparently driver was never tested with DMA_PREP_INTERRUPT flag being
unset since it completely disables interrupt handling instead of skipping
the callbacks invocations, hence putting channel into unusable state.

The flag is always set by all of kernel drivers that use APB DMA, so let's
error out in otherwise case for consistency. It won't be difficult to
support that case properly if ever will be needed.

Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
Acked-by: Jon Hunter <jonathanh@nvidia.com>
Signed-off-by: Vinod Koul <vkoul@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/dma/tegra20-apb-dma.c

index ef317c90fbe1ed813845a3788dad3e5a1d5ae96f..79e9593815f1217eb5d1887ba144c856834f51a6 100644 (file)
@@ -977,8 +977,12 @@ static struct dma_async_tx_descriptor *tegra_dma_prep_slave_sg(
                csr |= tdc->slave_id << TEGRA_APBDMA_CSR_REQ_SEL_SHIFT;
        }
 
-       if (flags & DMA_PREP_INTERRUPT)
+       if (flags & DMA_PREP_INTERRUPT) {
                csr |= TEGRA_APBDMA_CSR_IE_EOC;
+       } else {
+               WARN_ON_ONCE(1);
+               return NULL;
+       }
 
        apb_seq |= TEGRA_APBDMA_APBSEQ_WRAP_WORD_1;
 
@@ -1120,8 +1124,12 @@ static struct dma_async_tx_descriptor *tegra_dma_prep_dma_cyclic(
                csr |= tdc->slave_id << TEGRA_APBDMA_CSR_REQ_SEL_SHIFT;
        }
 
-       if (flags & DMA_PREP_INTERRUPT)
+       if (flags & DMA_PREP_INTERRUPT) {
                csr |= TEGRA_APBDMA_CSR_IE_EOC;
+       } else {
+               WARN_ON_ONCE(1);
+               return NULL;
+       }
 
        apb_seq |= TEGRA_APBDMA_APBSEQ_WRAP_WORD_1;