summaryrefslogtreecommitdiff
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
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
-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;