浏览代码

dmaengine: edma: 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: Peter Ujfalusi <peter.ujfalusi@ti.com>
Vinod Koul 9 年之前
父节点
当前提交
f4e0628ba3
共有 1 个文件被更改,包括 13 次插入0 次删除
  1. 13 0
      drivers/dma/edma.c

+ 13 - 0
drivers/dma/edma.c

@@ -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);