[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