diff options
Diffstat (limited to 'firmware/target/coldfire')
-rw-r--r-- | firmware/target/coldfire/pcm-coldfire.c | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/firmware/target/coldfire/pcm-coldfire.c b/firmware/target/coldfire/pcm-coldfire.c index e95d445337..2e2312f7ae 100644 --- a/firmware/target/coldfire/pcm-coldfire.c +++ b/firmware/target/coldfire/pcm-coldfire.c | |||
@@ -294,8 +294,6 @@ void DMA0(void) __attribute__ ((interrupt_handler, section(".icode"))); | |||
294 | void DMA0(void) | 294 | void DMA0(void) |
295 | { | 295 | { |
296 | unsigned long res = DSR0; | 296 | unsigned long res = DSR0; |
297 | void *start; | ||
298 | size_t size; | ||
299 | 297 | ||
300 | and_l(~(DMA_EEXT | DMA_INT), &DCR0); /* per request and int OFF */ | 298 | and_l(~(DMA_EEXT | DMA_INT), &DCR0); /* per request and int OFF */ |
301 | DSR0 = 1; /* Clear interrupt and errors */ | 299 | DSR0 = 1; /* Clear interrupt and errors */ |
@@ -311,17 +309,18 @@ void DMA0(void) | |||
311 | #endif | 309 | #endif |
312 | } | 310 | } |
313 | 311 | ||
314 | /* Force stop on error */ | 312 | const void *addr; |
315 | pcm_play_get_more_callback((res & 0x70) ? NULL : &start, &size); | 313 | size_t size; |
316 | 314 | ||
317 | if (size != 0) | 315 | if (pcm_play_dma_complete_callback((res & 0x70) ? |
316 | PCM_DMAST_ERR_DMA : PCM_DMAST_OK, | ||
317 | &addr, &size)) | ||
318 | { | 318 | { |
319 | SAR0 = (unsigned long)start; /* Source address */ | 319 | SAR0 = (unsigned long)addr; /* Source address */ |
320 | BCR0 = size; /* Bytes to transfer */ | 320 | BCR0 = (unsigned long)size; /* Bytes to transfer */ |
321 | or_l(DMA_EEXT | DMA_INT, &DCR0); /* per request and int ON */ | 321 | or_l(DMA_EEXT | DMA_INT, &DCR0); /* per request and int ON */ |
322 | 322 | ||
323 | /* Call buffer callback */ | 323 | pcm_play_dma_status_callback(PCM_DMAST_STARTED); |
324 | pcm_play_dma_started_callback(); | ||
325 | } | 324 | } |
326 | /* else inished playing */ | 325 | /* else inished playing */ |
327 | } /* DMA0 */ | 326 | } /* DMA0 */ |
@@ -368,7 +367,7 @@ void pcm_rec_unlock(void) | |||
368 | 367 | ||
369 | void pcm_rec_dma_start(void *addr, size_t size) | 368 | void pcm_rec_dma_start(void *addr, size_t size) |
370 | { | 369 | { |
371 | /* stop any DMA in progress */ | 370 | /* Stop any DMA in progress */ |
372 | pcm_rec_dma_stop(); | 371 | pcm_rec_dma_stop(); |
373 | 372 | ||
374 | and_l(~PDIR2_FIFO_RESET, &DATAINCONTROL); | 373 | and_l(~PDIR2_FIFO_RESET, &DATAINCONTROL); |
@@ -430,16 +429,14 @@ void DMA1(void) __attribute__ ((interrupt_handler, section(".icode"))); | |||
430 | void DMA1(void) | 429 | void DMA1(void) |
431 | { | 430 | { |
432 | unsigned long res = DSR1; | 431 | unsigned long res = DSR1; |
433 | int status = 0; | 432 | enum pcm_dma_status status = PCM_DMAST_OK; |
434 | void *start; | ||
435 | size_t size; | ||
436 | 433 | ||
437 | and_l(~(DMA_EEXT | DMA_INT), &DCR1); /* per request and int OFF */ | 434 | and_l(~(DMA_EEXT | DMA_INT), &DCR1); /* per request and int OFF */ |
438 | DSR1 = 1; /* Clear interrupt and errors */ | 435 | DSR1 = 1; /* Clear interrupt and errors */ |
439 | 436 | ||
440 | if (res & 0x70) | 437 | if (res & 0x70) |
441 | { | 438 | { |
442 | status = DMA_REC_ERROR_DMA; | 439 | status = PCM_DMAST_ERR_DMA; |
443 | logf("DMA1 err: %02x", res); | 440 | logf("DMA1 err: %02x", res); |
444 | #if 0 | 441 | #if 0 |
445 | logf(" SAR1: %08x", SAR1); | 442 | logf(" SAR1: %08x", SAR1); |
@@ -456,19 +453,22 @@ void DMA1(void) | |||
456 | * Ignore valnogood since several sources don't set it properly. */ | 453 | * Ignore valnogood since several sources don't set it properly. */ |
457 | /* clear: ebu1cnew, symbolerr, parityerr */ | 454 | /* clear: ebu1cnew, symbolerr, parityerr */ |
458 | INTERRUPTCLEAR = (1 << 25) | (1 << 23) | (1 << 22); | 455 | INTERRUPTCLEAR = (1 << 25) | (1 << 23) | (1 << 22); |
459 | status = DMA_REC_ERROR_SPDIF; | 456 | status = PCM_DMAST_ERR_SPDIF; |
460 | logf("spdif err"); | 457 | logf("spdif err"); |
461 | } | 458 | } |
462 | #endif | 459 | #endif |
463 | 460 | ||
464 | /* Inform PCM we have more data (or error) */ | 461 | /* Inform PCM we have more data (or error) */ |
465 | pcm_rec_more_ready_callback(status, &start, &size); | 462 | void *addr; |
463 | size_t size; | ||
466 | 464 | ||
467 | if (size != 0) | 465 | if (pcm_rec_dma_complete_callback(status, &addr, &size)) |
468 | { | 466 | { |
469 | DAR1 = (unsigned long)start; /* Destination address */ | 467 | DAR1 = (unsigned long)addr; /* Destination address */ |
470 | BCR1 = (unsigned long)size; /* Bytes to transfer */ | 468 | BCR1 = (unsigned long)size; /* Bytes to transfer */ |
471 | or_l(DMA_EEXT | DMA_INT, &DCR1); /* per request and int ON */ | 469 | or_l(DMA_EEXT | DMA_INT, &DCR1); /* per request and int ON */ |
470 | |||
471 | pcm_rec_dma_status_callback(PCM_DMAST_STARTED); | ||
472 | } | 472 | } |
473 | } /* DMA1 */ | 473 | } /* DMA1 */ |
474 | 474 | ||