diff options
author | Rafaël Carré <rafael.carre@gmail.com> | 2008-12-04 22:54:06 +0000 |
---|---|---|
committer | Rafaël Carré <rafael.carre@gmail.com> | 2008-12-04 22:54:06 +0000 |
commit | e97191faa7d685637c987dc91fc70a2cd64df57b (patch) | |
tree | f94f694a466ba9e859dbe1fe5564238a7f3d7216 /firmware/target/arm/as3525/dma-pl081.c | |
parent | 3e4f3fe70e8ed404ea07c12e4fe9f5a25e55b16d (diff) | |
download | rockbox-e97191faa7d685637c987dc91fc70a2cd64df57b.tar.gz rockbox-e97191faa7d685637c987dc91fc70a2cd64df57b.zip |
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
Diffstat (limited to 'firmware/target/arm/as3525/dma-pl081.c')
-rw-r--r-- | firmware/target/arm/as3525/dma-pl081.c | 22 |
1 files changed, 19 insertions, 3 deletions
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 @@ | |||
26 | #include "panic.h" | 26 | #include "panic.h" |
27 | #include "kernel.h" | 27 | #include "kernel.h" |
28 | 28 | ||
29 | static int dma_used = 0; | ||
29 | static struct wakeup transfer_completion_signal[2]; /* 2 channels */ | 30 | static struct wakeup transfer_completion_signal[2]; /* 2 channels */ |
30 | static void (*dma_callback[2])(void); /* 2 channels */ | 31 | static void (*dma_callback[2])(void); /* 2 channels */ |
31 | 32 | ||
@@ -34,11 +35,26 @@ inline void dma_wait_transfer(int channel) | |||
34 | wakeup_wait(&transfer_completion_signal[channel], TIMEOUT_BLOCK); | 35 | wakeup_wait(&transfer_completion_signal[channel], TIMEOUT_BLOCK); |
35 | } | 36 | } |
36 | 37 | ||
38 | void dma_retain(void) | ||
39 | { | ||
40 | if(++dma_used == 1) | ||
41 | { | ||
42 | CGU_PERI |= CGU_DMA_CLOCK_ENABLE; | ||
43 | DMAC_CONFIGURATION |= (1<<0); | ||
44 | } | ||
45 | } | ||
46 | |||
47 | void dma_release(void) | ||
48 | { | ||
49 | if(--dma_used == 0) | ||
50 | { | ||
51 | DMAC_CONFIGURATION &= ~(1<<0); | ||
52 | CGU_PERI &= ~CGU_DMA_CLOCK_ENABLE; | ||
53 | } | ||
54 | } | ||
55 | |||
37 | void dma_init(void) | 56 | void dma_init(void) |
38 | { | 57 | { |
39 | /* Enable DMA controller */ | ||
40 | CGU_PERI |= CGU_DMA_CLOCK_ENABLE; | ||
41 | DMAC_CONFIGURATION |= (1<<0); /* TODO: disable controller when not used */ | ||
42 | DMAC_SYNC = 0; | 58 | DMAC_SYNC = 0; |
43 | VIC_INT_ENABLE |= INTERRUPT_DMAC; | 59 | VIC_INT_ENABLE |= INTERRUPT_DMAC; |
44 | 60 | ||