ASoC: codecs: va-macro: use fsgen as clock
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> Tested-by: Srinivasa Rao Mandadapu <quic_srivasam@quicinc.com> Link: https://lore.kernel.org/r/20220727124749.4604-1-srinivas.kandagatla@linaro.org Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
bd1963d837
commit
30097967e0
|
@ -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));
|
||||
|
|
Loading…
Reference in New Issue