diff options
Diffstat (limited to 'firmware/target/coldfire')
-rw-r--r-- | firmware/target/coldfire/pcm-coldfire.c | 34 |
1 files changed, 3 insertions, 31 deletions
diff --git a/firmware/target/coldfire/pcm-coldfire.c b/firmware/target/coldfire/pcm-coldfire.c index 209d227187..f9c0764d64 100644 --- a/firmware/target/coldfire/pcm-coldfire.c +++ b/firmware/target/coldfire/pcm-coldfire.c | |||
@@ -235,12 +235,6 @@ void pcm_play_dma_start(const void *addr, size_t size) | |||
235 | /* Stop any DMA in progress */ | 235 | /* Stop any DMA in progress */ |
236 | pcm_play_dma_stop(); | 236 | pcm_play_dma_stop(); |
237 | 237 | ||
238 | addr = (void *)(((long)addr + 3) & ~3); | ||
239 | size &= ~3; | ||
240 | |||
241 | if (size <= 0) | ||
242 | return; | ||
243 | |||
244 | /* Set up DMA transfer */ | 238 | /* Set up DMA transfer */ |
245 | SAR0 = (unsigned long)addr; /* Source address */ | 239 | SAR0 = (unsigned long)addr; /* Source address */ |
246 | DAR0 = (unsigned long)&PDOR3; /* Destination address */ | 240 | DAR0 = (unsigned long)&PDOR3; /* Destination address */ |
@@ -382,12 +376,6 @@ void pcm_rec_dma_start(void *addr, size_t size) | |||
382 | /* stop any DMA in progress */ | 376 | /* stop any DMA in progress */ |
383 | pcm_rec_dma_stop(); | 377 | pcm_rec_dma_stop(); |
384 | 378 | ||
385 | addr = (void *)(((long)addr + 3) & ~3); | ||
386 | size &= ~3; | ||
387 | |||
388 | if (size <= 0) | ||
389 | return; | ||
390 | |||
391 | and_l(~PDIR2_FIFO_RESET, &DATAINCONTROL); | 379 | and_l(~PDIR2_FIFO_RESET, &DATAINCONTROL); |
392 | 380 | ||
393 | /* Start the DMA transfer.. */ | 381 | /* Start the DMA transfer.. */ |
@@ -396,7 +384,6 @@ void pcm_rec_dma_start(void *addr, size_t size) | |||
396 | INTERRUPTCLEAR = (1 << 25) | (1 << 24) | (1 << 23) | (1 << 22); | 384 | INTERRUPTCLEAR = (1 << 25) | (1 << 24) | (1 << 23) | (1 << 22); |
397 | #endif | 385 | #endif |
398 | 386 | ||
399 | pcm_rec_peak_addr = (unsigned long *)addr; /* Start peaking at dest */ | ||
400 | SAR1 = (unsigned long)&PDIR2; /* Source address */ | 387 | SAR1 = (unsigned long)&PDIR2; /* Source address */ |
401 | DAR1 = (unsigned long)addr; /* Destination address */ | 388 | DAR1 = (unsigned long)addr; /* Destination address */ |
402 | BCR1 = (unsigned long)size; /* Bytes to transfer */ | 389 | BCR1 = (unsigned long)size; /* Bytes to transfer */ |
@@ -490,30 +477,15 @@ void DMA1(void) | |||
490 | } /* DMA1 */ | 477 | } /* DMA1 */ |
491 | 478 | ||
492 | /* Continue transferring data in - call from interrupt callback */ | 479 | /* Continue transferring data in - call from interrupt callback */ |
493 | void pcm_record_more(void *start, size_t size) | 480 | void pcm_rec_dma_record_more(void *start, size_t size) |
494 | { | 481 | { |
495 | start = (void *)(((long)start + 3) & ~3); | ||
496 | size &= ~3; | ||
497 | |||
498 | pcm_rec_peak_addr = (unsigned long *)start; /* Start peaking at dest */ | ||
499 | DAR1 = (unsigned long)start; /* Destination address */ | 482 | DAR1 = (unsigned long)start; /* Destination address */ |
500 | BCR1 = (unsigned long)size; /* Bytes to transfer */ | 483 | BCR1 = (unsigned long)size; /* Bytes to transfer */ |
501 | or_l(DMA_EEXT | DMA_INT, &DCR1); /* per request and int ON */ | 484 | or_l(DMA_EEXT | DMA_INT, &DCR1); /* per request and int ON */ |
502 | } /* pcm_record_more */ | 485 | } /* pcm_record_more */ |
503 | 486 | ||
504 | const void * pcm_rec_dma_get_peak_buffer(int *count) | 487 | const void * pcm_rec_dma_get_peak_buffer(void) |
505 | { | 488 | { |
506 | unsigned long addr, end; | 489 | return (void *)(DAR1 & ~3); |
507 | |||
508 | /* Make sure interrupt doesn't change the second value after we read the | ||
509 | * first value. */ | ||
510 | int level = set_irq_level(DMA_IRQ_LEVEL); | ||
511 | addr = (unsigned long)pcm_rec_peak_addr; | ||
512 | end = DAR1; | ||
513 | restore_irq(level); | ||
514 | |||
515 | addr >>= 2; | ||
516 | *count = (end >> 2) - addr; | ||
517 | return (void *)(addr << 2); | ||
518 | } /* pcm_rec_dma_get_peak_buffer */ | 490 | } /* pcm_rec_dma_get_peak_buffer */ |
519 | #endif | 491 | #endif |