diff options
author | Robin Gong <yibin.gong@nxp.com> | 2017-06-27 10:05:05 +0800 |
---|---|---|
committer | Robin Gong <yibin.gong@nxp.com> | 2017-06-30 17:12:29 +0800 |
commit | 3026bea0bfb820858793cfec5fddbac089b598fa (patch) | |
tree | 9313eee48b80b2f12e2da16df8f4e43d23a81b25 /drivers | |
parent | 378e9e0975ca57edee37b82f5013aec0e86d2973 (diff) |
MLK-15034: dma: imx-sdma: no need report interrupt for channel0
It is possible for an irq triggered by channel0 to be received later,
after clks are disabled. If that happens then clearing them by writing
to SDMA_H_INTR won't work and the system will hang processing infinite
interrupts. Actually, don't need interrupt triggered on channel0 since
it's pollling to know channel0 done rather than interrupt in current
code, just clear BD setting to disable channel0 interrupt to avoid the
above case.
Reported-by: Leonard Crestez <leonard.crestez@nxp.com>
Signed-off-by: Robin Gong <yibin.gong@nxp.com>
(cherry picked from commit ed3bbe18323565b0c07f836fbf53401ffa887bf2)
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/dma/imx-sdma.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c index a8fc643155f9..fabdc94f95bb 100644 --- a/drivers/dma/imx-sdma.c +++ b/drivers/dma/imx-sdma.c @@ -699,7 +699,7 @@ static int sdma_load_script(struct sdma_engine *sdma, void *buf, int size, spin_lock_irqsave(&sdma->channel_0_lock, flags); bd0->mode.command = C0_SETPM; - bd0->mode.status = BD_DONE | BD_INTR | BD_WRAP | BD_EXTD; + bd0->mode.status = BD_DONE | BD_WRAP | BD_EXTD; bd0->mode.count = size / 2; bd0->buffer_addr = buf_phys; bd0->ext_buffer_addr = address; @@ -1007,7 +1007,7 @@ static int sdma_load_context(struct sdma_channel *sdmac) } bd0->mode.command = C0_SETDM; - bd0->mode.status = BD_DONE | BD_INTR | BD_WRAP | BD_EXTD; + bd0->mode.status = BD_DONE | BD_WRAP | BD_EXTD; bd0->mode.count = sizeof(*context) / 4; bd0->buffer_addr = sdma->context_phys; bd0->ext_buffer_addr = 2048 + (sizeof(*context) / 4) * channel; @@ -1034,7 +1034,7 @@ static int sdma_save_restore_context(struct sdma_engine *sdma, bool save) else bd0->mode.command = C0_SETDM; - bd0->mode.status = BD_DONE | BD_INTR | BD_WRAP | BD_EXTD; + bd0->mode.status = BD_DONE | BD_WRAP | BD_EXTD; bd0->mode.count = MAX_DMA_CHANNELS * sizeof(*context) / 4; bd0->buffer_addr = sdma->context_phys; bd0->ext_buffer_addr = 2048; |