[alsa-devel] [PATCH] ASoC: msm8916-wcd-digital: Reset RX interpolation path after use

Stephan Gerhold stephan at gerhold.net
Mon Jan 13 14:10:34 CET 2020


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 at linaro.org>
> > Signed-off-by: Stephan Gerhold <stephan at 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;
> >   }
> > 


More information about the Alsa-devel mailing list