summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn Guo <shawn.guo@linaro.org>2016-12-15 15:03:37 +0100
committerVinod Koul <vinod.koul@intel.com>2017-01-02 06:23:48 +0100
commit156ae09245c4c49c8eb4a0898411ee260966331d (patch)
tree207ea5eb1dd71d8ddb2887cab1307127b133b871
parentdmaengine: zx: set DMA_CYCLIC cap_mask bit (diff)
downloadlinux-156ae09245c4c49c8eb4a0898411ee260966331d.tar.xz
linux-156ae09245c4c49c8eb4a0898411ee260966331d.zip
dmaengine: zx: fix residue calculation
The dma residue is defined as the free space to end of transfer buffer, which could be multiple segments chained together. So the residue calculation in zx_dma_tx_status() works for both slave_sg and cyclic case. But unfortunately, the 'index' is wrong. It should plus one, because the current segment is already occupied and shouldn't be counted into free space. This fixes the HDMI audio noise issue we see on ZX296718 with SPDIF interface. Signed-off-by: Shawn Guo <shawn.guo@linaro.org> Reviewed-by: Jun Nie <jun.nie@linaro.org> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
-rw-r--r--drivers/dma/zx_dma.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/dma/zx_dma.c b/drivers/dma/zx_dma.c
index 33155c6816cc..42ff3e66c1e1 100644
--- a/drivers/dma/zx_dma.c
+++ b/drivers/dma/zx_dma.c
@@ -365,7 +365,8 @@ static enum dma_status zx_dma_tx_status(struct dma_chan *chan,
bytes = 0;
clli = zx_dma_get_curr_lli(p);
- index = (clli - ds->desc_hw_lli) / sizeof(struct zx_desc_hw);
+ index = (clli - ds->desc_hw_lli) /
+ sizeof(struct zx_desc_hw) + 1;
for (; index < ds->desc_num; index++) {
bytes += ds->desc_hw[index].src_x;
/* end of lli */