diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2010-05-12 14:05:36 +0000 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2010-05-12 14:05:36 +0000 |
commit | 4d04132c76700b30708bf99fc0ef664e8bb0b58d (patch) | |
tree | 4a32974c7d75d93477413fa3fe8cd152709e3d8c /firmware | |
parent | f2df42ee91ee61f793dac4844255cb4ec9049621 (diff) | |
download | rockbox-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')
-rw-r--r-- | firmware/export/config/gigabeats.h | 1 | ||||
-rw-r--r-- | firmware/export/pcm.h | 4 | ||||
-rw-r--r-- | firmware/pcm.c | 62 | ||||
-rw-r--r-- | firmware/target/arm/as3525/pcm-as3525.c | 13 | ||||
-rw-r--r-- | firmware/target/arm/imx31/gigabeat-s/pcm-gigabeat-s.c | 27 | ||||
-rw-r--r-- | firmware/target/arm/pcm-pp.c | 22 | ||||
-rw-r--r-- | firmware/target/arm/pcm-telechips.c | 7 | ||||
-rw-r--r-- | firmware/target/arm/s5l8700/pcm-s5l8700.c | 6 | ||||
-rw-r--r-- | firmware/target/coldfire/pcm-coldfire.c | 34 | ||||
-rw-r--r-- | firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c | 5 |
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 **/ |
143 | extern 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 */ |
145 | extern volatile pcm_more_callback_type2 pcm_callback_more_ready; | 144 | extern 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; | |||
150 | void pcm_rec_dma_init(void); | 149 | void pcm_rec_dma_init(void); |
151 | void pcm_rec_dma_close(void); | 150 | void pcm_rec_dma_close(void); |
152 | void pcm_rec_dma_start(void *addr, size_t size); | 151 | void pcm_rec_dma_start(void *addr, size_t size); |
152 | void pcm_rec_dma_record_more(void *start, size_t size); | ||
153 | void pcm_rec_dma_stop(void); | 153 | void pcm_rec_dma_stop(void); |
154 | void pcm_rec_dma_stopped_callback(void); | 154 | void pcm_rec_dma_stopped_callback(void); |
155 | const void * pcm_rec_dma_get_peak_buffer(int *count); | 155 | const 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 */ |
211 | static void pcm_play_data_start(unsigned char *start, size_t size) | 210 | static 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 */ |
362 | const volatile void *pcm_rec_peak_addr SHAREDBSS_ATTR = NULL; | 367 | static 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 */ |
364 | volatile pcm_more_callback_type2 | 369 | volatile 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; | |||
373 | void pcm_calculate_rec_peaks(int *left, int *right) | 378 | void 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 | ||
502 | void 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 | |||
480 | bool pcm_is_recording(void) | 524 | bool 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 | ||
205 | void pcm_record_more(void *start, size_t size) | 205 | void 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 | ||
334 | const void * pcm_rec_dma_get_peak_buffer(int *count) | 334 | const 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 | ||
435 | void pcm_record_more(void *start, size_t size) | 435 | void 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 | ||
527 | const void * pcm_rec_dma_get_peak_buffer(int *count) | 516 | const 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 | ||
432 | void pcm_play_dma_start(const void *addr, size_t size) | 432 | void 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 */ |
694 | void pcm_record_more(void *start, size_t size) | 688 | void 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 | ||
752 | const void * pcm_rec_dma_get_peak_buffer(int *count) | 744 | const 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 | ||
142 | void pcm_play_dma_start(const void *addr, size_t size) | 142 | void 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 | ||
232 | const void * pcm_rec_dma_get_peak_buffer(int *count) | 232 | const 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 | ||
370 | void pcm_record_more(void *start, size_t size) | 370 | void 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 | ||
396 | const void * pcm_rec_dma_get_peak_buffer(int *count) | 396 | const 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 */ |
493 | void pcm_record_more(void *start, size_t size) | 480 | void 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 | ||
504 | const void * pcm_rec_dma_get_peak_buffer(int *count) | 487 | const 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 | ||
291 | const void * pcm_rec_dma_get_peak_buffer(int *count) | 291 | const void * pcm_rec_dma_get_peak_buffer(void) |
292 | { | 292 | { |
293 | *count = 0; | ||
294 | return NULL; | 293 | return NULL; |
295 | } | 294 | } |
296 | 295 | ||
297 | void pcm_record_more(void *start, size_t size) | 296 | void pcm_rec_dma_record_more(void *start, size_t size) |
298 | { | 297 | { |
299 | (void) start; | 298 | (void) start; |
300 | (void) size; | 299 | (void) size; |