dmaengine: tegra-apb: Clean up tasklet releasing
There is no need to kill tasklet when driver's probe fails because tasklet can't be scheduled at this time. It is also cleaner to kill tasklet on channel's freeing rather than to kill it on driver's removal, otherwise tasklet could perform a dummy execution after channel's releasing, which isn't very nice. Signed-off-by: Dmitry Osipenko <digetx@gmail.com> Acked-by: Jon Hunter <jonathanh@nvidia.com> Link: https://lore.kernel.org/r/20200209163356.6439-6-digetx@gmail.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
8e84172e37
commit
41ffc423e1
@ -1291,7 +1291,6 @@ static void tegra_dma_free_chan_resources(struct dma_chan *dc)
|
||||
struct tegra_dma_sg_req *sg_req;
|
||||
struct list_head dma_desc_list;
|
||||
struct list_head sg_req_list;
|
||||
unsigned long flags;
|
||||
|
||||
INIT_LIST_HEAD(&dma_desc_list);
|
||||
INIT_LIST_HEAD(&sg_req_list);
|
||||
@ -1299,15 +1298,14 @@ static void tegra_dma_free_chan_resources(struct dma_chan *dc)
|
||||
dev_dbg(tdc2dev(tdc), "Freeing channel %d\n", tdc->id);
|
||||
|
||||
tegra_dma_terminate_all(dc);
|
||||
tasklet_kill(&tdc->tasklet);
|
||||
|
||||
spin_lock_irqsave(&tdc->lock, flags);
|
||||
list_splice_init(&tdc->pending_sg_req, &sg_req_list);
|
||||
list_splice_init(&tdc->free_sg_req, &sg_req_list);
|
||||
list_splice_init(&tdc->free_dma_desc, &dma_desc_list);
|
||||
INIT_LIST_HEAD(&tdc->cb_desc);
|
||||
tdc->config_init = false;
|
||||
tdc->isr_handler = NULL;
|
||||
spin_unlock_irqrestore(&tdc->lock, flags);
|
||||
|
||||
while (!list_empty(&dma_desc_list)) {
|
||||
dma_desc = list_first_entry(&dma_desc_list,
|
||||
@ -1546,7 +1544,6 @@ err_irq:
|
||||
struct tegra_dma_channel *tdc = &tdma->channels[i];
|
||||
|
||||
free_irq(tdc->irq, tdc);
|
||||
tasklet_kill(&tdc->tasklet);
|
||||
}
|
||||
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
@ -1566,7 +1563,6 @@ 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);
|
||||
}
|
||||
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
Loading…
Reference in New Issue
Block a user