dmaengine: fsl-edma: kill the tasklets upon exit
authorVinod Koul <vinod.koul@intel.com>
Sat, 2 Jul 2016 09:28:30 +0000 (14:58 +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>
Cc: Jingchang Lu <b35083@freescale.com>
Cc: Peter Griffin <peter.griffin@linaro.org>
drivers/dma/fsl-edma.c

index d797a3cea88a1c3b9aebda29d9f5857749ab6681..6775f2c74e25b7269417bbe001adfb03698dea97 100644 (file)
@@ -995,12 +995,24 @@ static int fsl_edma_probe(struct platform_device *pdev)
        return 0;
 }
 
+static void fsl_edma_cleanup_vchan(struct dma_device *dmadev)
+{
+       struct fsl_edma_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 fsl_edma_remove(struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
        struct fsl_edma_engine *fsl_edma = platform_get_drvdata(pdev);
 
        fsl_edma_irq_exit(pdev, fsl_edma);
+       fsl_edma_cleanup_vchan(&fsl_edma->dma_dev);
        of_dma_controller_free(np);
        dma_async_device_unregister(&fsl_edma->dma_dev);
        fsl_disable_clocks(fsl_edma);