diff options
-rw-r--r-- | drivers/dma/tegra20-apb-dma.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/dma/tegra20-apb-dma.c b/drivers/dma/tegra20-apb-dma.c index 1a47cc62bdf0..f6903f5242d0 100644 --- a/drivers/dma/tegra20-apb-dma.c +++ b/drivers/dma/tegra20-apb-dma.c @@ -669,12 +669,23 @@ static irqreturn_t tegra_dma_isr(int irq, void *dev_id) unsigned long status; unsigned long flags; struct tegra_dma_sg_req *sgreq; + int wcount; spin_lock_irqsave(&tdc->lock, flags); status = tdc_read(tdc, TEGRA_APBDMA_CHAN_STATUS); if (status & TEGRA_APBDMA_STATUS_ISE_EOC) { tdc_write(tdc, TEGRA_APBDMA_CHAN_STATUS, status); + + wcount = tdc_read(tdc, TEGRA_APBDMA_CHAN_WORD_TRANSFER); + + if (wcount != 0) + { + dev_dbg(tdc2dev(tdc), "Transfer not complete in ISR!\n"); + spin_unlock_irqrestore(&tdc->lock, flags); + return IRQ_HANDLED; + } + tdc->isr_handler(tdc, false); sgreq = list_first_entry(&tdc->pending_sg_req, typeof(*sgreq), |