dmaengine: edma: kill the tasklets upon exit
authorVinod Koul <vinod.koul@intel.com>
Fri, 1 Jul 2016 08:21:41 +0000 (13:51 +0530)
committerVinod Koul <vinod.koul@intel.com>
Sat, 16 Jul 2016 14:48:58 +0000 (20:18 +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: Peter Ujfalusi <peter.ujfalusi@ti.com>
drivers/dma/edma.c

index dffbd4bb0d8b94215bd0c0a336caffde5625812b..3d277fa76c1abb7397071ef58350a091e943ba4a 100644 (file)
@@ -2393,6 +2393,17 @@ err_reg1:
        return ret;
 }
 
+static void edma_cleanupp_vchan(struct dma_device *dmadev)
+{
+       struct edma_chan *echan, *_echan;
+
+       list_for_each_entry_safe(echan, _echan,
+                       &dmadev->channels, vchan.chan.device_node) {
+               list_del(&echan->vchan.chan.device_node);
+               tasklet_kill(&echan->vchan.task);
+       }
+}
+
 static int edma_remove(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
@@ -2401,6 +2412,8 @@ static int edma_remove(struct platform_device *pdev)
        devm_free_irq(dev, ecc->ccint, ecc);
        devm_free_irq(dev, ecc->ccerrint, ecc);
 
+       edma_cleanupp_vchan(&ecc->dma_slave);
+
        if (dev->of_node)
                of_dma_controller_free(dev->of_node);
        dma_async_device_unregister(&ecc->dma_slave);
This page took 0.028103 seconds and 5 git commands to generate.