40 lines
1.5 KiB
Diff
40 lines
1.5 KiB
Diff
|
From 9fd7a158ec098ab05b8d3ec2c2973b3dc7e498f3 Mon Sep 17 00:00:00 2001
|
||
|
From: Matthias Reichl <hias@horus.com>
|
||
|
Date: Mon, 20 Feb 2017 20:01:16 +0100
|
||
|
Subject: [PATCH] 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>
|
||
|
---
|
||
|
drivers/dma/bcm2835-dma.c | 5 ++++-
|
||
|
1 file changed, 4 insertions(+), 1 deletion(-)
|
||
|
|
||
|
--- a/drivers/dma/bcm2835-dma.c
|
||
|
+++ b/drivers/dma/bcm2835-dma.c
|
||
|
@@ -253,8 +253,11 @@ static void bcm2835_dma_create_cb_set_le
|
||
|
*/
|
||
|
|
||
|
/* 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;
|