summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/dma/tegra20-apb-dma.c11
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),