aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/dma/dma-jz4740.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/dma/dma-jz4740.c b/drivers/dma/dma-jz4740.c
index 7638b24ce8d0..9689b36c005a 100644
--- a/drivers/dma/dma-jz4740.c
+++ b/drivers/dma/dma-jz4740.c
@@ -573,12 +573,26 @@ err_unregister:
573 return ret; 573 return ret;
574} 574}
575 575
576static void jz4740_cleanup_vchan(struct dma_device *dmadev)
577{
578 struct jz4740_dmaengine_chan *chan, *_chan;
579
580 list_for_each_entry_safe(chan, _chan,
581 &dmadev->channels, vchan.chan.device_node) {
582 list_del(&chan->vchan.chan.device_node);
583 tasklet_kill(&chan->vchan.task);
584 }
585}
586
587
576static int jz4740_dma_remove(struct platform_device *pdev) 588static int jz4740_dma_remove(struct platform_device *pdev)
577{ 589{
578 struct jz4740_dma_dev *dmadev = platform_get_drvdata(pdev); 590 struct jz4740_dma_dev *dmadev = platform_get_drvdata(pdev);
579 int irq = platform_get_irq(pdev, 0); 591 int irq = platform_get_irq(pdev, 0);
580 592
581 free_irq(irq, dmadev); 593 free_irq(irq, dmadev);
594
595 jz4740_cleanup_vchan(&dmadev->ddev);
582 dma_async_device_unregister(&dmadev->ddev); 596 dma_async_device_unregister(&dmadev->ddev);
583 clk_disable_unprepare(dmadev->clk); 597 clk_disable_unprepare(dmadev->clk);
584 598