summaryrefslogtreecommitdiff
path: root/drivers/dma
diff options
context:
space:
mode:
authorVinod Koul <vinod.koul@intel.com>2016-07-01 11:21:41 +0300
committerVinod Koul <vinod.koul@intel.com>2016-07-16 17:48:58 +0300
commitf4e0628ba37aa4bf2989f912c1f63e3ad1a46704 (patch)
treecfc39b7296e3862597b1032ef328bd8d3bf4b93b /drivers/dma
parent638001e0e01470e44da01a6e4dc4ab3e0f49d4ad (diff)
downloadlinux-f4e0628ba37aa4bf2989f912c1f63e3ad1a46704.tar.xz
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>
Diffstat (limited to 'drivers/dma')
-rw-r--r--drivers/dma/edma.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/dma/edma.c b/drivers/dma/edma.c
index dffbd4bb0d8b..3d277fa76c1a 100644
--- a/drivers/dma/edma.c
+++ b/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);