summaryrefslogtreecommitdiff
path: root/firmware/target
diff options
context:
space:
mode:
authorRafaël Carré <rafael.carre@gmail.com>2010-05-26 17:32:50 +0000
committerRafaël Carré <rafael.carre@gmail.com>2010-05-26 17:32:50 +0000
commitc9133db4b1bd584146578589f8616a873553f66b (patch)
treee444590e501e659338c2880f04384438719395f4 /firmware/target
parentbc2f8bbc079b2b143c06739163ba229aedef90c9 (diff)
downloadrockbox-c9133db4b1bd584146578589f8616a873553f66b.tar.gz
rockbox-c9133db4b1bd584146578589f8616a873553f66b.zip
as3525: as revealed by r26311, it seems DMAC interrupt can't be masked
Even if we disable it in VIC_INT_EN_CLEAR, it still fires an interrupt by running the default isr. Locking requires disabling interrupts completely. I'm not sure if DMAC is the only interrupt affected or if we can't rely on VIC_INT_EN_CLEAR to mask interrupts. If it's the latter, we will need to have special locking scheme for INT_AUDIO. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26316 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target')
-rw-r--r--firmware/target/arm/as3525/pcm-as3525.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/firmware/target/arm/as3525/pcm-as3525.c b/firmware/target/arm/as3525/pcm-as3525.c
index 01d228f784..5a403bad83 100644
--- a/firmware/target/arm/as3525/pcm-as3525.c
+++ b/firmware/target/arm/as3525/pcm-as3525.c
@@ -40,18 +40,20 @@ static size_t dma_size; /* in 4*32 bits */
40static void dma_callback(void); 40static void dma_callback(void);
41static int locked = 0; 41static int locked = 0;
42 42
43static int play_irq_state;
44
43/* Mask the DMA interrupt */ 45/* Mask the DMA interrupt */
44void pcm_play_lock(void) 46void pcm_play_lock(void)
45{ 47{
46 if(++locked == 1) 48 if(++locked == 1)
47 VIC_INT_EN_CLEAR = INTERRUPT_DMAC; 49 play_irq_state = disable_irq_save();
48} 50}
49 51
50/* Unmask the DMA interrupt if enabled */ 52/* Unmask the DMA interrupt if enabled */
51void pcm_play_unlock(void) 53void pcm_play_unlock(void)
52{ 54{
53 if(--locked == 0) 55 if(--locked == 0)
54 VIC_INT_ENABLE = INTERRUPT_DMAC; 56 restore_irq(play_irq_state);
55} 57}
56 58
57static void play_start_pcm(void) 59static void play_start_pcm(void)
@@ -198,18 +200,19 @@ static void rec_dma_callback(void);
198static int16_t *mono_samples; 200static int16_t *mono_samples;
199#endif 201#endif
200 202
203static int rec_irq_state;
201 204
202void pcm_rec_lock(void) 205void pcm_rec_lock(void)
203{ 206{
204 if(++rec_locked == 1) 207 if(++rec_locked == 1)
205 VIC_INT_EN_CLEAR = INTERRUPT_DMAC; 208 rec_irq_state = disable_irq_save();
206} 209}
207 210
208 211
209void pcm_rec_unlock(void) 212void pcm_rec_unlock(void)
210{ 213{
211 if(--rec_locked == 0) 214 if(--rec_locked == 0)
212 VIC_INT_ENABLE = INTERRUPT_DMAC; 215 restore_irq(rec_irq_state);
213} 216}
214 217
215 218