aboutsummaryrefslogtreecommitdiff
path: root/drivers/dma/imx-sdma.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/dma/imx-sdma.c')
-rw-r--r--drivers/dma/imx-sdma.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c
index c3d135afe66..248469b051b 100644
--- a/drivers/dma/imx-sdma.c
+++ b/drivers/dma/imx-sdma.c
@@ -403,6 +403,7 @@ static int sdma_run_channel(struct sdma_channel *sdmac)
init_completion(&sdmac->done);
+ wmb();
__raw_writel(1 << channel, sdma->regs + SDMA_H_START);
ret = wait_for_completion_timeout(&sdmac->done, HZ);
@@ -713,11 +714,11 @@ static int sdma_config_channel(struct sdma_channel *sdmac)
sdmac->shp_addr = 0;
sdmac->per_addr = 0;
- if (sdmac->event_id0) {
- if (sdmac->event_id0 > 32)
- return -EINVAL;
+ if (sdmac->event_id0)
sdma_event_enable(sdmac, sdmac->event_id0);
- }
+
+ if (sdmac->event_id1)
+ sdma_event_enable(sdmac, sdmac->event_id1);
switch (sdmac->peripheral_type) {
case IMX_DMATYPE_DSP:
@@ -739,10 +740,10 @@ static int sdma_config_channel(struct sdma_channel *sdmac)
if (sdmac->event_id1) {
sdmac->event_mask1 = 1 << (sdmac->event_id1 % 32);
if (sdmac->event_id1 > 31)
- sdmac->watermark_level |= 1 << 31;
+ sdmac->watermark_level |= 1 << 29;
sdmac->event_mask0 = 1 << (sdmac->event_id0 % 32);
if (sdmac->event_id0 > 31)
- sdmac->watermark_level |= 1 << 30;
+ sdmac->watermark_level |= 1 << 28;
} else {
sdmac->event_mask0 = 1 << sdmac->event_id0;
sdmac->event_mask1 = 1 << (sdmac->event_id0 - 32);
@@ -809,6 +810,7 @@ out:
static void sdma_enable_channel(struct sdma_engine *sdma, int channel)
{
+ wmb();
__raw_writel(1 << channel, sdma->regs + SDMA_H_START);
}