From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932134AbbIAKAt (ORCPT ); Tue, 1 Sep 2015 06:00:49 -0400 Received: from lucky1.263xmail.com ([211.157.147.131]:51223 "EHLO lucky1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755460AbbIAKAr (ORCPT ); Tue, 1 Sep 2015 06:00:47 -0400 X-263anti-spam: KSV:0; X-MAIL-GRAY: 1 X-MAIL-DELIVERY: 0 X-KSVirus-check: 0 X-ABS-CHECKED: 4 X-ADDR-CHECKED: 0 X-RL-SENDER: shawn.lin@rock-chips.com X-FST-TO: vinod.koul@intel.com X-SENDER-IP: 58.22.7.114 X-LOGIN-NAME: shawn.lin@rock-chips.com X-UNIQUE-TAG: X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 From: Shawn Lin To: Vinod Koul , Heiko Stuebner , Jaroslav Kysela , Takashi Iwai , Mark Brown Cc: Doug Anderson , Olof Johansson , Sonny Rao , Addy Ke , dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, alsa-devel@alsa-project.org, linux-spi@vger.kernel.org, Yiwei Cai , Shawn Lin , Jianqun Xu , Olof Johansson Subject: [PATCH v3 9/9] ASoC: rockchip_i2s: modify DMA max burst to 1 Date: Tue, 1 Sep 2015 17:59:24 +0800 Message-Id: <1441101564-1765-1-git-send-email-shawn.lin@rock-chips.com> X-Mailer: git-send-email 1.8.0 In-Reply-To: <1441101381-1329-1-git-send-email-shawn.lin@rock-chips.com> References: <1441101381-1329-1-git-send-email-shawn.lin@rock-chips.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Yiwei Cai Test with command - arecord -D hw:0,0 /tmp/a.wav, there are the error dump: [ 134.899396] dma-pl330 ffb20000.dma-controller: fill_queue:2251 Bad Desc(7) This error is happening when no a multiple of burst size * burst length are coming in. The root cause is pl330 dma controller on Rockchips' platform cannot support DMAFLUSHP instruction which make dma to flush the req of non-aligned or non-multiple of what we set before. The saftest way is to set dma max burst to 1. Signed-off-by: Yiwei Cai Fixes: 4495c89fc ("ASoC: add driver for Rockchip RK3xxx I2S") Signed-off-by: Shawn Lin cc: Addy Ke cc: Jianqun Xu cc: Heiko Stuebner cc: Olof Johansson cc: Doug Anderson cc: Sonny Rao --- Changes in v3: None Changes in v2: None Changes in v1: None sound/soc/rockchip/rockchip_i2s.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c index acb5be5..5d35b2c 100644 --- a/sound/soc/rockchip/rockchip_i2s.c +++ b/sound/soc/rockchip/rockchip_i2s.c @@ -457,13 +457,19 @@ static int rockchip_i2s_probe(struct platform_device *pdev) return PTR_ERR(i2s->regmap); } + if (of_property_read_bool(np, "rockchip,i2s-broken-burst-len")) { + i2s->playback_dma_data.maxburst = 1; + i2s->capture_dma_data.maxburst = 1; + } else { + i2s->playback_dma_data.maxburst = 4; + i2s->capture_dma_data.maxburst = 4; + } + i2s->playback_dma_data.addr = res->start + I2S_TXDR; i2s->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; - i2s->playback_dma_data.maxburst = 4; i2s->capture_dma_data.addr = res->start + I2S_RXDR; i2s->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; - i2s->capture_dma_data.maxburst = 4; i2s->dev = &pdev->dev; dev_set_drvdata(&pdev->dev, i2s); -- 2.3.7 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Shawn Lin Subject: [PATCH v3 9/9] ASoC: rockchip_i2s: modify DMA max burst to 1 Date: Tue, 1 Sep 2015 17:59:24 +0800 Message-ID: <1441101564-1765-1-git-send-email-shawn.lin@rock-chips.com> References: <1441101381-1329-1-git-send-email-shawn.lin@rock-chips.com> Cc: Doug Anderson , Olof Johansson , Sonny Rao , Addy Ke , dmaengine-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw@public.gmane.org, linux-spi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Yiwei Cai , Shawn Lin , Jianqun Xu , Olof Johansson To: Vinod Koul , Heiko Stuebner , Jaroslav Kysela , Takashi Iwai , Mark Brown Return-path: In-Reply-To: <1441101381-1329-1-git-send-email-shawn.lin-TNX95d0MmH7DzftRWevZcw@public.gmane.org> Sender: linux-spi-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org List-ID: From: Yiwei Cai Test with command - arecord -D hw:0,0 /tmp/a.wav, there are the error dump: [ 134.899396] dma-pl330 ffb20000.dma-controller: fill_queue:2251 Bad Desc(7) This error is happening when no a multiple of burst size * burst length are coming in. The root cause is pl330 dma controller on Rockchips' platform cannot support DMAFLUSHP instruction which make dma to flush the req of non-aligned or non-multiple of what we set before. The saftest way is to set dma max burst to 1. Signed-off-by: Yiwei Cai Fixes: 4495c89fc ("ASoC: add driver for Rockchip RK3xxx I2S") Signed-off-by: Shawn Lin cc: Addy Ke cc: Jianqun Xu cc: Heiko Stuebner cc: Olof Johansson cc: Doug Anderson cc: Sonny Rao --- Changes in v3: None Changes in v2: None Changes in v1: None sound/soc/rockchip/rockchip_i2s.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c index acb5be5..5d35b2c 100644 --- a/sound/soc/rockchip/rockchip_i2s.c +++ b/sound/soc/rockchip/rockchip_i2s.c @@ -457,13 +457,19 @@ static int rockchip_i2s_probe(struct platform_device *pdev) return PTR_ERR(i2s->regmap); } + if (of_property_read_bool(np, "rockchip,i2s-broken-burst-len")) { + i2s->playback_dma_data.maxburst = 1; + i2s->capture_dma_data.maxburst = 1; + } else { + i2s->playback_dma_data.maxburst = 4; + i2s->capture_dma_data.maxburst = 4; + } + i2s->playback_dma_data.addr = res->start + I2S_TXDR; i2s->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; - i2s->playback_dma_data.maxburst = 4; i2s->capture_dma_data.addr = res->start + I2S_RXDR; i2s->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; - i2s->capture_dma_data.maxburst = 4; i2s->dev = &pdev->dev; dev_set_drvdata(&pdev->dev, i2s); -- 2.3.7 -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html From mboxrd@z Thu Jan 1 00:00:00 1970 From: shawn.lin@rock-chips.com (Shawn Lin) Date: Tue, 1 Sep 2015 17:59:24 +0800 Subject: [PATCH v3 9/9] ASoC: rockchip_i2s: modify DMA max burst to 1 In-Reply-To: <1441101381-1329-1-git-send-email-shawn.lin@rock-chips.com> References: <1441101381-1329-1-git-send-email-shawn.lin@rock-chips.com> Message-ID: <1441101564-1765-1-git-send-email-shawn.lin@rock-chips.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org From: Yiwei Cai Test with command - arecord -D hw:0,0 /tmp/a.wav, there are the error dump: [ 134.899396] dma-pl330 ffb20000.dma-controller: fill_queue:2251 Bad Desc(7) This error is happening when no a multiple of burst size * burst length are coming in. The root cause is pl330 dma controller on Rockchips' platform cannot support DMAFLUSHP instruction which make dma to flush the req of non-aligned or non-multiple of what we set before. The saftest way is to set dma max burst to 1. Signed-off-by: Yiwei Cai Fixes: 4495c89fc ("ASoC: add driver for Rockchip RK3xxx I2S") Signed-off-by: Shawn Lin cc: Addy Ke cc: Jianqun Xu cc: Heiko Stuebner cc: Olof Johansson cc: Doug Anderson cc: Sonny Rao --- Changes in v3: None Changes in v2: None Changes in v1: None sound/soc/rockchip/rockchip_i2s.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c index acb5be5..5d35b2c 100644 --- a/sound/soc/rockchip/rockchip_i2s.c +++ b/sound/soc/rockchip/rockchip_i2s.c @@ -457,13 +457,19 @@ static int rockchip_i2s_probe(struct platform_device *pdev) return PTR_ERR(i2s->regmap); } + if (of_property_read_bool(np, "rockchip,i2s-broken-burst-len")) { + i2s->playback_dma_data.maxburst = 1; + i2s->capture_dma_data.maxburst = 1; + } else { + i2s->playback_dma_data.maxburst = 4; + i2s->capture_dma_data.maxburst = 4; + } + i2s->playback_dma_data.addr = res->start + I2S_TXDR; i2s->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; - i2s->playback_dma_data.maxburst = 4; i2s->capture_dma_data.addr = res->start + I2S_RXDR; i2s->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; - i2s->capture_dma_data.maxburst = 4; i2s->dev = &pdev->dev; dev_set_drvdata(&pdev->dev, i2s); -- 2.3.7