Re: [PATCH 5/8] ASoC: codecs: lpass: register mclk after runtime pm

From: Luca Weiss
Date: Fri Mar 24 2023 - 07:22:25 EST


Hi Srinivas,

On Thu Feb 9, 2023 at 1:28 PM CET, Srinivas Kandagatla wrote:
> move mclk out registration after runtime pm is enabled so that the
> clk framework can resume the codec if it requires to enable the mclk out.
>
> Fixes: c96baa2949b2 ("ASoC: codecs: wsa-macro: add runtime pm support")
> Fixes: 72ad25eabda0 ("ASoC: codecs: va-macro: add runtime pm support")
> Fixes: 366ff79ed539 ("ASoC: codecs: rx-macro: add runtime pm support")
> Fixes: 1fb83bc5cf64 ("ASoC: codecs: tx-macro: add runtime pm support")
> Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@xxxxxxxxxx>

I see the following remoteproc crash with this patch in on
sm6350/sm7225-fairphone-fp4.

To be clear, all the audio parts for that SoC are not upstream (yet) and
there's still many issues to solve so not sure if it's actually my fault.

Anyways, getting this crash after starting adsp.

[ 97.212943] qcom_q6v5_pas 3000000.remoteproc: fatal error received: ABT_dal.c:287:ABTimeout: AHB Bus hang is detected, Number of bus hang detected := 1 , addr0 = 0x3370000 , addr1 = 0x0!!!
[ 97.212995] remoteproc remoteproc0: crash detected in 3000000.remoteproc: type fatal error
[ 97.213015] remoteproc remoteproc0: handling crash #1 in 3000000.remoteproc
[ 97.213022] remoteproc remoteproc0: recovering 3000000.remoteproc

This happens just after some clocks on the adsp get disabled, this is
from my own debug prints:
[ 97.189097] q6afe_set_lpass_clock: clk_id=780, attri=1, clk_root=0, freq=0
[ 97.189426] q6afe_set_lpass_clock: clk_id=781, attri=1, clk_root=0, freq=0

And then a couple of seconds later the whole phone just crashes into the
900e mode.

Regards
Luca


> ---
> sound/soc/codecs/lpass-rx-macro.c | 8 ++++----
> sound/soc/codecs/lpass-tx-macro.c | 8 ++++----
> sound/soc/codecs/lpass-va-macro.c | 20 ++++++++++----------
> sound/soc/codecs/lpass-wsa-macro.c | 9 ++++-----
> 4 files changed, 22 insertions(+), 23 deletions(-)
>
> diff --git a/sound/soc/codecs/lpass-rx-macro.c b/sound/soc/codecs/lpass-rx-macro.c
> index a9ef9d5ffcc5..dd6970d5eb8d 100644
> --- a/sound/soc/codecs/lpass-rx-macro.c
> +++ b/sound/soc/codecs/lpass-rx-macro.c
> @@ -3601,10 +3601,6 @@ static int rx_macro_probe(struct platform_device *pdev)
> if (ret)
> goto err_fsgen;
>
> - ret = rx_macro_register_mclk_output(rx);
> - if (ret)
> - goto err_clkout;
> -
> ret = devm_snd_soc_register_component(dev, &rx_macro_component_drv,
> rx_macro_dai,
> ARRAY_SIZE(rx_macro_dai));
> @@ -3618,6 +3614,10 @@ static int rx_macro_probe(struct platform_device *pdev)
> pm_runtime_set_active(dev);
> pm_runtime_enable(dev);
>
> + ret = rx_macro_register_mclk_output(rx);
> + if (ret)
> + goto err_clkout;
> +
> return 0;
>
> err_clkout:
> diff --git a/sound/soc/codecs/lpass-tx-macro.c b/sound/soc/codecs/lpass-tx-macro.c
> index 2ef62d6edc30..b9475ba55e20 100644
> --- a/sound/soc/codecs/lpass-tx-macro.c
> +++ b/sound/soc/codecs/lpass-tx-macro.c
> @@ -2036,10 +2036,6 @@ static int tx_macro_probe(struct platform_device *pdev)
> if (ret)
> goto err_fsgen;
>
> - ret = tx_macro_register_mclk_output(tx);
> - if (ret)
> - goto err_clkout;
> -
> ret = devm_snd_soc_register_component(dev, &tx_macro_component_drv,
> tx_macro_dai,
> ARRAY_SIZE(tx_macro_dai));
> @@ -2052,6 +2048,10 @@ static int tx_macro_probe(struct platform_device *pdev)
> pm_runtime_set_active(dev);
> pm_runtime_enable(dev);
>
> + ret = tx_macro_register_mclk_output(tx);
> + if (ret)
> + goto err_clkout;
> +
> return 0;
>
> err_clkout:
> diff --git a/sound/soc/codecs/lpass-va-macro.c b/sound/soc/codecs/lpass-va-macro.c
> index b0b6cf29cba3..1623ba78ddb3 100644
> --- a/sound/soc/codecs/lpass-va-macro.c
> +++ b/sound/soc/codecs/lpass-va-macro.c
> @@ -1524,16 +1524,6 @@ static int va_macro_probe(struct platform_device *pdev)
> if (ret)
> goto err_mclk;
>
> - ret = va_macro_register_fsgen_output(va);
> - 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;
> - }
> -
> if (va->has_swr_master) {
> /* Set default CLK div to 1 */
> regmap_update_bits(va->regmap, CDC_VA_TOP_CSR_SWR_MIC_CTL0,
> @@ -1560,6 +1550,16 @@ static int va_macro_probe(struct platform_device *pdev)
> pm_runtime_set_active(dev);
> pm_runtime_enable(dev);
>
> + ret = va_macro_register_fsgen_output(va);
> + 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;
> + }
> +
> return 0;
>
> err_clkout:
> diff --git a/sound/soc/codecs/lpass-wsa-macro.c b/sound/soc/codecs/lpass-wsa-macro.c
> index 5cfe96f6e430..c0b86d69c72e 100644
> --- a/sound/soc/codecs/lpass-wsa-macro.c
> +++ b/sound/soc/codecs/lpass-wsa-macro.c
> @@ -2451,11 +2451,6 @@ static int wsa_macro_probe(struct platform_device *pdev)
> if (ret)
> goto err_fsgen;
>
> - ret = wsa_macro_register_mclk_output(wsa);
> - if (ret)
> - goto err_clkout;
> -
> -
> ret = devm_snd_soc_register_component(dev, &wsa_macro_component_drv,
> wsa_macro_dai,
> ARRAY_SIZE(wsa_macro_dai));
> @@ -2468,6 +2463,10 @@ static int wsa_macro_probe(struct platform_device *pdev)
> pm_runtime_set_active(dev);
> pm_runtime_enable(dev);
>
> + ret = wsa_macro_register_mclk_output(wsa);
> + if (ret)
> + goto err_clkout;
> +
> return 0;
>
> err_clkout:
> --
> 2.21.0