summaryrefslogtreecommitdiff
path: root/drivers/dma/tegra20-apb-dma.c
diff options
context:
space:
mode:
authorJon Hunter <jonathanh@nvidia.com>2015-11-13 19:39:43 +0300
committerVinod Koul <vinod.koul@intel.com>2015-12-05 13:43:08 +0300
commit05e866b42e65c2f68dea7fc7be4fcf534f4d8a12 (patch)
tree12250b2af697bd566725e4c14ae61b9d24c6fcc7 /drivers/dma/tegra20-apb-dma.c
parent8fe9739bc3ed616fb8cf935fb5099051493c2424 (diff)
downloadlinux-05e866b42e65c2f68dea7fc7be4fcf534f4d8a12.tar.xz
dmaengine: tegra-apb: Free interrupts before killing tasklets
On probe failure or driver removal, before killing any tasklets, ensure that the channel interrupt is freed to ensure that another channel interrupt cannot occur and schedule the tasklet again. Signed-off-by: Jon Hunter <jonathanh@nvidia.com> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Diffstat (limited to 'drivers/dma/tegra20-apb-dma.c')
-rw-r--r--drivers/dma/tegra20-apb-dma.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/dma/tegra20-apb-dma.c b/drivers/dma/tegra20-apb-dma.c
index 754c1f54d4fe..935da8192f59 100644
--- a/drivers/dma/tegra20-apb-dma.c
+++ b/drivers/dma/tegra20-apb-dma.c
@@ -1396,8 +1396,7 @@ static int tegra_dma_probe(struct platform_device *pdev)
}
tdc->irq = res->start;
snprintf(tdc->name, sizeof(tdc->name), "apbdma.%d", i);
- ret = devm_request_irq(&pdev->dev, tdc->irq,
- tegra_dma_isr, 0, tdc->name, tdc);
+ ret = request_irq(tdc->irq, tegra_dma_isr, 0, tdc->name, tdc);
if (ret) {
dev_err(&pdev->dev,
"request_irq failed with err %d channel %d\n",
@@ -1478,6 +1477,8 @@ err_unregister_dma_dev:
err_irq:
while (--i >= 0) {
struct tegra_dma_channel *tdc = &tdma->channels[i];
+
+ free_irq(tdc->irq, tdc);
tasklet_kill(&tdc->tasklet);
}
@@ -1497,6 +1498,7 @@ static int tegra_dma_remove(struct platform_device *pdev)
for (i = 0; i < tdma->chip_data->nr_channels; ++i) {
tdc = &tdma->channels[i];
+ free_irq(tdc->irq, tdc);
tasklet_kill(&tdc->tasklet);
}