Skip to content

Commit

Permalink
dmaengine: bcm2835: Fix cyclic DMA period splitting
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Matthias Reichl authored and Vinod Koul committed Mar 6, 2017
1 parent c1ae3cf commit 2201ac6
Showing 1 changed file with 4 additions and 1 deletion.
5 changes: 4 additions & 1 deletion drivers/dma/bcm2835-dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -251,8 +251,11 @@ static void bcm2835_dma_create_cb_set_length(
*/

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

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

0 comments on commit 2201ac6

Please sign in to comment.