diff options
Diffstat (limited to 'firmware/target/arm/s3c2440/mini2440/pcm-mini2440.c')
-rw-r--r-- | firmware/target/arm/s3c2440/mini2440/pcm-mini2440.c | 34 |
1 files changed, 13 insertions, 21 deletions
diff --git a/firmware/target/arm/s3c2440/mini2440/pcm-mini2440.c b/firmware/target/arm/s3c2440/mini2440/pcm-mini2440.c index 486a235614..30db29c42c 100644 --- a/firmware/target/arm/s3c2440/mini2440/pcm-mini2440.c +++ b/firmware/target/arm/s3c2440/mini2440/pcm-mini2440.c | |||
@@ -254,35 +254,27 @@ void pcm_play_dma_pause(bool pause) | |||
254 | 254 | ||
255 | void fiq_handler(void) | 255 | void fiq_handler(void) |
256 | { | 256 | { |
257 | static unsigned char *start; | 257 | static void *start; |
258 | static size_t size; | 258 | static size_t size; |
259 | register pcm_more_callback_type get_more; /* No stack for this */ | ||
260 | 259 | ||
261 | /* clear any pending interrupt */ | 260 | /* clear any pending interrupt */ |
262 | SRCPND = DMA2_MASK; | 261 | SRCPND = DMA2_MASK; |
263 | 262 | ||
264 | /* Buffer empty. Try to get more. */ | 263 | /* Buffer empty. Try to get more. */ |
265 | get_more = pcm_callback_for_more; | 264 | pcm_play_get_more_callback(&start, &size); |
266 | size = 0; | ||
267 | 265 | ||
268 | if (get_more == NULL || (get_more(&start, &size), size == 0)) | 266 | if (size == 0) |
269 | { | 267 | return; |
270 | /* Callback missing or no more DMA to do */ | ||
271 | pcm_play_dma_stop(); | ||
272 | pcm_play_dma_stopped_callback(); | ||
273 | } | ||
274 | else | ||
275 | { | ||
276 | /* Flush any pending cache writes */ | ||
277 | clean_dcache_range(start, size); | ||
278 | 268 | ||
279 | /* set the new DMA values */ | 269 | /* Flush any pending cache writes */ |
280 | DCON2 = DMA_CONTROL_SETUP | (size >> 1); | 270 | clean_dcache_range(start, size); |
281 | DISRC2 = (unsigned int)start + 0x30000000; | ||
282 | 271 | ||
283 | /* Re-Activate the channel */ | 272 | /* set the new DMA values */ |
284 | DMASKTRIG2 = 0x2; | 273 | DCON2 = DMA_CONTROL_SETUP | (size >> 1); |
285 | } | 274 | DISRC2 = (unsigned int)start + 0x30000000; |
275 | |||
276 | /* Re-Activate the channel */ | ||
277 | DMASKTRIG2 = 0x2; | ||
286 | } | 278 | } |
287 | 279 | ||
288 | size_t pcm_get_bytes_waiting(void) | 280 | size_t pcm_get_bytes_waiting(void) |