2016-09-10 12:54:26 +00:00
|
|
|
From aaf4cb4fda9ed5c19f0db02023c5c11f51a23aaf Mon Sep 17 00:00:00 2001
|
2016-07-07 07:22:07 +00:00
|
|
|
From: Matthias Reichl <hias@horus.com>
|
|
|
|
Date: Tue, 7 Jun 2016 19:37:10 +0200
|
2016-09-10 12:54:26 +00:00
|
|
|
Subject: [PATCH] dmaengine: bcm2835: Fix cyclic DMA period splitting
|
2016-07-07 07:22:07 +00:00
|
|
|
|
|
|
|
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;
|