Index: firmware/target/arm/pcm-pp.c =================================================================== --- firmware/target/arm/pcm-pp.c (revision 20169) +++ firmware/target/arm/pcm-pp.c (working copy) @@ -148,7 +148,7 @@ dma_play_data.size &= 0xfffc; } - if (dma_play_data.size <= 0) { + if (dma_play_data.size == 0) { break; } @@ -360,7 +360,7 @@ /* Not at least MAX_DMA_CHUNK_SIZE left or there would be less than a * FIFO's worth of data after this transfer? */ size_t size = MAX_DMA_CHUNK_SIZE; - if (dma_play_data.size + 16*4 < size) + if (size + 16*4 > dma_play_data.size) size = dma_play_data.size; DMA0_RAM_ADDR = dma_play_data.addr; @@ -391,32 +391,35 @@ static void play_stop_pcm(void) { #ifdef CPU_PP502x - size_t status = DMA0_STATUS; - size_t size; + unsigned long status = DMA0_STATUS; /* Snapshot- resume from this point */ + unsigned long cmd = DMA0_CMD; + size_t size = 0; /* Stop transfer */ - DMA0_CMD &= ~(DMA_CMD_START | DMA_CMD_INTR); + DMA0_CMD = cmd & ~(DMA_CMD_START | DMA_CMD_INTR); /* Wait for not busy + clear int */ while (DMA0_STATUS & (DMA_STATUS_BUSY | DMA_STATUS_INTR)); - size = (status & 0xfffc) + 4; - if (status & DMA_STATUS_BUSY) { /* Transfer was interrupted - leave what's left */ - dma_play_data.addr += dma_play_data.size - size; - dma_play_data.size = size; + size = (cmd & 0xfffc) - (status & 0xfffc); } else if (status & DMA_STATUS_INTR) { /* Tranfer was finished - DMA0_STATUS will have been reloaded - * automatically with size in DMA0_CMD. */ - dma_play_data.addr += size; - dma_play_data.size -= size; - if (dma_play_data.size <= 0) - dma_play_data.addr = 0; /* Entire buffer has completed */ + * automatically with size in DMA0_CMD. Setup to restart on next + * segment. */ + size = (cmd & 0xfffc) + 4; } + /* else not an active state - size = 0 */ + + dma_play_data.addr += size; + dma_play_data.size -= size; + + if (dma_play_data.size == 0) + dma_play_data.addr = 0; /* Entire buffer has completed. */ #else /* Disable TX interrupt */ IIS_IRQTX_REG &= ~IIS_IRQTX; @@ -440,7 +443,7 @@ pcm_play_dma_stop(); - if (size <= 0) + if (size == 0) return; #ifdef CPU_PP502x