diff options
Diffstat (limited to 'target/linux/xburst/patches-3.10/013-MIPS-JZ4740-Acquire-and-enable-DMA-controller-clock.patch')
-rw-r--r-- | target/linux/xburst/patches-3.10/013-MIPS-JZ4740-Acquire-and-enable-DMA-controller-clock.patch | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/target/linux/xburst/patches-3.10/013-MIPS-JZ4740-Acquire-and-enable-DMA-controller-clock.patch b/target/linux/xburst/patches-3.10/013-MIPS-JZ4740-Acquire-and-enable-DMA-controller-clock.patch new file mode 100644 index 0000000..110f061 --- /dev/null +++ b/target/linux/xburst/patches-3.10/013-MIPS-JZ4740-Acquire-and-enable-DMA-controller-clock.patch @@ -0,0 +1,80 @@ +From b1ab71156cd49b2389397d3be54b93fe394a1cb2 Mon Sep 17 00:00:00 2001 +From: Maarten ter Huurne <maarten@treewalker.org> +Date: Tue, 9 Oct 2012 13:09:57 +0200 +Subject: [PATCH 13/16] MIPS: JZ4740: Acquire and enable DMA controller clock + +Previously, it was assumed that the DMA controller clock is not gated +when the kernel starts running. While that is the power-on state, it is +safer to not rely on that. + +Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> +--- + arch/mips/jz4740/clock.c | 2 +- + arch/mips/jz4740/dma.c | 24 ++++++++++++++++++++++-- + 2 files changed, 23 insertions(+), 3 deletions(-) + +diff --git a/arch/mips/jz4740/clock.c b/arch/mips/jz4740/clock.c +index 1b5f554..b3eba60 100644 +--- a/arch/mips/jz4740/clock.c ++++ b/arch/mips/jz4740/clock.c +@@ -921,4 +921,4 @@ static int jz4740_clock_init(void) + + return 0; + } +-arch_initcall(jz4740_clock_init); ++postcore_initcall(jz4740_clock_init); +diff --git a/arch/mips/jz4740/dma.c b/arch/mips/jz4740/dma.c +index 317ec6f..fb5266c 100644 +--- a/arch/mips/jz4740/dma.c ++++ b/arch/mips/jz4740/dma.c +@@ -16,6 +16,7 @@ + #include <linux/kernel.h> + #include <linux/module.h> + #include <linux/spinlock.h> ++#include <linux/clk.h> + #include <linux/interrupt.h> + + #include <linux/dma-mapping.h> +@@ -268,6 +269,7 @@ static irqreturn_t jz4740_dma_irq(int irq, void *dev_id) + + static int jz4740_dma_init(void) + { ++ struct clk *clk; + unsigned int ret; + + jz4740_dma_base = ioremap(JZ4740_DMAC_BASE_ADDR, 0x400); +@@ -277,11 +279,29 @@ static int jz4740_dma_init(void) + + spin_lock_init(&jz4740_dma_lock); + +- ret = request_irq(JZ4740_IRQ_DMAC, jz4740_dma_irq, 0, "DMA", NULL); ++ clk = clk_get(NULL, "dma"); ++ if (IS_ERR(clk)) { ++ ret = PTR_ERR(clk); ++ printk(KERN_ERR "JZ4740 DMA: Failed to request clock: %d\n", ++ ret); ++ goto err_iounmap; ++ } + +- if (ret) ++ ret = request_irq(JZ4740_IRQ_DMAC, jz4740_dma_irq, 0, "DMA", NULL); ++ if (ret) { + printk(KERN_ERR "JZ4740 DMA: Failed to request irq: %d\n", ret); ++ goto err_clkput; ++ } ++ ++ clk_enable(clk); ++ ++ return 0; ++ ++err_clkput: ++ clk_put(clk); + ++err_iounmap: ++ iounmap(jz4740_dma_base); + return ret; + } + arch_initcall(jz4740_dma_init); +-- +1.7.10.4 + |