summaryrefslogtreecommitdiff
path: root/firmware/target/coldfire/pcm-coldfire.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/coldfire/pcm-coldfire.c')
-rw-r--r--firmware/target/coldfire/pcm-coldfire.c34
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 */
493void pcm_record_more(void *start, size_t size) 480void 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
504const void * pcm_rec_dma_get_peak_buffer(int *count) 487const 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