aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/dma/fsldma.c
diff options
context:
space:
mode:
authorZhang Wei <wei.zhang@freescale.com>2008-03-13 20:45:28 -0400
committerDan Williams <dan.j.williams@intel.com>2008-03-13 13:57:09 -0400
commit9c98718e7371fa781043d5a2e70cecebec048091 (patch)
tree5b89ca3b3a1fc61e12371859f2318d3ec6ed013d /drivers/dma/fsldma.c
parent2187c269ad29510f1d65ec684133d1d3426d0eed (diff)
fsldma: Add a completed cookie updated action in DMA finish interrupt.
The patch 'fsldma: do not cleanup descriptors in hardirq context' (commit 222ccf9ab838a1ca7163969fabd2cddc10403fb5) removed descriptors cleanup function to tasklet but the completed cookie do not updated. Thus, the DMA controller will get lots of duplicated transfer interrupts. Just make a completed cookie update in interrupt handler. And keep other cleanup jobs in tasklet function. Tested-by: Sebastian Siewior <bigeasy@linutronix.de> Signed-off-by: Zhang Wei <wei.zhang@freescale.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers/dma/fsldma.c')
-rw-r--r--drivers/dma/fsldma.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
index cbd5b9684521..ad2f938597e2 100644
--- a/drivers/dma/fsldma.c
+++ b/drivers/dma/fsldma.c
@@ -539,7 +539,6 @@ static void fsl_chan_ld_cleanup(struct fsl_dma_chan *fsl_chan)
539 539
540 spin_lock_irqsave(&fsl_chan->desc_lock, flags); 540 spin_lock_irqsave(&fsl_chan->desc_lock, flags);
541 541
542 fsl_dma_update_completed_cookie(fsl_chan);
543 dev_dbg(fsl_chan->dev, "chan completed_cookie = %d\n", 542 dev_dbg(fsl_chan->dev, "chan completed_cookie = %d\n",
544 fsl_chan->completed_cookie); 543 fsl_chan->completed_cookie);
545 list_for_each_entry_safe(desc, _desc, &fsl_chan->ld_queue, node) { 544 list_for_each_entry_safe(desc, _desc, &fsl_chan->ld_queue, node) {
@@ -710,6 +709,7 @@ static irqreturn_t fsl_dma_chan_do_interrupt(int irq, void *data)
710 dev_dbg(fsl_chan->dev, "event: clndar %p, nlndar %p\n", 709 dev_dbg(fsl_chan->dev, "event: clndar %p, nlndar %p\n",
711 (void *)get_cdar(fsl_chan), (void *)get_ndar(fsl_chan)); 710 (void *)get_cdar(fsl_chan), (void *)get_ndar(fsl_chan));
712 stat &= ~FSL_DMA_SR_EOSI; 711 stat &= ~FSL_DMA_SR_EOSI;
712 fsl_dma_update_completed_cookie(fsl_chan);
713 } 713 }
714 714
715 /* If it current transfer is the end-of-transfer, 715 /* If it current transfer is the end-of-transfer,