dmaengine: jz4740: kill the tasklets upon exit
authorVinod Koul <vinod.koul@intel.com>
Sat, 2 Jul 2016 09:18:02 +0000 (14:48 +0530)
committerVinod Koul <vinod.koul@intel.com>
Sat, 16 Jul 2016 14:49:00 +0000 (20:19 +0530)
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>
drivers/dma/dma-jz4740.c

index 7638b24ce8d0dac2672da6d4e83ce9956f054607..9689b36c005ac2bc6485acf9e2f7ef4269d2cb39 100644 (file)
@@ -573,12 +573,26 @@ err_unregister:
        return ret;
 }
 
+static void jz4740_cleanup_vchan(struct dma_device *dmadev)
+{
+       struct jz4740_dmaengine_chan *chan, *_chan;
+
+       list_for_each_entry_safe(chan, _chan,
+                               &dmadev->channels, vchan.chan.device_node) {
+               list_del(&chan->vchan.chan.device_node);
+               tasklet_kill(&chan->vchan.task);
+       }
+}
+
+
 static int jz4740_dma_remove(struct platform_device *pdev)
 {
        struct jz4740_dma_dev *dmadev = platform_get_drvdata(pdev);
        int irq = platform_get_irq(pdev, 0);
 
        free_irq(irq, dmadev);
+
+       jz4740_cleanup_vchan(&dmadev->ddev);
        dma_async_device_unregister(&dmadev->ddev);
        clk_disable_unprepare(dmadev->clk);