aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVinod Koul <vinod.koul@intel.com>2016-07-02 05:18:02 -0400
committerVinod Koul <vinod.koul@intel.com>2016-07-16 10:49:00 -0400
commitcec9cfa8d88c8b2ad0789e8441ff98c3f52b8142 (patch)
treed5f3cef5c52641b88934074b2ec14fb26748f494
parentf950f025364ad3ad4834cd1058737f272b2cc665 (diff)
dmaengine: jz4740: kill the tasklets upon exit
drivers should ensure that tasklets are killed, so that they can't be executed after driver remove is executed, so ensure they are killed. This driver used vchan tasklets, so those need to be killed. Signed-off-by: Vinod Koul <vinod.koul@intel.com> Acked-by: Lars-Peter Clausen <lars@metafoo.de>
-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