summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorRobin Gong <yibin.gong@nxp.com>2017-06-27 10:05:05 +0800
committerRobin Gong <yibin.gong@nxp.com>2017-06-30 17:12:29 +0800
commit3026bea0bfb820858793cfec5fddbac089b598fa (patch)
tree9313eee48b80b2f12e2da16df8f4e43d23a81b25 /drivers
parent378e9e0975ca57edee37b82f5013aec0e86d2973 (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.c6
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;