summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/export/config/gigabeats.h1
-rw-r--r--firmware/export/pcm.h4
-rw-r--r--firmware/pcm.c62
-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
-rw-r--r--firmware/target/coldfire/pcm-coldfire.c34
-rw-r--r--firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c5
10 files changed, 78 insertions, 103 deletions
diff --git a/firmware/export/config/gigabeats.h b/firmware/export/config/gigabeats.h
index 2e489239b9..19a8fa4bf8 100644
--- a/firmware/export/config/gigabeats.h
+++ b/firmware/export/config/gigabeats.h
@@ -220,6 +220,7 @@
220/* #define HAVE_ADJUSTABLE_CPU_FREQ */ 220/* #define HAVE_ADJUSTABLE_CPU_FREQ */
221 221
222#define HAVE_PCM_DMA_ADDRESS 222#define HAVE_PCM_DMA_ADDRESS
223#define HAVE_PCM_REC_DMA_ADDRESS
223 224
224#define BOOTFILE_EXT "gigabeat" 225#define BOOTFILE_EXT "gigabeat"
225#define BOOTFILE "rockbox." BOOTFILE_EXT 226#define BOOTFILE "rockbox." BOOTFILE_EXT
diff --git a/firmware/export/pcm.h b/firmware/export/pcm.h
index 0f8222f90d..0e71814b34 100644
--- a/firmware/export/pcm.h
+++ b/firmware/export/pcm.h
@@ -140,7 +140,6 @@ void pcm_calculate_rec_peaks(int *left, int *right);
140 140
141/** The following are for internal use between pcm.c and target- 141/** The following are for internal use between pcm.c and target-
142 specific portion **/ 142 specific portion **/
143extern volatile const void *pcm_rec_peak_addr;
144/* the registered callback function for when more data is available */ 143/* the registered callback function for when more data is available */
145extern volatile pcm_more_callback_type2 pcm_callback_more_ready; 144extern volatile pcm_more_callback_type2 pcm_callback_more_ready;
146/* DMA transfer in is currently active */ 145/* DMA transfer in is currently active */
@@ -150,9 +149,10 @@ extern volatile bool pcm_recording;
150void pcm_rec_dma_init(void); 149void pcm_rec_dma_init(void);
151void pcm_rec_dma_close(void); 150void pcm_rec_dma_close(void);
152void pcm_rec_dma_start(void *addr, size_t size); 151void pcm_rec_dma_start(void *addr, size_t size);
152void pcm_rec_dma_record_more(void *start, size_t size);
153void pcm_rec_dma_stop(void); 153void pcm_rec_dma_stop(void);
154void pcm_rec_dma_stopped_callback(void); 154void pcm_rec_dma_stopped_callback(void);
155const void * pcm_rec_dma_get_peak_buffer(int *count); 155const void * pcm_rec_dma_get_peak_buffer(void);
156 156
157#endif /* HAVE_RECORDING */ 157#endif /* HAVE_RECORDING */
158 158
diff --git a/firmware/pcm.c b/firmware/pcm.c
index edd4113677..8d2ec2bf60 100644
--- a/firmware/pcm.c
+++ b/firmware/pcm.c
@@ -40,7 +40,6 @@
40 * pcm_play_unlock 40 * pcm_play_unlock
41 * Semi-private - 41 * Semi-private -
42 * pcm_play_dma_init 42 * pcm_play_dma_init
43 * pcm_play_dma_init
44 * pcm_play_dma_start 43 * pcm_play_dma_start
45 * pcm_play_dma_stop 44 * pcm_play_dma_stop
46 * pcm_play_dma_pause 45 * pcm_play_dma_pause
@@ -66,10 +65,10 @@
66 * pcm_rec_dma_init 65 * pcm_rec_dma_init
67 * pcm_rec_dma_close 66 * pcm_rec_dma_close
68 * pcm_rec_dma_start 67 * pcm_rec_dma_start
68 * pcm_rec_dma_record_more
69 * pcm_rec_dma_stop 69 * pcm_rec_dma_stop
70 * pcm_rec_dma_get_peak_buffer 70 * pcm_rec_dma_get_peak_buffer
71 * Data Read/Written within TSP - 71 * Data Read/Written within TSP -
72 * pcm_rec_peak_addr (R/W)
73 * pcm_callback_more_ready (R) 72 * pcm_callback_more_ready (R)
74 * pcm_recording (R) 73 * pcm_recording (R)
75 * 74 *
@@ -210,6 +209,9 @@ void pcm_init(void)
210/* Common code to pcm_play_data and pcm_play_pause */ 209/* Common code to pcm_play_data and pcm_play_pause */
211static void pcm_play_data_start(unsigned char *start, size_t size) 210static void pcm_play_data_start(unsigned char *start, size_t size)
212{ 211{
212 start = (unsigned char *)(((uintptr_t)start + 3) & ~3);
213 size &= ~3;
214
213 if (!(start && size)) 215 if (!(start && size))
214 { 216 {
215 pcm_more_callback_type get_more = pcm_callback_for_more; 217 pcm_more_callback_type get_more = pcm_callback_for_more;
@@ -218,6 +220,9 @@ static void pcm_play_data_start(unsigned char *start, size_t size)
218 { 220 {
219 logf(" get_more"); 221 logf(" get_more");
220 get_more(&start, &size); 222 get_more(&start, &size);
223
224 start = (unsigned char *)(((uintptr_t)start + 3) & ~3);
225 size &= ~3;
221 } 226 }
222 } 227 }
223 228
@@ -359,7 +364,7 @@ bool pcm_is_paused(void)
359/** Low level pcm recording apis **/ 364/** Low level pcm recording apis **/
360 365
361/* Next start for recording peaks */ 366/* Next start for recording peaks */
362const volatile void *pcm_rec_peak_addr SHAREDBSS_ATTR = NULL; 367static const void * volatile pcm_rec_peak_addr SHAREDBSS_ATTR = NULL;
363/* the registered callback function for when more data is available */ 368/* the registered callback function for when more data is available */
364volatile pcm_more_callback_type2 369volatile pcm_more_callback_type2
365 pcm_callback_more_ready SHAREDBSS_ATTR = NULL; 370 pcm_callback_more_ready SHAREDBSS_ATTR = NULL;
@@ -373,17 +378,23 @@ volatile bool pcm_recording SHAREDBSS_ATTR = false;
373void pcm_calculate_rec_peaks(int *left, int *right) 378void pcm_calculate_rec_peaks(int *left, int *right)
374{ 379{
375 static int peaks[2]; 380 static int peaks[2];
376 int count;
377 const void *addr = pcm_rec_dma_get_peak_buffer(&count);
378 381
379 if (pcm_recording) 382 if (pcm_recording)
380 { 383 {
381 if (count > 0) 384 const void *peak_addr = pcm_rec_peak_addr;
385 const void *addr = pcm_rec_dma_get_peak_buffer();
386
387 if (addr != NULL)
382 { 388 {
383 pcm_peak_peeker(addr, count, peaks); 389 int count = (int)(((intptr_t)addr - (intptr_t)peak_addr) >> 2);
384 390
385 if (addr == pcm_rec_peak_addr) 391 if (count > 0)
386 pcm_rec_peak_addr = (int32_t *)addr + count; 392 {
393 pcm_peak_peeker(peak_addr, count, peaks);
394
395 if (peak_addr == pcm_rec_peak_addr)
396 pcm_rec_peak_addr = addr;
397 }
387 } 398 }
388 /* else keep previous peak values */ 399 /* else keep previous peak values */
389 } 400 }
@@ -443,6 +454,10 @@ void pcm_record_data(pcm_more_callback_type2 more_ready,
443{ 454{
444 logf("pcm_record_data"); 455 logf("pcm_record_data");
445 456
457 /* 32-bit aligned and sized data only */
458 start = (void *)(((uintptr_t)start + 3) & ~3);
459 size &= ~3;
460
446 if (!(start && size)) 461 if (!(start && size))
447 { 462 {
448 logf(" no buffer"); 463 logf(" no buffer");
@@ -453,6 +468,13 @@ void pcm_record_data(pcm_more_callback_type2 more_ready,
453 468
454 pcm_callback_more_ready = more_ready; 469 pcm_callback_more_ready = more_ready;
455 470
471#ifdef HAVE_PCM_REC_DMA_ADDRESS
472 /* Need a physical DMA address translation, if not already physical. */
473 pcm_rec_peak_addr = pcm_dma_addr(start);
474#else
475 pcm_rec_peak_addr = start;
476#endif
477
456 logf(" pcm_rec_dma_start"); 478 logf(" pcm_rec_dma_start");
457 pcm_apply_settings(); 479 pcm_apply_settings();
458 pcm_rec_dma_start(start, size); 480 pcm_rec_dma_start(start, size);
@@ -477,6 +499,28 @@ void pcm_stop_recording(void)
477 pcm_rec_unlock(); 499 pcm_rec_unlock();
478} /* pcm_stop_recording */ 500} /* pcm_stop_recording */
479 501
502void pcm_record_more(void *start, size_t size)
503{
504 start = (void *)(((uintptr_t)start + 3) & ~3);
505 size = size & ~3;
506
507 if (!size)
508 {
509 pcm_rec_dma_stop();
510 pcm_rec_dma_stopped_callback();
511 return;
512 }
513
514#ifdef HAVE_PCM_REC_DMA_ADDRESS
515 /* Need a physical DMA address translation, if not already physical. */
516 pcm_rec_peak_addr = pcm_dma_addr(start);
517#else
518 pcm_rec_peak_addr = start;
519#endif
520
521 pcm_rec_dma_record_more(start, size);
522}
523
480bool pcm_is_recording(void) 524bool pcm_is_recording(void)
481{ 525{
482 return pcm_recording; 526 return pcm_recording;
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 */
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
diff --git a/firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c b/firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c
index a4ecd0b786..993f70bad8 100644
--- a/firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c
+++ b/firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c
@@ -288,13 +288,12 @@ void pcm_rec_unlock(void)
288{ 288{
289} 289}
290 290
291const void * pcm_rec_dma_get_peak_buffer(int *count) 291const void * pcm_rec_dma_get_peak_buffer(void)
292{ 292{
293 *count = 0;
294 return NULL; 293 return NULL;
295} 294}
296 295
297void pcm_record_more(void *start, size_t size) 296void pcm_rec_dma_record_more(void *start, size_t size)
298{ 297{
299 (void) start; 298 (void) start;
300 (void) size; 299 (void) size;