summaryrefslogtreecommitdiff
path: root/firmware/target/coldfire/pcm-coldfire.c
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2010-05-12 14:05:36 +0000
committerMichael Sevakis <jethead71@rockbox.org>2010-05-12 14:05:36 +0000
commit4d04132c76700b30708bf99fc0ef664e8bb0b58d (patch)
tree4a32974c7d75d93477413fa3fe8cd152709e3d8c /firmware/target/coldfire/pcm-coldfire.c
parentf2df42ee91ee61f793dac4844255cb4ec9049621 (diff)
downloadrockbox-4d04132c76700b30708bf99fc0ef664e8bb0b58d.tar.gz
rockbox-4d04132c76700b30708bf99fc0ef664e8bb0b58d.zip
PCM bottom layer simplification. pcm_rec_peak_addr variable no longer has to be handled there. Driver can just return current pointer for recording peaks. A new define, HAVE_PCM_REC_DMA_ADDRESS, specifies that physical addresses are being used for recording and translation is needed before starting a new block. The drivers need not worry about aligning start and size nor should care if either will be zero. All this will be checked in the logical layer first.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25970 a1c6a512-1295-4272-9138-f99709370657
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