dmaengine: tegra-apb: Implement synchronization hook
authorDmitry Osipenko <digetx@gmail.com>
Sun, 9 Feb 2020 16:33:40 +0000 (19:33 +0300)
committerVinod Koul <vkoul@kernel.org>
Tue, 25 Feb 2020 06:27:32 +0000 (11:57 +0530)
The ISR tasklet could be kept scheduled after DMA transfer termination,
let's add synchronization hook which blocks until tasklet is finished.

Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
Acked-by: Jon Hunter <jonathanh@nvidia.com>
Link: https://lore.kernel.org/r/20200209163356.6439-4-digetx@gmail.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/tegra20-apb-dma.c

index 3a45079..b18cbfb 100644 (file)
@@ -802,6 +802,13 @@ skip_dma_stop:
        return 0;
 }
 
+static void tegra_dma_synchronize(struct dma_chan *dc)
+{
+       struct tegra_dma_channel *tdc = to_tegra_dma_chan(dc);
+
+       tasklet_kill(&tdc->tasklet);
+}
+
 static unsigned int tegra_dma_sg_bytes_xferred(struct tegra_dma_channel *tdc,
                                               struct tegra_dma_sg_req *sg_req)
 {
@@ -1510,6 +1517,7 @@ static int tegra_dma_probe(struct platform_device *pdev)
        tdma->dma_dev.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST;
        tdma->dma_dev.device_config = tegra_dma_slave_config;
        tdma->dma_dev.device_terminate_all = tegra_dma_terminate_all;
+       tdma->dma_dev.device_synchronize = tegra_dma_synchronize;
        tdma->dma_dev.device_tx_status = tegra_dma_tx_status;
        tdma->dma_dev.device_issue_pending = tegra_dma_issue_pending;