summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorShengjiu Wang <shengjiu.wang@freescale.com>2015-07-13 19:19:15 +0800
committerNitin Garg <nitin.garg@nxp.com>2016-01-14 10:59:36 -0600
commit4e8b440936e93bcfc1b77faefb6531299eddaa7c (patch)
tree883b28cda7906e9078137b4f506d9a32830c2740 /include
parentad3c7dd77667c695f847ebde940804665af6c234 (diff)
MLK-11248: dmaengine: imx-sdma: add new api for sync with dma and substream
There is occasion that dma callback come late after the substream is released. Then there will be kernel dump. [<805866b0>] (imx_pcm_dma_complete) from [<802fad9c>] (sdma_handle_channel_loop.isra.25+0x48/0x54) [<802fad9c>] (sdma_handle_channel_loop.isra.25) from [<802fae48>] (sdma_tasklet+0xa0/0x1d4) [<802fae48>] (sdma_tasklet) from [<800356e0>] (tasklet_action+0x64/0xf8) [<800356e0>] (tasklet_action) from [<80034ea0>] (__do_softirq+0x104/0x218) [<80034ea0>] (__do_softirq) from [<80035220>] (irq_exit+0xa8/0xec) [<80035220>] (irq_exit) from [<8000ed44>] (handle_IRQ+0x3c/0x90) [<8000ed44>] (handle_IRQ) from [<80008578>] (gic_handle_irq+0x28/0x5c) [<80008578>] (gic_handle_irq) from [<80012100>] (__irq_svc+0x40/0x70) The reason is the sdma tasklet is async with audio substream release. ALSA think when terminate dma, the dma should be stopped and no callback be called. This patch is to add new api dma_sync_wait_tasklet(), which is called in snd_dmaengine_pcm_close(). It will make sure the callback not be called after this funtion. Tasklet_kill is to wait scheduled tasklet end. Tasklet_kill can't be added to terminate dma function, because terminate dma function may be called in interrupt, but tasklet_kill can't be called in interrupt context. Signed-off-by: Shengjiu Wang <shengjiu.wang@freescale.com> (cherry picked from commit 9815881b6acaa72a705e1fa3c26a852fc81bfce5)
Diffstat (limited to 'include')
-rw-r--r--include/linux/dmaengine.h3
1 files changed, 3 insertions, 0 deletions
diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h
index ad419757241f..7e8fa40110d9 100644
--- a/include/linux/dmaengine.h
+++ b/include/linux/dmaengine.h
@@ -676,6 +676,7 @@ struct dma_device {
int (*device_resume)(struct dma_chan *chan);
int (*device_terminate_all)(struct dma_chan *chan);
+ enum dma_status (*device_wait_tasklet)(struct dma_chan *chan);
enum dma_status (*device_tx_status)(struct dma_chan *chan,
dma_cookie_t cookie,
struct dma_tx_state *txstate);
@@ -1026,6 +1027,8 @@ dma_set_tx_state(struct dma_tx_state *st, dma_cookie_t last, dma_cookie_t used,
}
}
+enum dma_status dma_sync_wait_tasklet(struct dma_chan *chan);
+
#ifdef CONFIG_DMA_ENGINE
struct dma_chan *dma_find_channel(enum dma_transaction_type tx_type);
enum dma_status dma_sync_wait(struct dma_chan *chan, dma_cookie_t cookie);