[alsa-devel] [PATCH 0/2] ASoC: sam9x5_wm8731: fix left right channel swap issue
This patch series fix sam9x5 wm8731 playback left right channel swap issue However, sam9x5 and wm8731 only can work in DSP A mode while can not work in I2S mode.
Bo Shen (2): ASoC: atmel_ssc_dai: add dai trigger ops ASoC: sam9x5_wm8731: change to work in DSP A mode
sound/soc/atmel/atmel_ssc_dai.c | 30 +++++++++++++++++++++++++++++- sound/soc/atmel/sam9x5_wm8731.c | 2 +- 2 files changed, 30 insertions(+), 2 deletions(-)
According to the SSC specifiation, it should be enabled after DMA is enabled. So, add trigger operation to make sure the right sequence.
Signed-off-by: Bo Shen voice.shen@atmel.com --- sound/soc/atmel/atmel_ssc_dai.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-)
diff --git a/sound/soc/atmel/atmel_ssc_dai.c b/sound/soc/atmel/atmel_ssc_dai.c index 8697ced..1ead3c9 100644 --- a/sound/soc/atmel/atmel_ssc_dai.c +++ b/sound/soc/atmel/atmel_ssc_dai.c @@ -648,7 +648,7 @@ static int atmel_ssc_prepare(struct snd_pcm_substream *substream,
dma_params = ssc_p->dma_params[dir];
- ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_enable); + ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_disable); ssc_writel(ssc_p->ssc->regs, IDR, dma_params->mask->ssc_error);
pr_debug("%s enabled SSC_SR=0x%08x\n", @@ -657,6 +657,33 @@ static int atmel_ssc_prepare(struct snd_pcm_substream *substream, return 0; }
+static int atmel_ssc_trigger(struct snd_pcm_substream *substream, + int cmd, struct snd_soc_dai *dai) +{ + struct atmel_ssc_info *ssc_p = &ssc_info[dai->id]; + struct atmel_pcm_dma_params *dma_params; + int dir; + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + dir = 0; + else + dir = 1; + + dma_params = ssc_p->dma_params[dir]; + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_RESUME: + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: + ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_enable); + break; + default: + ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_disable); + break; + } + + return 0; +}
#ifdef CONFIG_PM static int atmel_ssc_suspend(struct snd_soc_dai *cpu_dai) @@ -731,6 +758,7 @@ static const struct snd_soc_dai_ops atmel_ssc_dai_ops = { .startup = atmel_ssc_startup, .shutdown = atmel_ssc_shutdown, .prepare = atmel_ssc_prepare, + .trigger = atmel_ssc_trigger, .hw_params = atmel_ssc_hw_params, .set_fmt = atmel_ssc_set_dai_fmt, .set_clkdiv = atmel_ssc_set_dai_clkdiv,
On 04/12/2013 03:37, Bo Shen wrote:
According to the SSC specifiation, it should be enabled after DMA is enabled. So, add trigger operation to make sure the right sequence.
Signed-off-by: Bo Shen voice.shen@atmel.com
sound/soc/atmel/atmel_ssc_dai.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-)
diff --git a/sound/soc/atmel/atmel_ssc_dai.c b/sound/soc/atmel/atmel_ssc_dai.c index 8697ced..1ead3c9 100644 --- a/sound/soc/atmel/atmel_ssc_dai.c +++ b/sound/soc/atmel/atmel_ssc_dai.c @@ -648,7 +648,7 @@ static int atmel_ssc_prepare(struct snd_pcm_substream *substream,
dma_params = ssc_p->dma_params[dir];
- ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_enable);
ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_disable); ssc_writel(ssc_p->ssc->regs, IDR, dma_params->mask->ssc_error);
pr_debug("%s enabled SSC_SR=0x%08x\n",
@@ -657,6 +657,33 @@ static int atmel_ssc_prepare(struct snd_pcm_substream *substream, return 0; }
+static int atmel_ssc_trigger(struct snd_pcm_substream *substream,
int cmd, struct snd_soc_dai *dai)
+{
- struct atmel_ssc_info *ssc_p = &ssc_info[dai->id];
- struct atmel_pcm_dma_params *dma_params;
- int dir;
- if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
dir = 0;
- else
dir = 1;
- dma_params = ssc_p->dma_params[dir];
- switch (cmd) {
- case SNDRV_PCM_TRIGGER_START:
- case SNDRV_PCM_TRIGGER_RESUME:
- case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_enable);
break;
- default:
ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_disable);
break;
- }
- return 0;
+}
#ifdef CONFIG_PM static int atmel_ssc_suspend(struct snd_soc_dai *cpu_dai) @@ -731,6 +758,7 @@ static const struct snd_soc_dai_ops atmel_ssc_dai_ops = { .startup = atmel_ssc_startup, .shutdown = atmel_ssc_shutdown, .prepare = atmel_ssc_prepare,
- .trigger = atmel_ssc_trigger, .hw_params = atmel_ssc_hw_params, .set_fmt = atmel_ssc_set_dai_fmt, .set_clkdiv = atmel_ssc_set_dai_clkdiv,
Tested-by: Richard Genoud richard.genoud@gmail.com on at91sam9g35-ek with 3.12-rc2 + "ASoC: wm8731: fix dsp mode configuration"
On Wed, Dec 04, 2013 at 10:37:03AM +0800, Bo Shen wrote:
According to the SSC specifiation, it should be enabled after DMA is enabled. So, add trigger operation to make sure the right sequence.
Applied, thanks.
Change sam9x5 with wm8731 work in DSP A mode, this will fix the left/right channel swap issue.
Signed-off-by: Bo Shen voice.shen@atmel.com --- sound/soc/atmel/sam9x5_wm8731.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sound/soc/atmel/sam9x5_wm8731.c b/sound/soc/atmel/sam9x5_wm8731.c index 992ae38..06c1811 100644 --- a/sound/soc/atmel/sam9x5_wm8731.c +++ b/sound/soc/atmel/sam9x5_wm8731.c @@ -107,7 +107,7 @@ static int sam9x5_wm8731_driver_probe(struct platform_device *pdev) dai->stream_name = "WM8731 PCM"; dai->codec_dai_name = "wm8731-hifi"; dai->init = sam9x5_wm8731_init; - dai->dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF + dai->dai_fmt = SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM;
ret = snd_soc_of_parse_card_name(card, "atmel,model");
On 04/12/2013 03:37, Bo Shen wrote:
Change sam9x5 with wm8731 work in DSP A mode, this will fix the left/right channel swap issue.
Signed-off-by: Bo Shen voice.shen@atmel.com
sound/soc/atmel/sam9x5_wm8731.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sound/soc/atmel/sam9x5_wm8731.c b/sound/soc/atmel/sam9x5_wm8731.c index 992ae38..06c1811 100644 --- a/sound/soc/atmel/sam9x5_wm8731.c +++ b/sound/soc/atmel/sam9x5_wm8731.c @@ -107,7 +107,7 @@ static int sam9x5_wm8731_driver_probe(struct platform_device *pdev) dai->stream_name = "WM8731 PCM"; dai->codec_dai_name = "wm8731-hifi"; dai->init = sam9x5_wm8731_init;
- dai->dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
dai->dai_fmt = SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM;
ret = snd_soc_of_parse_card_name(card, "atmel,model");
Tested-by: Richard Genoud richard.genoud@gmail.com on at91sam9g35-ek with 3.12-rc2 + "ASoC: wm8731: fix dsp mode configuration"
Thanks !
Richard,
-----Original Message----- From: linux-arm-kernel [mailto:linux-arm-kernel- bounces@lists.infradead.org] On Behalf Of Richard Genoud Sent: Wednesday, December 04, 2013 6:38 AM To: Bo Shen Cc: zql@glomationinc.com; nicolas.ferre@atmel.com; alsa-devel@alsa- project.org; linux-sound@vger.kernel.org; broonie@kernel.org; linux- arm-kernel@lists.infradead.org Subject: Re: [PATCH 2/2] ASoC: sam9x5_wm8731: change to work in DSP A mode
On 04/12/2013 03:37, Bo Shen wrote:
Change sam9x5 with wm8731 work in DSP A mode, this will fix the left/right channel swap issue.
Tested-by: Richard Genoud richard.genoud@gmail.com on at91sam9g35-ek with 3.12-rc2 + "ASoC: wm8731: fix dsp mode configuration"
Thanks !
Where can I get a snap shot of your kernel source? My test still have the same issue after I applied the two patches.
Thanks,
Zhong
2013/12/4 Zhong Li zql@glomationinc.com:
Richard,
-----Original Message----- From: linux-arm-kernel [mailto:linux-arm-kernel- bounces@lists.infradead.org] On Behalf Of Richard Genoud Sent: Wednesday, December 04, 2013 6:38 AM To: Bo Shen Cc: zql@glomationinc.com; nicolas.ferre@atmel.com; alsa-devel@alsa- project.org; linux-sound@vger.kernel.org; broonie@kernel.org; linux- arm-kernel@lists.infradead.org Subject: Re: [PATCH 2/2] ASoC: sam9x5_wm8731: change to work in DSP A mode
On 04/12/2013 03:37, Bo Shen wrote:
Change sam9x5 with wm8731 work in DSP A mode, this will fix the left/right channel swap issue.
Tested-by: Richard Genoud richard.genoud@gmail.com on at91sam9g35-ek with 3.12-rc2 + "ASoC: wm8731: fix dsp mode configuration"
Thanks !
Where can I get a snap shot of your kernel source? My test still have the same issue after I applied the two patches.
I don't have a public git, but I just applied the patches : "ASoC: wm8731: fix dsp mode configuration" "ASoC: sam9x5_wm8731: change to work in DSP A mode" "ASoC: atmel_ssc_dai: add dai trigger ops" on top of 3.12-rc2 => maybe you missed the third patch "ASoC: wm8731: fix dsp mode configuration" which was not part of the serie. (without it, you should have a left channel almost ok and a noisy right channel)
and if you want a git tree, you can still test with mark's : git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git branch sound_asoc/for-next or tag asoc-v3.13-rc2
participants (4)
-
Bo Shen
-
Mark Brown
-
Richard Genoud
-
Zhong Li