提交 05e866b4 编写于 作者: J Jon Hunter 提交者: Vinod Koul

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: NJon Hunter <jonathanh@nvidia.com>
Signed-off-by: NVinod Koul <vinod.koul@intel.com>
上级 8fe9739b
...@@ -1396,8 +1396,7 @@ static int tegra_dma_probe(struct platform_device *pdev) ...@@ -1396,8 +1396,7 @@ static int tegra_dma_probe(struct platform_device *pdev)
} }
tdc->irq = res->start; tdc->irq = res->start;
snprintf(tdc->name, sizeof(tdc->name), "apbdma.%d", i); snprintf(tdc->name, sizeof(tdc->name), "apbdma.%d", i);
ret = devm_request_irq(&pdev->dev, tdc->irq, ret = request_irq(tdc->irq, tegra_dma_isr, 0, tdc->name, tdc);
tegra_dma_isr, 0, tdc->name, tdc);
if (ret) { if (ret) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
"request_irq failed with err %d channel %d\n", "request_irq failed with err %d channel %d\n",
...@@ -1478,6 +1477,8 @@ static int tegra_dma_probe(struct platform_device *pdev) ...@@ -1478,6 +1477,8 @@ static int tegra_dma_probe(struct platform_device *pdev)
err_irq: err_irq:
while (--i >= 0) { while (--i >= 0) {
struct tegra_dma_channel *tdc = &tdma->channels[i]; struct tegra_dma_channel *tdc = &tdma->channels[i];
free_irq(tdc->irq, tdc);
tasklet_kill(&tdc->tasklet); tasklet_kill(&tdc->tasklet);
} }
...@@ -1497,6 +1498,7 @@ static int tegra_dma_remove(struct platform_device *pdev) ...@@ -1497,6 +1498,7 @@ static int tegra_dma_remove(struct platform_device *pdev)
for (i = 0; i < tdma->chip_data->nr_channels; ++i) { for (i = 0; i < tdma->chip_data->nr_channels; ++i) {
tdc = &tdma->channels[i]; tdc = &tdma->channels[i];
free_irq(tdc->irq, tdc);
tasklet_kill(&tdc->tasklet); tasklet_kill(&tdc->tasklet);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册