[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAOReqxh=27P7PogzhFr+37XBfRh5Nxu1x46JpdCH=ZRDVhRbeQ@mail.gmail.com>
Date: Fri, 9 Dec 2022 10:27:14 -0800
From: Curtis Malainey <cujomalainey@...gle.com>
To: YC Hung <yc.hung@...iatek.com>
Cc: Liam Girdwood <lgirdwood@...il.com>,
Mark Brown <broonie@...nel.org>,
Jaroslav Kysela <perex@...ex.cz>,
Takashi Iwai <tiwai@...e.com>,
Matthias Brugger <matthias.bgg@...il.com>,
Tzung-Bi Shih <tzungbi@...nel.org>,
AngeloGioacchino Del Regno
<angelogioacchino.delregno@...labora.com>,
Trevor Wu <trevor.wu@...iatek.com>,
"Nicolas F . R . A . Prado" <nfraprado@...labora.com>,
Jiaxin Yu <jiaxin.yu@...iatek.com>,
alsa-devel@...a-project.org, linux-arm-kernel@...ts.infradead.org,
linux-mediatek@...ts.infradead.org, linux-kernel@...r.kernel.org,
Curtis Malainey <cujomalainey@...omium.org>,
whalechang@...gle.com
Subject: Re: [PATCH] ASoC: mediatek: mt8195: add sof be ops to check audio active
On Thu, Dec 8, 2022 at 7:11 PM YC Hung <yc.hung@...iatek.com> 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 <yc.hung@...iatek.com>
Acked-by: Curtis Malainey <cujomalainey@...omium.org>
> ---
> 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
>
Powered by blists - more mailing lists