Skip to content

Commit 2201ac6

Browse files
HiassofTVinod Koul
authored andcommitted
dmaengine: bcm2835: Fix cyclic DMA period splitting
The code responsible for splitting periods into chunks that can be handled by the DMA controller missed to update total_len, the number of bytes processed in the current period, when there are more chunks to follow. Therefore total_len was stuck at 0 and the code didn't work at all. This resulted in a wrong control block layout and audio issues because the cyclic DMA callback wasn't executing on period boundaries. Fix this by adding the missing total_len update. Signed-off-by: Matthias Reichl <hias@horus.com> Signed-off-by: Martin Sperl <kernel@martin.sperl.org> Tested-by: Clive Messer <clive.messer@digitaldreamtime.co.uk> Reviewed-by: Eric Anholt <eric@anholt.net> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
1 parent c1ae3cf commit 2201ac6

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

drivers/dma/bcm2835-dma.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,8 +251,11 @@ static void bcm2835_dma_create_cb_set_length(
251251
*/
252252

253253
/* have we filled in period_length yet? */
254-
if (*total_len + control_block->length < period_len)
254+
if (*total_len + control_block->length < period_len) {
255+
/* update number of bytes in this period so far */
256+
*total_len += control_block->length;
255257
return;
258+
}
256259

257260
/* calculate the length that remains to reach period_length */
258261
control_block->length = period_len - *total_len;

0 commit comments

Comments
 (0)