From nobody Sun Sep 22 07:49:32 2024 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5B600C433EF for ; Mon, 21 Mar 2022 07:23:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344876AbiCUHZF (ORCPT ); Mon, 21 Mar 2022 03:25:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57326 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344836AbiCUHYt (ORCPT ); Mon, 21 Mar 2022 03:24:49 -0400 Received: from mailgw01.mediatek.com (unknown [60.244.123.138]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D202013FB0; Mon, 21 Mar 2022 00:23:22 -0700 (PDT) X-UUID: 61c240f9a45a47a6906be63f6ec87644-20220321 X-UUID: 61c240f9a45a47a6906be63f6ec87644-20220321 Received: from mtkmbs10n2.mediatek.inc [(172.21.101.183)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 255138919; Mon, 21 Mar 2022 15:23:16 +0800 Received: from mtkcas10.mediatek.inc (172.21.101.39) by mtkmbs10n2.mediatek.inc (172.21.101.183) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.2.792.3; Mon, 21 Mar 2022 15:23:15 +0800 Received: from mtksdccf07.mediatek.inc (172.21.84.99) by mtkcas10.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Mon, 21 Mar 2022 15:23:14 +0800 From: Trevor Wu To: , , , CC: , , , , , , , , , Subject: [PATCH v3 1/6] ASoC: mediatek: mt8195: revise mt8195-mt6359-rt1019-rt5682.c Date: Mon, 21 Mar 2022 15:23:07 +0800 Message-ID: <20220321072312.14972-2-trevor.wu@mediatek.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20220321072312.14972-1-trevor.wu@mediatek.com> References: <20220321072312.14972-1-trevor.wu@mediatek.com> MIME-Version: 1.0 X-MTK: N Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Revise driver for the coming driver combination. There are two major parts including in the patch. 1. Apply some suggested changes used in mt8195-mt6359-rt1011-rt5682.c. 2. Reorder the layout for centralizing the codec related code. Signed-off-by: Trevor Wu Reviewed-by: Tzung-Bi Shih --- .../mt8195/mt8195-mt6359-rt1019-rt5682.c | 488 +++++++++--------- 1 file changed, 240 insertions(+), 248 deletions(-) diff --git a/sound/soc/mediatek/mt8195/mt8195-mt6359-rt1019-rt5682.c b/soun= d/soc/mediatek/mt8195/mt8195-mt6359-rt1019-rt5682.c index e3146311722f..a144ef188dfb 100644 --- a/sound/soc/mediatek/mt8195/mt8195-mt6359-rt1019-rt5682.c +++ b/sound/soc/mediatek/mt8195/mt8195-mt6359-rt1019-rt5682.c @@ -14,7 +14,6 @@ #include #include #include -#include #include #include "../../codecs/mt6359.h" #include "../../codecs/rt5682.h" @@ -86,51 +85,6 @@ static const struct snd_kcontrol_new mt8195_mt6359_rt101= 9_rt5682_controls[] =3D { SOC_DAPM_PIN_SWITCH("Headset Mic"), }; =20 -static int mt8195_rt5682_etdm_hw_params(struct snd_pcm_substream *substrea= m, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_pcm_runtime *rtd =3D substream->private_data; - struct snd_soc_card *card =3D rtd->card; - struct snd_soc_dai *cpu_dai =3D asoc_rtd_to_cpu(rtd, 0); - struct snd_soc_dai *codec_dai =3D asoc_rtd_to_codec(rtd, 0); - unsigned int rate =3D params_rate(params); - int bitwidth; - int ret; - - bitwidth =3D snd_pcm_format_width(params_format(params)); - if (bitwidth < 0) { - dev_err(card->dev, "invalid bit width: %d\n", bitwidth); - return bitwidth; - } - - ret =3D snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth); - if (ret) { - dev_err(card->dev, "failed to set tdm slot\n"); - return ret; - } - - ret =3D snd_soc_dai_set_pll(codec_dai, RT5682_PLL1, RT5682_PLL1_S_MCLK, - rate * 256, rate * 512); - if (ret) { - dev_err(card->dev, "failed to set pll\n"); - return ret; - } - - ret =3D snd_soc_dai_set_sysclk(codec_dai, RT5682_SCLK_S_PLL1, - rate * 512, SND_SOC_CLOCK_IN); - if (ret) { - dev_err(card->dev, "failed to set sysclk\n"); - return ret; - } - - return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 256, - SND_SOC_CLOCK_OUT); -} - -static const struct snd_soc_ops mt8195_rt5682_etdm_ops =3D { - .hw_params =3D mt8195_rt5682_etdm_hw_params, -}; - #define CKSYS_AUD_TOP_CFG 0x032c #define CKSYS_AUD_TOP_MON 0x0330 =20 @@ -143,20 +97,20 @@ static int mt8195_mt6359_mtkaif_calibration(struct snd= _soc_pcm_runtime *rtd) struct mtk_base_afe *afe =3D snd_soc_component_get_drvdata(cmpnt_afe); struct mt8195_afe_private *afe_priv =3D afe->platform_priv; struct mtkaif_param *param =3D &afe_priv->mtkaif_params; - int phase; - unsigned int monitor; - int mtkaif_calibration_num_phase; + int chosen_phase_1, chosen_phase_2, chosen_phase_3; + int prev_cycle_1, prev_cycle_2, prev_cycle_3; int test_done_1, test_done_2, test_done_3; int cycle_1, cycle_2, cycle_3; - int prev_cycle_1, prev_cycle_2, prev_cycle_3; - int chosen_phase_1, chosen_phase_2, chosen_phase_3; - int counter; - bool mtkaif_calibration_ok; int mtkaif_chosen_phase[MT8195_MTKAIF_MISO_NUM]; int mtkaif_phase_cycle[MT8195_MTKAIF_MISO_NUM]; + int mtkaif_calibration_num_phase; + bool mtkaif_calibration_ok; + unsigned int monitor; + int counter; + int phase; int i; =20 - dev_info(afe->dev, "%s(), start\n", __func__); + dev_dbg(afe->dev, "%s(), start\n", __func__); =20 param->mtkaif_calibration_ok =3D false; for (i =3D 0; i < MT8195_MTKAIF_MISO_NUM; i++) { @@ -312,57 +266,6 @@ static int mt8195_mt6359_init(struct snd_soc_pcm_runti= me *rtd) return 0; } =20 -static int mt8195_rt5682_init(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_soc_component *cmpnt_codec =3D - asoc_rtd_to_codec(rtd, 0)->component; - struct mt8195_mt6359_rt1019_rt5682_priv *priv =3D - snd_soc_card_get_drvdata(rtd->card); - struct snd_soc_jack *jack =3D &priv->headset_jack; - struct snd_soc_component *cmpnt_afe =3D - snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); - struct mtk_base_afe *afe =3D snd_soc_component_get_drvdata(cmpnt_afe); - struct mt8195_afe_private *afe_priv =3D afe->platform_priv; - int ret; - - priv->i2so1_mclk =3D afe_priv->clk[MT8195_CLK_TOP_APLL12_DIV2]; - - ret =3D snd_soc_card_jack_new(rtd->card, "Headset Jack", - SND_JACK_HEADSET | SND_JACK_BTN_0 | - SND_JACK_BTN_1 | SND_JACK_BTN_2 | - SND_JACK_BTN_3, - jack, NULL, 0); - if (ret) { - dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret); - return ret; - } - - snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); - snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND); - snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP); - snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN); - - ret =3D snd_soc_component_set_jack(cmpnt_codec, jack, NULL); - if (ret) { - dev_err(rtd->dev, "Headset Jack set failed: %d\n", ret); - return ret; - } - - return 0; -}; - -static int mt8195_etdm_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - /* fix BE i2s format to S24_LE, clean param mask first */ - snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT), - 0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST); - - params_set_format(params, SNDRV_PCM_FORMAT_S24_LE); - - return 0; -} - static int mt8195_hdmitx_dptx_startup(struct snd_pcm_substream *substream) { static const unsigned int rates[] =3D { @@ -414,11 +317,8 @@ static int mt8195_dptx_hw_params(struct snd_pcm_substr= eam *substream, { struct snd_soc_pcm_runtime *rtd =3D substream->private_data; struct snd_soc_dai *cpu_dai =3D asoc_rtd_to_cpu(rtd, 0); - unsigned int rate =3D params_rate(params); - unsigned int mclk_fs_ratio =3D 256; - unsigned int mclk_fs =3D rate * mclk_fs_ratio; =20 - return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, + return snd_soc_dai_set_sysclk(cpu_dai, 0, params_rate(params) * 256, SND_SOC_CLOCK_OUT); } =20 @@ -432,7 +332,7 @@ static int mt8195_dptx_codec_init(struct snd_soc_pcm_ru= ntime *rtd) snd_soc_card_get_drvdata(rtd->card); struct snd_soc_component *cmpnt_codec =3D asoc_rtd_to_codec(rtd, 0)->component; - int ret =3D 0; + int ret; =20 ret =3D snd_soc_card_jack_new(rtd->card, "DP Jack", SND_JACK_LINEOUT, &priv->dp_jack, NULL, 0); @@ -448,7 +348,7 @@ static int mt8195_hdmi_codec_init(struct snd_soc_pcm_ru= ntime *rtd) snd_soc_card_get_drvdata(rtd->card); struct snd_soc_component *cmpnt_codec =3D asoc_rtd_to_codec(rtd, 0)->component; - int ret =3D 0; + int ret; =20 ret =3D snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, &priv->hdmi_jack, NULL, 0); @@ -460,7 +360,6 @@ static int mt8195_hdmi_codec_init(struct snd_soc_pcm_ru= ntime *rtd) =20 static int mt8195_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, struct snd_pcm_hw_params *params) - { /* fix BE i2s format to S24_LE, clean param mask first */ snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT), @@ -563,6 +462,102 @@ static const struct snd_soc_ops mt8195_capture_ops = =3D { .startup =3D mt8195_capture_startup, }; =20 +static int mt8195_rt5682_etdm_hw_params(struct snd_pcm_substream *substrea= m, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd =3D substream->private_data; + struct snd_soc_card *card =3D rtd->card; + struct snd_soc_dai *cpu_dai =3D asoc_rtd_to_cpu(rtd, 0); + struct snd_soc_dai *codec_dai =3D asoc_rtd_to_codec(rtd, 0); + unsigned int rate =3D params_rate(params); + int bitwidth; + int ret; + + bitwidth =3D snd_pcm_format_width(params_format(params)); + if (bitwidth < 0) { + dev_err(card->dev, "invalid bit width: %d\n", bitwidth); + return bitwidth; + } + + ret =3D snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth); + if (ret) { + dev_err(card->dev, "failed to set tdm slot\n"); + return ret; + } + + ret =3D snd_soc_dai_set_pll(codec_dai, RT5682_PLL1, RT5682_PLL1_S_MCLK, + rate * 256, rate * 512); + if (ret) { + dev_err(card->dev, "failed to set pll\n"); + return ret; + } + + ret =3D snd_soc_dai_set_sysclk(codec_dai, RT5682_SCLK_S_PLL1, + rate * 512, SND_SOC_CLOCK_IN); + if (ret) { + dev_err(card->dev, "failed to set sysclk\n"); + return ret; + } + + return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 256, + SND_SOC_CLOCK_OUT); +} + +static const struct snd_soc_ops mt8195_rt5682_etdm_ops =3D { + .hw_params =3D mt8195_rt5682_etdm_hw_params, +}; + +static int mt8195_rt5682_init(struct snd_soc_pcm_runtime *rtd) +{ + struct snd_soc_component *cmpnt_codec =3D + asoc_rtd_to_codec(rtd, 0)->component; + struct mt8195_mt6359_rt1019_rt5682_priv *priv =3D + snd_soc_card_get_drvdata(rtd->card); + struct snd_soc_jack *jack =3D &priv->headset_jack; + struct snd_soc_component *cmpnt_afe =3D + snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); + struct mtk_base_afe *afe =3D snd_soc_component_get_drvdata(cmpnt_afe); + struct mt8195_afe_private *afe_priv =3D afe->platform_priv; + int ret; + + priv->i2so1_mclk =3D afe_priv->clk[MT8195_CLK_TOP_APLL12_DIV2]; + + ret =3D snd_soc_card_jack_new(rtd->card, "Headset Jack", + SND_JACK_HEADSET | SND_JACK_BTN_0 | + SND_JACK_BTN_1 | SND_JACK_BTN_2 | + SND_JACK_BTN_3, + jack, NULL, 0); + if (ret) { + dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret); + return ret; + } + + snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); + snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND); + snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP); + snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN); + + ret =3D snd_soc_component_set_jack(cmpnt_codec, jack, NULL); + if (ret) { + dev_err(rtd->dev, "Headset Jack set failed: %d\n", ret); + return ret; + } + + return 0; +}; + +static int mt8195_etdm_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, + struct snd_pcm_hw_params *params) +{ + /* fix BE i2s format to S24_LE, clean param mask first */ + snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT), + 0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST); + + params_set_format(params, SNDRV_PCM_FORMAT_S24_LE); + + return 0; +} + static int mt8195_set_bias_level_post(struct snd_soc_card *card, struct snd_soc_dapm_context *dapm, enum snd_soc_bias_level level) { @@ -581,7 +576,6 @@ static int mt8195_set_bias_level_post(struct snd_soc_ca= rd *card, strcmp(component->name, RT5682S_DEV0_NAME))) return 0; =20 - switch (level) { case SND_SOC_BIAS_OFF: if (!__clk_is_enabled(priv->i2so1_mclk)) @@ -808,127 +802,6 @@ static const struct sof_conn_stream g_sof_conn_stream= s[] =3D { { "ETDM2_IN_BE", "AFE_SOF_UL5", SOF_DMA_UL5, SNDRV_PCM_STREAM_CAPTURE}, }; =20 -/* fixup the BE DAI link to match any values from topology */ -static int mt8195_dai_link_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) -{ - struct snd_soc_card *card =3D rtd->card; - struct snd_soc_dai_link *sof_dai_link =3D NULL; - struct snd_soc_pcm_runtime *runtime; - struct snd_soc_dai *cpu_dai; - int i, j, ret =3D 0; - - for (i =3D 0; i < ARRAY_SIZE(g_sof_conn_streams); i++) { - const struct sof_conn_stream *conn =3D &g_sof_conn_streams[i]; - - if (strcmp(rtd->dai_link->name, conn->normal_link)) - continue; - - for_each_card_rtds(card, runtime) { - if (strcmp(runtime->dai_link->name, conn->sof_link)) - continue; - - for_each_rtd_cpu_dais(runtime, j, cpu_dai) { - if (cpu_dai->stream_active[conn->stream_dir] > 0) { - sof_dai_link =3D runtime->dai_link; - break; - } - } - break; - } - - if (sof_dai_link && sof_dai_link->be_hw_params_fixup) - ret =3D sof_dai_link->be_hw_params_fixup(runtime, params); - - break; - } - - if (!strcmp(rtd->dai_link->name, "ETDM2_IN_BE") || - !strcmp(rtd->dai_link->name, "ETDM1_OUT_BE")) { - mt8195_etdm_hw_params_fixup(runtime, params); - } - - return ret; -} - -static int mt8195_mt6359_rt1019_rt5682_card_late_probe(struct snd_soc_card= *card) -{ - struct snd_soc_pcm_runtime *runtime; - struct snd_soc_component *sof_comp =3D NULL; - int i; - - /* 1. find sof component */ - for_each_card_rtds(card, runtime) { - for (i =3D 0; i < runtime->num_components; i++) { - if (!runtime->components[i]->driver->name) - continue; - if (!strcmp(runtime->components[i]->driver->name, "sof-audio-component"= )) { - sof_comp =3D runtime->components[i]; - break; - } - } - } - - if (!sof_comp) { - dev_info(card->dev, " probe without component\n"); - return 0; - } - /* 2. add route path and fixup callback */ - for (i =3D 0; i < ARRAY_SIZE(g_sof_conn_streams); i++) { - const struct sof_conn_stream *conn =3D &g_sof_conn_streams[i]; - struct snd_soc_pcm_runtime *sof_rtd =3D NULL; - struct snd_soc_pcm_runtime *normal_rtd =3D NULL; - struct snd_soc_pcm_runtime *rtd =3D NULL; - - for_each_card_rtds(card, rtd) { - if (!strcmp(rtd->dai_link->name, conn->sof_link)) { - sof_rtd =3D rtd; - continue; - } - if (!strcmp(rtd->dai_link->name, conn->normal_link)) { - normal_rtd =3D rtd; - continue; - } - if (normal_rtd && sof_rtd) - break; - } - if (normal_rtd && sof_rtd) { - int j; - struct snd_soc_dai *cpu_dai; - - for_each_rtd_cpu_dais(sof_rtd, j, cpu_dai) { - struct snd_soc_dapm_route route; - struct snd_soc_dapm_path *p =3D NULL; - struct snd_soc_dapm_widget *play_widget =3D - cpu_dai->playback_widget; - struct snd_soc_dapm_widget *cap_widget =3D - cpu_dai->capture_widget; - memset(&route, 0, sizeof(route)); - if (conn->stream_dir =3D=3D SNDRV_PCM_STREAM_CAPTURE && - cap_widget) { - snd_soc_dapm_widget_for_each_sink_path(cap_widget, p) { - route.source =3D conn->sof_dma; - route.sink =3D p->sink->name; - snd_soc_dapm_add_routes(&card->dapm, &route, 1); - } - } else if (conn->stream_dir =3D=3D SNDRV_PCM_STREAM_PLAYBACK && - play_widget){ - snd_soc_dapm_widget_for_each_source_path(play_widget, p) { - route.source =3D p->source->name; - route.sink =3D conn->sof_dma; - snd_soc_dapm_add_routes(&card->dapm, &route, 1); - } - } else { - dev_err(cpu_dai->dev, "stream dir and widget not pair\n"); - } - } - normal_rtd->dai_link->be_hw_params_fixup =3D mt8195_dai_link_fixup; - } - } - - return 0; -} - static struct snd_soc_dai_link mt8195_mt6359_rt1019_rt5682_dai_links[] =3D= { /* FE */ [DAI_LINK_DL2_FE] =3D { @@ -1248,6 +1121,127 @@ static struct snd_soc_card mt8195_mt6359_rt1019_rt5= 682_soc_card =3D { .set_bias_level_post =3D mt8195_set_bias_level_post, }; =20 +/* fixup the BE DAI link to match any values from topology */ +static int mt8195_dai_link_fixup(struct snd_soc_pcm_runtime *rtd, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_card *card =3D rtd->card; + struct snd_soc_dai_link *sof_dai_link =3D NULL; + struct snd_soc_pcm_runtime *runtime; + struct snd_soc_dai *cpu_dai; + int i, j, ret =3D 0; + + for (i =3D 0; i < ARRAY_SIZE(g_sof_conn_streams); i++) { + const struct sof_conn_stream *conn =3D &g_sof_conn_streams[i]; + + if (strcmp(rtd->dai_link->name, conn->normal_link)) + continue; + + for_each_card_rtds(card, runtime) { + if (strcmp(runtime->dai_link->name, conn->sof_link)) + continue; + + for_each_rtd_cpu_dais(runtime, j, cpu_dai) { + if (cpu_dai->stream_active[conn->stream_dir] > 0) { + sof_dai_link =3D runtime->dai_link; + break; + } + } + break; + } + + if (sof_dai_link && sof_dai_link->be_hw_params_fixup) + ret =3D sof_dai_link->be_hw_params_fixup(runtime, params); + + break; + } + + if (!strcmp(rtd->dai_link->name, "ETDM2_IN_BE") || + !strcmp(rtd->dai_link->name, "ETDM1_OUT_BE")) { + mt8195_etdm_hw_params_fixup(runtime, params); + } + + return ret; +} + +static int mt8195_mt6359_rt1019_rt5682_card_late_probe(struct snd_soc_card= *card) +{ + struct snd_soc_pcm_runtime *runtime; + struct snd_soc_component *sof_comp =3D NULL; + int i; + + /* 1. find sof component */ + for_each_card_rtds(card, runtime) { + for (i =3D 0; i < runtime->num_components; i++) { + if (!runtime->components[i]->driver->name) + continue; + if (!strcmp(runtime->components[i]->driver->name, "sof-audio-component"= )) { + sof_comp =3D runtime->components[i]; + break; + } + } + } + + if (!sof_comp) { + dev_info(card->dev, " probe without component\n"); + return 0; + } + /* 2. add route path and fixup callback */ + for (i =3D 0; i < ARRAY_SIZE(g_sof_conn_streams); i++) { + const struct sof_conn_stream *conn =3D &g_sof_conn_streams[i]; + struct snd_soc_pcm_runtime *sof_rtd =3D NULL; + struct snd_soc_pcm_runtime *normal_rtd =3D NULL; + struct snd_soc_pcm_runtime *rtd =3D NULL; + + for_each_card_rtds(card, rtd) { + if (!strcmp(rtd->dai_link->name, conn->sof_link)) { + sof_rtd =3D rtd; + continue; + } + if (!strcmp(rtd->dai_link->name, conn->normal_link)) { + normal_rtd =3D rtd; + continue; + } + if (normal_rtd && sof_rtd) + break; + } + if (normal_rtd && sof_rtd) { + int j; + struct snd_soc_dai *cpu_dai; + + for_each_rtd_cpu_dais(sof_rtd, j, cpu_dai) { + struct snd_soc_dapm_route route; + struct snd_soc_dapm_path *p =3D NULL; + struct snd_soc_dapm_widget *play_widget =3D + cpu_dai->playback_widget; + struct snd_soc_dapm_widget *cap_widget =3D + cpu_dai->capture_widget; + memset(&route, 0, sizeof(route)); + if (conn->stream_dir =3D=3D SNDRV_PCM_STREAM_CAPTURE && + cap_widget) { + snd_soc_dapm_widget_for_each_sink_path(cap_widget, p) { + route.source =3D conn->sof_dma; + route.sink =3D p->sink->name; + snd_soc_dapm_add_routes(&card->dapm, &route, 1); + } + } else if (conn->stream_dir =3D=3D SNDRV_PCM_STREAM_PLAYBACK && + play_widget){ + snd_soc_dapm_widget_for_each_source_path(play_widget, p) { + route.source =3D p->source->name; + route.sink =3D conn->sof_dma; + snd_soc_dapm_add_routes(&card->dapm, &route, 1); + } + } else { + dev_err(cpu_dai->dev, "stream dir and widget not pair\n"); + } + } + normal_rtd->dai_link->be_hw_params_fixup =3D mt8195_dai_link_fixup; + } + } + + return 0; +} + static int mt8195_dailink_parse_of(struct snd_soc_card *card, struct devic= e_node *np, const char *propname) { @@ -1322,6 +1316,18 @@ static int mt8195_mt6359_rt1019_rt5682_dev_probe(str= uct platform_device *pdev) if (!priv) return -ENOMEM; =20 + if (of_property_read_bool(pdev->dev.of_node, "mediatek,dai-link")) { + ret =3D mt8195_dailink_parse_of(card, pdev->dev.of_node, + "mediatek,dai-link"); + if (ret) { + dev_dbg(&pdev->dev, "Parse dai-link fail\n"); + return -EINVAL; + } + } else { + if (!sof_on) + card->num_links =3D DAI_LINK_REGULAR_NUM; + } + platform_node =3D of_parse_phandle(pdev->dev.of_node, "mediatek,platform", 0); if (!platform_node) { @@ -1337,19 +1343,6 @@ static int mt8195_mt6359_rt1019_rt5682_dev_probe(str= uct platform_device *pdev) hdmi_node =3D of_parse_phandle(pdev->dev.of_node, "mediatek,hdmi-codec", 0); =20 - if (of_property_read_bool(pdev->dev.of_node, "mediatek,dai-link")) { - ret =3D mt8195_dailink_parse_of(card, pdev->dev.of_node, - "mediatek,dai-link"); - if (ret) { - dev_dbg(&pdev->dev, "Parse dai-link fail\n"); - ret =3D -EINVAL; - goto put_node; - } - } else { - if (!sof_on) - card->num_links =3D DAI_LINK_REGULAR_NUM; - } - for_each_card_prelinks(card, i, dai_link) { if (!dai_link->platforms->name) { if (!strncmp(dai_link->name, "AFE_SOF", strlen("AFE_SOF")) && sof_on) @@ -1399,7 +1392,6 @@ static int mt8195_mt6359_rt1019_rt5682_dev_probe(stru= ct platform_device *pdev) =20 ret =3D devm_snd_soc_register_card(&pdev->dev, card); =20 -put_node: of_node_put(platform_node); of_node_put(adsp_node); of_node_put(dp_node); --=20 2.18.0