On 29/05/2019 22:43, Dmitry Osipenko wrote: > 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@xxxxxxxxx> > --- > drivers/dma/tegra20-apb-dma.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/drivers/dma/tegra20-apb-dma.c b/drivers/dma/tegra20-apb-dma.c > index cf462b1abc0b..2c84a660ba36 100644 > --- a/drivers/dma/tegra20-apb-dma.c > +++ b/drivers/dma/tegra20-apb-dma.c > @@ -988,8 +988,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; > > @@ -1131,8 +1135,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; Looks good to me. Acked-by: Jon Hunter <jonathanh@xxxxxxxxxx> Cheers Jon -- nvpublic