From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753096AbbINAFH (ORCPT ); Sun, 13 Sep 2015 20:05:07 -0400 Received: from lucky1.263xmail.com ([211.157.147.132]:42336 "EHLO lucky1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751893AbbINAFE (ORCPT ); Sun, 13 Sep 2015 20:05:04 -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 v5 10/10] ASoC: rockchip_i2s: modify DMA max burst to 1 Date: Mon, 14 Sep 2015 07:49:42 +0800 Message-Id: <1442188182-6181-1-git-send-email-shawn.lin@rock-chips.com> X-Mailer: git-send-email 1.8.0 In-Reply-To: <1442187923-5736-1-git-send-email-shawn.lin@rock-chips.com> References: <1442187923-5736-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: 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 cc: Mark Brown --- Changes in v5: - use switch statement for dma_quirk's manipulation Changes in v4: None Changes in v3: None Changes in v2: None Changes in v1: None sound/soc/rockchip/rockchip_i2s.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/sound/soc/rockchip/rockchip_i2s.c b/sound/soc/rockchip/rockchip_i2s.c index acb5be5..543d0c0 100644 --- a/sound/soc/rockchip/rockchip_i2s.c +++ b/sound/soc/rockchip/rockchip_i2s.c @@ -23,6 +23,8 @@ #define DRV_NAME "rockchip-i2s" +#define ROCKCHIP_I2S_BROKEN_BURST_LEN (1<<0) /* broken burst len */ + struct rk_i2s_dev { struct device *dev; @@ -418,6 +420,7 @@ static int rockchip_i2s_probe(struct platform_device *pdev) struct rk_i2s_dev *i2s; struct resource *res; void __iomem *regs; + int dma_quirk; int ret; i2s = devm_kzalloc(&pdev->dev, sizeof(*i2s), GFP_KERNEL); @@ -489,6 +492,24 @@ static int rockchip_i2s_probe(struct platform_device *pdev) goto err_pcm_register; } + dma_quirk = snd_dmaengine_pcm_get_quirks(&pdev->dev); + switch (dma_quirk) { + case ROCKCHIP_I2S_BROKEN_BURST_LEN: + /* + * Unfortunately, we find broken burst len here, + * just have to limit maxburst to ONE in order to avoid + * non-multiple burst len access fail the dmaengine if + * it can't support flush peripheral function. + */ + i2s->playback_dma_data.maxburst = 1; + i2s->capture_dma_data.maxburst = 1; + break; + default: + dev_info(&pdev->dev, "Default no dma_quirk!\n"); + break; + } + return 0; err_pcm_register: -- 2.3.7