mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-27 09:12:39 +00:00
39 lines
1.4 KiB
Diff
39 lines
1.4 KiB
Diff
|
From 74d0d3161d711b51be692cf1750b6eb60719f782 Mon Sep 17 00:00:00 2001
|
||
|
From: Matthias Reichl <hias@horus.com>
|
||
|
Date: Tue, 7 Jun 2016 19:37:10 +0200
|
||
|
Subject: [PATCH 406/423] 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>
|
||
|
---
|
||
|
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
|
||
|
@@ -252,8 +252,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;
|