summaryrefslogtreecommitdiff
path: root/firmware/target/arm
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm')
-rw-r--r--firmware/target/arm/as3525/pcm-as3525.c13
-rw-r--r--firmware/target/arm/imx31/gigabeat-s/pcm-gigabeat-s.c27
-rw-r--r--firmware/target/arm/pcm-pp.c22
-rw-r--r--firmware/target/arm/pcm-telechips.c7
-rw-r--r--firmware/target/arm/s5l8700/pcm-s5l8700.c6
5 files changed, 17 insertions, 58 deletions
diff --git a/firmware/target/arm/as3525/pcm-as3525.c b/firmware/target/arm/as3525/pcm-as3525.c
index 53a3f0c9a3..4d78899398 100644
--- a/firmware/target/arm/as3525/pcm-as3525.c
+++ b/firmware/target/arm/as3525/pcm-as3525.c
@@ -202,7 +202,7 @@ void pcm_rec_unlock(void)
202} 202}
203 203
204 204
205void pcm_record_more(void *start, size_t size) 205void pcm_rec_dma_record_more(void *start, size_t size)
206{ 206{
207 rec_start_addr = start; 207 rec_start_addr = start;
208 rec_size = size; 208 rec_size = size;
@@ -331,16 +331,9 @@ void pcm_rec_dma_init(void)
331} 331}
332 332
333 333
334const void * pcm_rec_dma_get_peak_buffer(int *count) 334const void * pcm_rec_dma_get_peak_buffer(void)
335{ 335{
336 const void *peak_buffer; 336 return (const void*)rec_start_addr;
337
338 pcm_rec_lock();
339 *count = rec_size >> 2;
340 peak_buffer = (const void*)rec_start_addr;
341 pcm_rec_unlock();
342
343 return peak_buffer;
344} 337}
345 338
346#endif /* HAVE_RECORDING */ 339#endif /* HAVE_RECORDING */
diff --git a/firmware/target/arm/imx31/gigabeat-s/pcm-gigabeat-s.c b/firmware/target/arm/imx31/gigabeat-s/pcm-gigabeat-s.c
index c0651caf51..02051fad90 100644
--- a/firmware/target/arm/imx31/gigabeat-s/pcm-gigabeat-s.c
+++ b/firmware/target/arm/imx31/gigabeat-s/pcm-gigabeat-s.c
@@ -432,17 +432,13 @@ void pcm_rec_unlock(void)
432 } 432 }
433} 433}
434 434
435void pcm_record_more(void *start, size_t size) 435void pcm_rec_dma_record_more(void *start, size_t size)
436{ 436{
437 start = (void *)(((unsigned long)start + 3) & ~3);
438 size &= ~3;
439
440 /* Invalidate - buffer must be coherent */ 437 /* Invalidate - buffer must be coherent */
441 dump_dcache_range(start, size); 438 dump_dcache_range(start, size);
442 439
443 start = (void *)addr_virt_to_phys((unsigned long)start); 440 start = (void *)addr_virt_to_phys((unsigned long)start);
444 441
445 pcm_rec_peak_addr = start;
446 dma_rec_bd.buf_addr = start; 442 dma_rec_bd.buf_addr = start;
447 dma_rec_bd.mode.count = size; 443 dma_rec_bd.mode.count = size;
448 dma_rec_bd.mode.command = TRANSFER_16BIT; 444 dma_rec_bd.mode.command = TRANSFER_16BIT;
@@ -469,12 +465,6 @@ void pcm_rec_dma_start(void *addr, size_t size)
469{ 465{
470 pcm_rec_dma_stop(); 466 pcm_rec_dma_stop();
471 467
472 addr = (void *)(((unsigned long)addr + 3) & ~3);
473 size &= ~3;
474
475 if (size <= 0)
476 return;
477
478 if (!sdma_channel_reset(DMA_REC_CH_NUM)) 468 if (!sdma_channel_reset(DMA_REC_CH_NUM))
479 return; 469 return;
480 470
@@ -482,7 +472,6 @@ void pcm_rec_dma_start(void *addr, size_t size)
482 dump_dcache_range(addr, size); 472 dump_dcache_range(addr, size);
483 473
484 addr = (void *)addr_virt_to_phys((unsigned long)addr); 474 addr = (void *)addr_virt_to_phys((unsigned long)addr);
485 pcm_rec_peak_addr = addr;
486 dma_rec_bd.buf_addr = addr; 475 dma_rec_bd.buf_addr = addr;
487 dma_rec_bd.mode.count = size; 476 dma_rec_bd.mode.count = size;
488 dma_rec_bd.mode.command = TRANSFER_16BIT; 477 dma_rec_bd.mode.command = TRANSFER_16BIT;
@@ -524,10 +513,10 @@ void pcm_rec_dma_init(void)
524 sdma_channel_set_priority(DMA_REC_CH_NUM, DMA_REC_CH_PRIORITY); 513 sdma_channel_set_priority(DMA_REC_CH_NUM, DMA_REC_CH_PRIORITY);
525} 514}
526 515
527const void * pcm_rec_dma_get_peak_buffer(int *count) 516const void * pcm_rec_dma_get_peak_buffer(void)
528{ 517{
529 static unsigned long pda NOCACHEBSS_ATTR; 518 static unsigned long pda NOCACHEBSS_ATTR;
530 unsigned long buf, addr, end, bufend; 519 unsigned long buf, end, bufend;
531 int oldstatus; 520 int oldstatus;
532 521
533 /* read burst dma destination address register in channel context */ 522 /* read burst dma destination address register in channel context */
@@ -536,19 +525,13 @@ const void * pcm_rec_dma_get_peak_buffer(int *count)
536 oldstatus = disable_irq_save(); 525 oldstatus = disable_irq_save();
537 end = pda; 526 end = pda;
538 buf = (unsigned long)dma_rec_bd.buf_addr; 527 buf = (unsigned long)dma_rec_bd.buf_addr;
539 addr = (unsigned long)pcm_rec_peak_addr;
540 bufend = buf + dma_rec_bd.mode.count; 528 bufend = buf + dma_rec_bd.mode.count;
541 restore_irq(oldstatus); 529 restore_irq(oldstatus);
542 530
543 /* Be addresses are coherent (no buffer change during read) */ 531 /* Be addresses are coherent (no buffer change during read) */
544 if (addr >= buf && addr < bufend && 532 if (end >= buf && end < bufend)
545 end >= buf && end < bufend) 533 return (void *)(end & ~3);
546 {
547 *count = (end >> 2) - (addr >> 2);
548 return (void *)(addr & ~3);
549 }
550 534
551 *count = 0;
552 return NULL; 535 return NULL;
553} 536}
554 537
diff --git a/firmware/target/arm/pcm-pp.c b/firmware/target/arm/pcm-pp.c
index bd12b13032..bad3f593fe 100644
--- a/firmware/target/arm/pcm-pp.c
+++ b/firmware/target/arm/pcm-pp.c
@@ -431,9 +431,6 @@ static void play_stop_pcm(void)
431 431
432void pcm_play_dma_start(const void *addr, size_t size) 432void pcm_play_dma_start(const void *addr, size_t size)
433{ 433{
434 addr = (void *)(((long)addr + 2) & ~3);
435 size &= ~3;
436
437#if NUM_CORES > 1 434#if NUM_CORES > 1
438 /* This will become more important later - and different ! */ 435 /* This will become more important later - and different ! */
439 dma_play_data.core = processor_id(); /* save initiating core */ 436 dma_play_data.core = processor_id(); /* save initiating core */
@@ -441,9 +438,6 @@ void pcm_play_dma_start(const void *addr, size_t size)
441 438
442 pcm_play_dma_stop(); 439 pcm_play_dma_stop();
443 440
444 if (size == 0)
445 return;
446
447#ifdef CPU_PP502x 441#ifdef CPU_PP502x
448 if ((unsigned long)addr < UNCACHED_BASE_ADDR) { 442 if ((unsigned long)addr < UNCACHED_BASE_ADDR) {
449 /* Flush any pending cache writes */ 443 /* Flush any pending cache writes */
@@ -691,9 +685,8 @@ void fiq_record(void)
691#endif /* SANSA_E200 */ 685#endif /* SANSA_E200 */
692 686
693/* Continue transferring data in */ 687/* Continue transferring data in */
694void pcm_record_more(void *start, size_t size) 688void pcm_rec_dma_record_more(void *start, size_t size)
695{ 689{
696 pcm_rec_peak_addr = start; /* Start peaking at dest */
697 dma_rec_data.addr = (unsigned long)start; /* Start of RX buffer */ 690 dma_rec_data.addr = (unsigned long)start; /* Start of RX buffer */
698 dma_rec_data.size = size; /* Bytes to transfer */ 691 dma_rec_data.size = size; /* Bytes to transfer */
699} 692}
@@ -718,7 +711,6 @@ void pcm_rec_dma_start(void *addr, size_t size)
718{ 711{
719 pcm_rec_dma_stop(); 712 pcm_rec_dma_stop();
720 713
721 pcm_rec_peak_addr = addr;
722 dma_rec_data.addr = (unsigned long)addr; 714 dma_rec_data.addr = (unsigned long)addr;
723 dma_rec_data.size = size; 715 dma_rec_data.size = size;
724#if NUM_CORES > 1 716#if NUM_CORES > 1
@@ -749,17 +741,9 @@ void pcm_rec_dma_init(void)
749 pcm_rec_dma_stop(); 741 pcm_rec_dma_stop();
750} /* pcm_init */ 742} /* pcm_init */
751 743
752const void * pcm_rec_dma_get_peak_buffer(int *count) 744const void * pcm_rec_dma_get_peak_buffer(void)
753{ 745{
754 unsigned long addr, end; 746 return (void *)((unsigned long)dma_rec_data.addr & ~3);
755
756 int status = disable_fiq_save();
757 addr = (unsigned long)pcm_rec_peak_addr;
758 end = dma_rec_data.addr;
759 restore_fiq(status);
760
761 *count = (end >> 2) - (addr >> 2);
762 return (void *)(addr & ~3);
763} /* pcm_rec_dma_get_peak_buffer */ 747} /* pcm_rec_dma_get_peak_buffer */
764 748
765#endif /* HAVE_RECORDING */ 749#endif /* HAVE_RECORDING */
diff --git a/firmware/target/arm/pcm-telechips.c b/firmware/target/arm/pcm-telechips.c
index f0ef667d4f..9d14fa5ed5 100644
--- a/firmware/target/arm/pcm-telechips.c
+++ b/firmware/target/arm/pcm-telechips.c
@@ -141,8 +141,8 @@ static void play_stop_pcm(void)
141 141
142void pcm_play_dma_start(const void *addr, size_t size) 142void pcm_play_dma_start(const void *addr, size_t size)
143{ 143{
144 dma_play_data.p = (void *)(((uintptr_t)addr + 2) & ~3); 144 dma_play_data.p = addr;
145 dma_play_data.size = (size & ~3); 145 dma_play_data.size = size;
146 146
147#if NUM_CORES > 1 147#if NUM_CORES > 1
148 /* This will become more important later - and different ! */ 148 /* This will become more important later - and different ! */
@@ -229,9 +229,8 @@ void pcm_rec_unlock(void)
229{ 229{
230} 230}
231 231
232const void * pcm_rec_dma_get_peak_buffer(int *count) 232const void * pcm_rec_dma_get_peak_buffer(void)
233{ 233{
234 *count = 0;
235 return NULL; 234 return NULL;
236} 235}
237 236
diff --git a/firmware/target/arm/s5l8700/pcm-s5l8700.c b/firmware/target/arm/s5l8700/pcm-s5l8700.c
index 1edb05fd15..7798f41d11 100644
--- a/firmware/target/arm/s5l8700/pcm-s5l8700.c
+++ b/firmware/target/arm/s5l8700/pcm-s5l8700.c
@@ -367,7 +367,7 @@ void pcm_rec_unlock(void)
367{ 367{
368} 368}
369 369
370void pcm_record_more(void *start, size_t size) 370void pcm_rec_dma_record_more(void *start, size_t size)
371{ 371{
372 (void)start; 372 (void)start;
373 (void)size; 373 (void)size;
@@ -393,9 +393,9 @@ void pcm_rec_dma_init(void)
393} 393}
394 394
395 395
396const void * pcm_rec_dma_get_peak_buffer(int *count) 396const void * pcm_rec_dma_get_peak_buffer(void)
397{ 397{
398 (void)count; 398 return NULL;
399} 399}
400 400
401#endif /* HAVE_RECORDING */ 401#endif /* HAVE_RECORDING */