From e97191faa7d685637c987dc91fc70a2cd64df57b Mon Sep 17 00:00:00 2001 From: Rafaël Carré Date: Thu, 4 Dec 2008 22:54:06 +0000 Subject: Sansa AMS: Disable DMA clocks when not in use Add dma_retain() and dma_release() to reference count the users git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19344 a1c6a512-1295-4272-9138-f99709370657 --- firmware/target/arm/as3525/dma-pl081.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'firmware/target/arm/as3525/dma-pl081.c') diff --git a/firmware/target/arm/as3525/dma-pl081.c b/firmware/target/arm/as3525/dma-pl081.c index 3de4e73c12..8ec2919714 100644 --- a/firmware/target/arm/as3525/dma-pl081.c +++ b/firmware/target/arm/as3525/dma-pl081.c @@ -26,6 +26,7 @@ #include "panic.h" #include "kernel.h" +static int dma_used = 0; static struct wakeup transfer_completion_signal[2]; /* 2 channels */ static void (*dma_callback[2])(void); /* 2 channels */ @@ -34,11 +35,26 @@ inline void dma_wait_transfer(int channel) wakeup_wait(&transfer_completion_signal[channel], TIMEOUT_BLOCK); } +void dma_retain(void) +{ + if(++dma_used == 1) + { + CGU_PERI |= CGU_DMA_CLOCK_ENABLE; + DMAC_CONFIGURATION |= (1<<0); + } +} + +void dma_release(void) +{ + if(--dma_used == 0) + { + DMAC_CONFIGURATION &= ~(1<<0); + CGU_PERI &= ~CGU_DMA_CLOCK_ENABLE; + } +} + void dma_init(void) { - /* Enable DMA controller */ - CGU_PERI |= CGU_DMA_CLOCK_ENABLE; - DMAC_CONFIGURATION |= (1<<0); /* TODO: disable controller when not used */ DMAC_SYNC = 0; VIC_INT_ENABLE |= INTERRUPT_DMAC; -- cgit v1.2.3