diff options
author | Zhang Wei <wei.zhang@freescale.com> | 2008-03-13 20:45:28 -0400 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2008-03-13 13:57:09 -0400 |
commit | 9c98718e7371fa781043d5a2e70cecebec048091 (patch) | |
tree | 5b89ca3b3a1fc61e12371859f2318d3ec6ed013d /drivers/dma/fsldma.c | |
parent | 2187c269ad29510f1d65ec684133d1d3426d0eed (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.c | 2 |
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, |