diff options
author | Eric Miao <eric.miao@marvell.com> | 2009-01-21 11:29:19 +0800 |
---|---|---|
committer | Eric Miao <eric.miao@marvell.com> | 2009-01-21 11:29:19 +0800 |
commit | 26a552264bc92d2ec4747b1babb7cb1264908018 (patch) | |
tree | 8eeec2279f53274757517c504736fed3bbd6c140 | |
parent | b6729deb26a131083add5b7238c7b7478ef6b502 (diff) | |
download | linux-3.10-26a552264bc92d2ec4747b1babb7cb1264908018.tar.gz linux-3.10-26a552264bc92d2ec4747b1babb7cb1264908018.tar.bz2 linux-3.10-26a552264bc92d2ec4747b1babb7cb1264908018.zip |
[ARM] pxa: stop and disable IRQ for each DMA channels at startup
Some broken bootloaders will leave the DMA channel state unclean, which
we should really initialize correctly here.
Signed-off-by: Eric Miao <eric.miao@marvell.com>
-rw-r--r-- | arch/arm/mach-pxa/dma.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/arch/arm/mach-pxa/dma.c b/arch/arm/mach-pxa/dma.c index b1514fb20d3..7de17fc5d54 100644 --- a/arch/arm/mach-pxa/dma.c +++ b/arch/arm/mach-pxa/dma.c @@ -121,20 +121,22 @@ int __init pxa_init_dma(int num_ch) if (dma_channels == NULL) return -ENOMEM; - ret = request_irq(IRQ_DMA, dma_irq_handler, IRQF_DISABLED, "DMA", NULL); - if (ret) { - printk (KERN_CRIT "Wow! Can't register IRQ for DMA\n"); - kfree(dma_channels); - return ret; - } - /* dma channel priorities on pxa2xx processors: * ch 0 - 3, 16 - 19 <--> (0) DMA_PRIO_HIGH * ch 4 - 7, 20 - 23 <--> (1) DMA_PRIO_MEDIUM * ch 8 - 15, 24 - 31 <--> (2) DMA_PRIO_LOW */ - for (i = 0; i < num_ch; i++) + for (i = 0; i < num_ch; i++) { + DCSR(i) = 0; dma_channels[i].prio = min((i & 0xf) >> 2, DMA_PRIO_LOW); + } + + ret = request_irq(IRQ_DMA, dma_irq_handler, IRQF_DISABLED, "DMA", NULL); + if (ret) { + printk (KERN_CRIT "Wow! Can't register IRQ for DMA\n"); + kfree(dma_channels); + return ret; + } num_dma_channels = num_ch; return 0; |