Alsa-Devel Archive on lore.kernel.org
 help / color / Atom feed
* [alsa-devel] [PATCH] ASoC: msm8916-wcd-digital: Reset RX interpolation path after use
@ 2020-01-05 10:27 Stephan Gerhold
  2020-01-13 11:30 ` Srinivas Kandagatla
  2020-01-13 15:12 ` [alsa-devel] Applied "ASoC: msm8916-wcd-digital: Reset RX interpolation path after use" to the asoc tree Mark Brown
  0 siblings, 2 replies; 5+ messages in thread
From: Stephan Gerhold @ 2020-01-05 10:27 UTC (permalink / raw)
  To: Mark Brown
  Cc: alsa-devel, Stephan Gerhold, Takashi Iwai, Liam Girdwood,
	Srinivas Kandagatla, ~postmarketos/upstreaming

For some reason, attempting to route audio through QDSP6 on MSM8916
causes the RX interpolation path to get "stuck" after playing audio
a few times. In this situation, the analog codec part is still working,
but the RX path in the digital codec stops working, so you only hear
the analog parts powering up. After a reboot everything works again.

So far I was not able to reproduce the problem when using lpass-cpu.

The downstream kernel driver avoids this by resetting the RX
interpolation path after use. In mainline we do something similar
for the TX decimator (LPASS_CDC_CLK_TX_RESET_B1_CTL), but the
interpolator reset (LPASS_CDC_CLK_RX_RESET_CTL) got lost when the
msm8916-wcd driver was split into analog and digital.

Fix this problem by adding the reset to
msm8916_wcd_digital_enable_interpolator().

Fixes: 150db8c5afa1 ("ASoC: codecs: Add msm8916-wcd digital codec")
Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
---
Tested on msm8916-samsung-a5u:
  - qdsp6 does no longer stop working after playing audio a few times
  - lpass-cpu is still working fine (no difference)
---
 sound/soc/codecs/msm8916-wcd-digital.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/sound/soc/codecs/msm8916-wcd-digital.c b/sound/soc/codecs/msm8916-wcd-digital.c
index 58b2468fb2a7..09fccacadd6b 100644
--- a/sound/soc/codecs/msm8916-wcd-digital.c
+++ b/sound/soc/codecs/msm8916-wcd-digital.c
@@ -586,6 +586,12 @@ static int msm8916_wcd_digital_enable_interpolator(
 		snd_soc_component_write(component, rx_gain_reg[w->shift],
 			      snd_soc_component_read32(component, rx_gain_reg[w->shift]));
 		break;
+	case SND_SOC_DAPM_POST_PMD:
+		snd_soc_component_update_bits(component, LPASS_CDC_CLK_RX_RESET_CTL,
+					      1 << w->shift, 1 << w->shift);
+		snd_soc_component_update_bits(component, LPASS_CDC_CLK_RX_RESET_CTL,
+					      1 << w->shift, 0x0);
+		break;
 	}
 	return 0;
 }
-- 
2.24.1

_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
https://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [alsa-devel] [PATCH] ASoC: msm8916-wcd-digital: Reset RX interpolation path after use
  2020-01-05 10:27 [alsa-devel] [PATCH] ASoC: msm8916-wcd-digital: Reset RX interpolation path after use Stephan Gerhold
@ 2020-01-13 11:30 ` Srinivas Kandagatla
  2020-01-13 13:10   ` Stephan Gerhold
  2020-01-13 15:12 ` [alsa-devel] Applied "ASoC: msm8916-wcd-digital: Reset RX interpolation path after use" to the asoc tree Mark Brown
  1 sibling, 1 reply; 5+ messages in thread
From: Srinivas Kandagatla @ 2020-01-13 11:30 UTC (permalink / raw)
  To: Stephan Gerhold, Mark Brown
  Cc: alsa-devel, Takashi Iwai, Liam Girdwood, ~postmarketos/upstreaming



On 05/01/2020 10:27, Stephan Gerhold wrote:
> For some reason, attempting to route audio through QDSP6 on MSM8916
> causes the RX interpolation path to get "stuck" after playing audio
> a few times. In this situation, the analog codec part is still working,
> but the RX path in the digital codec stops working, so you only hear
> the analog parts powering up. After a reboot everything works again.
> 
> So far I was not able to reproduce the problem when using lpass-cpu.
> 
> The downstream kernel driver avoids this by resetting the RX
> interpolation path after use. In mainline we do something similar
> for the TX decimator (LPASS_CDC_CLK_TX_RESET_B1_CTL), but the
> interpolator reset (LPASS_CDC_CLK_RX_RESET_CTL) got lost when the
> msm8916-wcd driver was split into analog and digital.
> 
> Fix this problem by adding the reset to
> msm8916_wcd_digital_enable_interpolator().
> 
> Fixes: 150db8c5afa1 ("ASoC: codecs: Add msm8916-wcd digital codec")
> Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
> Signed-off-by: Stephan Gerhold <stephan@gerhold.net>

Thanks for the patch and testing it with QDSP6.

> ---
> Tested on msm8916-samsung-a5u:
>    - qdsp6 does no longer stop working after playing audio a few times
>    - lpass-cpu is still working fine (no difference)
> ---
>   sound/soc/codecs/msm8916-wcd-digital.c | 6 ++++++
>   1 file changed, 6 insertions(+)
> 
> diff --git a/sound/soc/codecs/msm8916-wcd-digital.c b/sound/soc/codecs/msm8916-wcd-digital.c
> index 58b2468fb2a7..09fccacadd6b 100644
> --- a/sound/soc/codecs/msm8916-wcd-digital.c
> +++ b/sound/soc/codecs/msm8916-wcd-digital.c
> @@ -586,6 +586,12 @@ static int msm8916_wcd_digital_enable_interpolator(
>   		snd_soc_component_write(component, rx_gain_reg[w->shift],
>   			      snd_soc_component_read32(component, rx_gain_reg[w->shift]));
>   		break;
> +	case SND_SOC_DAPM_POST_PMD:

We should do this in SND_SOC_DAPM_PRE_PMU rather than in power down 
sequence.


> +		snd_soc_component_update_bits(component, LPASS_CDC_CLK_RX_RESET_CTL,
> +					      1 << w->shift, 1 << w->shift);
> +		snd_soc_component_update_bits(component, LPASS_CDC_CLK_RX_RESET_CTL,
> +					      1 << w->shift, 0x0);
> +		break;
>   	}
>   	return 0;
>   }
> 
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
https://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [alsa-devel] [PATCH] ASoC: msm8916-wcd-digital: Reset RX interpolation path after use
  2020-01-13 11:30 ` Srinivas Kandagatla
@ 2020-01-13 13:10   ` Stephan Gerhold
  2020-01-13 13:55     ` Srinivas Kandagatla
  0 siblings, 1 reply; 5+ messages in thread
From: Stephan Gerhold @ 2020-01-13 13:10 UTC (permalink / raw)
  To: Srinivas Kandagatla
  Cc: alsa-devel, Takashi Iwai, Liam Girdwood, Mark Brown,
	~postmarketos/upstreaming

On Mon, Jan 13, 2020 at 11:30:48AM +0000, Srinivas Kandagatla wrote:
> 
> 
> On 05/01/2020 10:27, Stephan Gerhold wrote:
> > For some reason, attempting to route audio through QDSP6 on MSM8916
> > causes the RX interpolation path to get "stuck" after playing audio
> > a few times. In this situation, the analog codec part is still working,
> > but the RX path in the digital codec stops working, so you only hear
> > the analog parts powering up. After a reboot everything works again.
> > 
> > So far I was not able to reproduce the problem when using lpass-cpu.
> > 
> > The downstream kernel driver avoids this by resetting the RX
> > interpolation path after use. In mainline we do something similar
> > for the TX decimator (LPASS_CDC_CLK_TX_RESET_B1_CTL), but the
> > interpolator reset (LPASS_CDC_CLK_RX_RESET_CTL) got lost when the
> > msm8916-wcd driver was split into analog and digital.
> > 
> > Fix this problem by adding the reset to
> > msm8916_wcd_digital_enable_interpolator().
> > 
> > Fixes: 150db8c5afa1 ("ASoC: codecs: Add msm8916-wcd digital codec")
> > Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
> > Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
> 
> Thanks for the patch and testing it with QDSP6.
> 
> > ---
> > Tested on msm8916-samsung-a5u:
> >    - qdsp6 does no longer stop working after playing audio a few times
> >    - lpass-cpu is still working fine (no difference)
> > ---
> >   sound/soc/codecs/msm8916-wcd-digital.c | 6 ++++++
> >   1 file changed, 6 insertions(+)
> > 
> > diff --git a/sound/soc/codecs/msm8916-wcd-digital.c b/sound/soc/codecs/msm8916-wcd-digital.c
> > index 58b2468fb2a7..09fccacadd6b 100644
> > --- a/sound/soc/codecs/msm8916-wcd-digital.c
> > +++ b/sound/soc/codecs/msm8916-wcd-digital.c
> > @@ -586,6 +586,12 @@ static int msm8916_wcd_digital_enable_interpolator(
> >   		snd_soc_component_write(component, rx_gain_reg[w->shift],
> >   			      snd_soc_component_read32(component, rx_gain_reg[w->shift]));
> >   		break;
> > +	case SND_SOC_DAPM_POST_PMD:
> 
> We should do this in SND_SOC_DAPM_PRE_PMU rather than in power down
> sequence.
> 

Thanks for the suggestion! Any particular reason for this?

I used earlier versions of your msm8916-wcd patch series and the
downstream driver as a base, and it does this in POST_PMD:

https://source.codeaurora.org/quic/la/kernel/msm-3.10/tree/sound/soc/codecs/msm8x16-wcd.c?h=LA.BR.1.2.9.1-02310-8x16.0#n3773

For msm8916_wcd_digital_enable_dec() we also do it in POST_PMD:

	/* ... */
	case SND_SOC_DAPM_POST_PMD:
		snd_soc_component_update_bits(component, dec_reset_reg, 1 << w->shift,
				    1 << w->shift);
		snd_soc_component_update_bits(component, dec_reset_reg, 1 << w->shift, 0x0);
		/* ... */

I don't mind testing if moving it to PRE_PMU works, I'm just wondering
if doing it in PRE_PMU has any advantages. 

> 
> > +		snd_soc_component_update_bits(component, LPASS_CDC_CLK_RX_RESET_CTL,
> > +					      1 << w->shift, 1 << w->shift);
> > +		snd_soc_component_update_bits(component, LPASS_CDC_CLK_RX_RESET_CTL,
> > +					      1 << w->shift, 0x0);
> > +		break;
> >   	}
> >   	return 0;
> >   }
> > 
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
https://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [alsa-devel] [PATCH] ASoC: msm8916-wcd-digital: Reset RX interpolation path after use
  2020-01-13 13:10   ` Stephan Gerhold
@ 2020-01-13 13:55     ` Srinivas Kandagatla
  0 siblings, 0 replies; 5+ messages in thread
From: Srinivas Kandagatla @ 2020-01-13 13:55 UTC (permalink / raw)
  To: Stephan Gerhold
  Cc: alsa-devel, Takashi Iwai, Liam Girdwood, Mark Brown,
	~postmarketos/upstreaming



On 13/01/2020 13:10, Stephan Gerhold wrote:
> On Mon, Jan 13, 2020 at 11:30:48AM +0000, Srinivas Kandagatla wrote:
>>
>>
>> On 05/01/2020 10:27, Stephan Gerhold wrote:
>>> For some reason, attempting to route audio through QDSP6 on MSM8916
>>> causes the RX interpolation path to get "stuck" after playing audio
>>> a few times. In this situation, the analog codec part is still working,
>>> but the RX path in the digital codec stops working, so you only hear
>>> the analog parts powering up. After a reboot everything works again.
>>>
>>> So far I was not able to reproduce the problem when using lpass-cpu.
>>>
>>> The downstream kernel driver avoids this by resetting the RX
>>> interpolation path after use. In mainline we do something similar
>>> for the TX decimator (LPASS_CDC_CLK_TX_RESET_B1_CTL), but the
>>> interpolator reset (LPASS_CDC_CLK_RX_RESET_CTL) got lost when the
>>> msm8916-wcd driver was split into analog and digital.
>>>
>>> Fix this problem by adding the reset to
>>> msm8916_wcd_digital_enable_interpolator().
>>>
>>> Fixes: 150db8c5afa1 ("ASoC: codecs: Add msm8916-wcd digital codec")
>>> Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
>>> Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
>>
>> Thanks for the patch and testing it with QDSP6.
>>
>>> ---
>>> Tested on msm8916-samsung-a5u:
>>>     - qdsp6 does no longer stop working after playing audio a few times
>>>     - lpass-cpu is still working fine (no difference)
>>> ---
>>>    sound/soc/codecs/msm8916-wcd-digital.c | 6 ++++++
>>>    1 file changed, 6 insertions(+)
>>>
>>> diff --git a/sound/soc/codecs/msm8916-wcd-digital.c b/sound/soc/codecs/msm8916-wcd-digital.c
>>> index 58b2468fb2a7..09fccacadd6b 100644
>>> --- a/sound/soc/codecs/msm8916-wcd-digital.c
>>> +++ b/sound/soc/codecs/msm8916-wcd-digital.c
>>> @@ -586,6 +586,12 @@ static int msm8916_wcd_digital_enable_interpolator(
>>>    		snd_soc_component_write(component, rx_gain_reg[w->shift],
>>>    			      snd_soc_component_read32(component, rx_gain_reg[w->shift]));
>>>    		break;
>>> +	case SND_SOC_DAPM_POST_PMD:
>>
>> We should do this in SND_SOC_DAPM_PRE_PMU rather than in power down
>> sequence.
>>
> 
> Thanks for the suggestion! Any particular reason for this?
> 
> I used earlier versions of your msm8916-wcd patch series and the
> downstream driver as a base, and it does this in POST_PMD:

Normally I would have expected that we reset as part of up sequence and 
continue rather than during down.
Both of them will work!
For consistency reasons as we did this in down path for TX.

Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>

Thanks,
srini
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
https://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [alsa-devel] Applied "ASoC: msm8916-wcd-digital: Reset RX interpolation path after use" to the asoc tree
  2020-01-05 10:27 [alsa-devel] [PATCH] ASoC: msm8916-wcd-digital: Reset RX interpolation path after use Stephan Gerhold
  2020-01-13 11:30 ` Srinivas Kandagatla
@ 2020-01-13 15:12 ` Mark Brown
  1 sibling, 0 replies; 5+ messages in thread
From: Mark Brown @ 2020-01-13 15:12 UTC (permalink / raw)
  To: Stephan Gerhold
  Cc: alsa-devel, Takashi Iwai, Liam Girdwood, Mark Brown,
	Srinivas Kandagatla, ~postmarketos/upstreaming

The patch

   ASoC: msm8916-wcd-digital: Reset RX interpolation path after use

has been applied to the asoc tree at

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

From 85578bbd642f65065039b1765ebe1a867d5435b0 Mon Sep 17 00:00:00 2001
From: Stephan Gerhold <stephan@gerhold.net>
Date: Sun, 5 Jan 2020 11:27:53 +0100
Subject: [PATCH] ASoC: msm8916-wcd-digital: Reset RX interpolation path after
 use

For some reason, attempting to route audio through QDSP6 on MSM8916
causes the RX interpolation path to get "stuck" after playing audio
a few times. In this situation, the analog codec part is still working,
but the RX path in the digital codec stops working, so you only hear
the analog parts powering up. After a reboot everything works again.

So far I was not able to reproduce the problem when using lpass-cpu.

The downstream kernel driver avoids this by resetting the RX
interpolation path after use. In mainline we do something similar
for the TX decimator (LPASS_CDC_CLK_TX_RESET_B1_CTL), but the
interpolator reset (LPASS_CDC_CLK_RX_RESET_CTL) got lost when the
msm8916-wcd driver was split into analog and digital.

Fix this problem by adding the reset to
msm8916_wcd_digital_enable_interpolator().

Fixes: 150db8c5afa1 ("ASoC: codecs: Add msm8916-wcd digital codec")
Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Stephan Gerhold <stephan@gerhold.net>
Link: https://lore.kernel.org/r/20200105102753.83108-1-stephan@gerhold.net
Signed-off-by: Mark Brown <broonie@kernel.org>
---
 sound/soc/codecs/msm8916-wcd-digital.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/sound/soc/codecs/msm8916-wcd-digital.c b/sound/soc/codecs/msm8916-wcd-digital.c
index 58b2468fb2a7..09fccacadd6b 100644
--- a/sound/soc/codecs/msm8916-wcd-digital.c
+++ b/sound/soc/codecs/msm8916-wcd-digital.c
@@ -586,6 +586,12 @@ static int msm8916_wcd_digital_enable_interpolator(
 		snd_soc_component_write(component, rx_gain_reg[w->shift],
 			      snd_soc_component_read32(component, rx_gain_reg[w->shift]));
 		break;
+	case SND_SOC_DAPM_POST_PMD:
+		snd_soc_component_update_bits(component, LPASS_CDC_CLK_RX_RESET_CTL,
+					      1 << w->shift, 1 << w->shift);
+		snd_soc_component_update_bits(component, LPASS_CDC_CLK_RX_RESET_CTL,
+					      1 << w->shift, 0x0);
+		break;
 	}
 	return 0;
 }
-- 
2.20.1

_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
https://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, back to index

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-05 10:27 [alsa-devel] [PATCH] ASoC: msm8916-wcd-digital: Reset RX interpolation path after use Stephan Gerhold
2020-01-13 11:30 ` Srinivas Kandagatla
2020-01-13 13:10   ` Stephan Gerhold
2020-01-13 13:55     ` Srinivas Kandagatla
2020-01-13 15:12 ` [alsa-devel] Applied "ASoC: msm8916-wcd-digital: Reset RX interpolation path after use" to the asoc tree Mark Brown

Alsa-Devel Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/alsa-devel/0 alsa-devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 alsa-devel alsa-devel/ https://lore.kernel.org/alsa-devel \
		alsa-devel@alsa-project.org
	public-inbox-index alsa-devel

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.alsa-project.alsa-devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git