Messages in this thread | | | Date | Wed, 27 Jul 2022 19:08:35 +0530 | Subject | Re: [PATCH] ASoC: codecs: va-macro: use fsgen as clock | From | Srinivasa Rao Mandadapu <> |
| |
Thanks for the Patch Srini!!!
On 7/27/2022 6:17 PM, Srinivas Kandagatla wrote: > VA Macro fsgen clock is supplied to other LPASS Macros using proper > clock apis, however the internal user uses the registers directly without > clk apis. This approch has race condition where in external users of > the clock might cut the clock while VA macro is actively using this. > > Moving the internal usage to clk apis would provide a proper refcounting > and avoid such race conditions. > > This issue was noticed while headset was pulled out while recording is > in progress and shifting record patch to DMIC. > > Reported-by: Srinivasa Rao Mandadapu <quic_srivasam@quicinc.com> > Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> > --- This is verified on SC7280 based platform.
Tested-by: Srinivasa Rao Mandadapu <quic_srivasam@quicinc.com>
> sound/soc/codecs/lpass-va-macro.c | 11 +++++++++-- > 1 file changed, 9 insertions(+), 2 deletions(-) > > diff --git a/sound/soc/codecs/lpass-va-macro.c b/sound/soc/codecs/lpass-va-macro.c > index d18b56e60433..1ea10dc70748 100644 > --- a/sound/soc/codecs/lpass-va-macro.c > +++ b/sound/soc/codecs/lpass-va-macro.c > @@ -199,6 +199,7 @@ struct va_macro { > struct clk *mclk; > struct clk *macro; > struct clk *dcodec; > + struct clk *fsgen; > struct clk_hw hw; > struct lpass_macro *pds; > > @@ -467,9 +468,9 @@ static int va_macro_mclk_event(struct snd_soc_dapm_widget *w, > > switch (event) { > case SND_SOC_DAPM_PRE_PMU: > - return va_macro_mclk_enable(va, true); > + return clk_prepare_enable(va->fsgen); > case SND_SOC_DAPM_POST_PMD: > - return va_macro_mclk_enable(va, false); > + clk_disable_unprepare(va->fsgen); > } > > return 0; > @@ -1473,6 +1474,12 @@ static int va_macro_probe(struct platform_device *pdev) > if (ret) > goto err_clkout; > > + va->fsgen = clk_hw_get_clk(&va->hw, "fsgen"); > + if (IS_ERR(va->fsgen)) { > + ret = PTR_ERR(va->fsgen); > + goto err_clkout; > + } > + > ret = devm_snd_soc_register_component(dev, &va_macro_component_drv, > va_macro_dais, > ARRAY_SIZE(va_macro_dais));
| |