On Thu, Dec 8, 2022 at 7:11 PM YC Hung <[email protected]> wrote:
>
> In MT8195 SOF design, both DSP and audio driver would access audio
> registers. Before DSP accesses audio registers, audio power and clock
> should be enabled. DSP will hang up if DSP access audio register but
> audio power and clock are disabled. Therefore, we add audio pm runtime
> active checking before accessing audio registers in SOF BE's callback
> hw_params function to avoid this situation.
>
> Signed-off-by: YC Hung <[email protected]>
Acked-by: Curtis Malainey <[email protected]>
> ---
> sound/soc/mediatek/mt8195/mt8195-mt6359.c | 30 +++++++++++++++++++++++
> 1 file changed, 30 insertions(+)
>
> diff --git a/sound/soc/mediatek/mt8195/mt8195-mt6359.c b/sound/soc/mediatek/mt8195/mt8195-mt6359.c
> index 61be66f47723..4682748d82be 100644
> --- a/sound/soc/mediatek/mt8195/mt8195-mt6359.c
> +++ b/sound/soc/mediatek/mt8195/mt8195-mt6359.c
> @@ -633,6 +633,32 @@ static const struct snd_soc_ops mt8195_rt1011_etdm_ops = {
> .hw_params = mt8195_rt1011_etdm_hw_params,
> };
>
> +static int mt8195_sof_be_hw_params(struct snd_pcm_substream *substream,
> + struct snd_pcm_hw_params *params)
> +{
> + struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
> + struct snd_soc_component *cmpnt_afe = NULL;
> + struct snd_soc_pcm_runtime *runtime;
> +
> + /* find afe component */
> + for_each_card_rtds(rtd->card, runtime) {
> + cmpnt_afe = snd_soc_rtdcom_lookup(runtime, AFE_PCM_NAME);
> + if (cmpnt_afe)
> + break;
> + }
> +
> + if (cmpnt_afe && !pm_runtime_active(cmpnt_afe->dev)) {
> + dev_err(rtd->dev, "afe pm runtime is not active!!\n");
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> +
> +static const struct snd_soc_ops mt8195_sof_be_ops = {
> + .hw_params = mt8195_sof_be_hw_params,
> +};
> +
> static int mt8195_rt1011_init(struct snd_soc_pcm_runtime *rtd)
> {
> struct snd_soc_card *card = rtd->card;
> @@ -1272,24 +1298,28 @@ static struct snd_soc_dai_link mt8195_mt6359_dai_links[] = {
> .name = "AFE_SOF_DL2",
> .no_pcm = 1,
> .dpcm_playback = 1,
> + .ops = &mt8195_sof_be_ops,
> SND_SOC_DAILINK_REG(AFE_SOF_DL2),
> },
> [DAI_LINK_SOF_DL3_BE] = {
> .name = "AFE_SOF_DL3",
> .no_pcm = 1,
> .dpcm_playback = 1,
> + .ops = &mt8195_sof_be_ops,
> SND_SOC_DAILINK_REG(AFE_SOF_DL3),
> },
> [DAI_LINK_SOF_UL4_BE] = {
> .name = "AFE_SOF_UL4",
> .no_pcm = 1,
> .dpcm_capture = 1,
> + .ops = &mt8195_sof_be_ops,
> SND_SOC_DAILINK_REG(AFE_SOF_UL4),
> },
> [DAI_LINK_SOF_UL5_BE] = {
> .name = "AFE_SOF_UL5",
> .no_pcm = 1,
> .dpcm_capture = 1,
> + .ops = &mt8195_sof_be_ops,
> SND_SOC_DAILINK_REG(AFE_SOF_UL5),
> },
> };
> --
> 2.18.0
>
Il 09/12/22 19:27, Curtis Malainey ha scritto:
> On Thu, Dec 8, 2022 at 7:11 PM YC Hung <[email protected]> wrote:
>>
>> In MT8195 SOF design, both DSP and audio driver would access audio
>> registers. Before DSP accesses audio registers, audio power and clock
>> should be enabled. DSP will hang up if DSP access audio register but
>> audio power and clock are disabled. Therefore, we add audio pm runtime
>> active checking before accessing audio registers in SOF BE's callback
>> hw_params function to avoid this situation.
>>
>> Signed-off-by: YC Hung <[email protected]>
>
> Acked-by: Curtis Malainey <[email protected]>
>
Reviewed-by: AngeloGioacchino Del Regno <[email protected]>