Lines Matching +full:dai +full:- +full:tdm +full:- +full:slot +full:- +full:width +full:- +full:map

1 // SPDX-License-Identifier: GPL-2.0
3 // mt8186-mt6366-rt1019-rt5682s.c
4 // -- MT8186-MT6366-RT1019-RT5682S ALSA SoC machine driver
21 #include "../common/mtk-afe-platform-driver.h"
22 #include "../common/mtk-dsp-sof-common.h"
23 #include "../common/mtk-soc-card.h"
24 #include "mt8186-afe-common.h"
25 #include "mt8186-afe-clk.h"
26 #include "mt8186-afe-gpio.h"
27 #include "mt8186-mt6366-common.h"
32 #define RT5682S_CODEC_DAI "rt5682s-aif1"
33 #define RT5682S_DEV0_NAME "rt5682s.5-001a"
60 .dlc = COMP_CODEC_CONF("mt6358-sound"),
64 .dlc = COMP_CODEC_CONF("bt-sco"),
68 .dlc = COMP_CODEC_CONF("hdmi-audio-codec"),
78 snd_soc_card_get_drvdata(dapm->card); in dmic_get()
79 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv; in dmic_get()
81 ucontrol->value.integer.value[0] = priv->dmic_switch; in dmic_get()
90 snd_soc_card_get_drvdata(dapm->card); in dmic_set()
91 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv; in dmic_set()
93 priv->dmic_switch = ucontrol->value.integer.value[0]; in dmic_set()
94 if (priv->dmic_sel) { in dmic_set()
95 gpiod_set_value(priv->dmic_sel, priv->dmic_switch); in dmic_set()
96 dev_dbg(dapm->card->dev, "dmic_set_value %d\n", in dmic_set()
97 priv->dmic_switch); in dmic_set()
127 struct snd_soc_card *card = rtd->card; in primary_codec_init()
129 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv; in primary_codec_init()
135 dev_err(card->dev, "mt8186_mt6366_init failed: %d\n", ret); in primary_codec_init()
139 if (!priv->dmic_sel) { in primary_codec_init()
140 dev_dbg(card->dev, "dmic_sel is null\n"); in primary_codec_init()
144 ret = snd_soc_dapm_new_controls(&card->dapm, dmic_widgets, in primary_codec_init()
147 dev_err(card->dev, "DMic widget addition failed: %d\n", ret); in primary_codec_init()
152 ret = snd_soc_dapm_add_routes(&card->dapm, dmic_map, in primary_codec_init()
156 dev_err(card->dev, "DMic map addition failed: %d\n", ret); in primary_codec_init()
167 snd_soc_card_get_drvdata(rtd->card); in mt8186_rt5682s_init()
168 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv; in mt8186_rt5682s_init()
169 struct snd_soc_jack *jack = &priv->headset_jack; in mt8186_rt5682s_init()
171 snd_soc_rtd_to_codec(rtd, 0)->component; in mt8186_rt5682s_init()
177 dev_err(rtd->dev, "Failed to set up shared clocks\n"); in mt8186_rt5682s_init()
181 ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack", in mt8186_rt5682s_init()
188 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret); in mt8186_rt5682s_init()
192 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); in mt8186_rt5682s_init()
193 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND); in mt8186_rt5682s_init()
194 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP); in mt8186_rt5682s_init()
195 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN); in mt8186_rt5682s_init()
204 struct snd_soc_pcm_runtime *rtd = substream->private_data; in mt8186_rt5682s_i2s_hw_params()
205 struct snd_soc_card *card = rtd->card; in mt8186_rt5682s_i2s_hw_params()
216 dev_err(card->dev, "invalid bit width: %d\n", bitwidth); in mt8186_rt5682s_i2s_hw_params()
222 dev_err(card->dev, "failed to set tdm slot\n"); in mt8186_rt5682s_i2s_hw_params()
231 dev_err(card->dev, "failed to set pll\n"); in mt8186_rt5682s_i2s_hw_params()
240 dev_err(card->dev, "failed to set sysclk\n"); in mt8186_rt5682s_i2s_hw_params()
257 snd_soc_rtd_to_codec(rtd, 0)->component; in mt8186_mt6366_rt1019_rt5682s_hdmi_init()
259 snd_soc_card_get_drvdata(rtd->card); in mt8186_mt6366_rt1019_rt5682s_hdmi_init()
260 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv; in mt8186_mt6366_rt1019_rt5682s_hdmi_init()
265 dev_err(rtd->dev, "Failed to set up shared clocks\n"); in mt8186_mt6366_rt1019_rt5682s_hdmi_init()
269 ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, &priv->hdmi_jack); in mt8186_mt6366_rt1019_rt5682s_hdmi_init()
271 dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret); in mt8186_mt6366_rt1019_rt5682s_hdmi_init()
275 return snd_soc_component_set_jack(cmpnt_codec, &priv->hdmi_jack, NULL); in mt8186_mt6366_rt1019_rt5682s_hdmi_init()
285 dev_dbg(rtd->dev, "%s(), fix format to %d\n", __func__, fmt); in mt8186_hw_params_fixup()
288 channels->min = 2; in mt8186_hw_params_fixup()
289 channels->max = 2; in mt8186_hw_params_fixup()
312 /* fixup the BE DAI link to match any values from topology */
320 if (!strcmp(rtd->dai_link->name, "I2S0") || in mt8186_sof_dai_link_fixup()
321 !strcmp(rtd->dai_link->name, "I2S1") || in mt8186_sof_dai_link_fixup()
322 !strcmp(rtd->dai_link->name, "I2S2")) in mt8186_sof_dai_link_fixup()
324 else if (!strcmp(rtd->dai_link->name, "I2S3")) in mt8186_sof_dai_link_fixup()
350 struct snd_pcm_runtime *runtime = substream->runtime; in mt8186_mt6366_rt1019_rt5682s_playback_startup()
357 dev_err(rtd->dev, "hw_constraint_list rate failed\n"); in mt8186_mt6366_rt1019_rt5682s_playback_startup()
365 dev_err(rtd->dev, "hw_constraint_list channel failed\n"); in mt8186_mt6366_rt1019_rt5682s_playback_startup()
396 struct snd_pcm_runtime *runtime = substream->runtime; in mt8186_mt6366_rt1019_rt5682s_capture_startup()
403 dev_err(rtd->dev, "hw_constraint_list rate failed\n"); in mt8186_mt6366_rt1019_rt5682s_capture_startup()
411 dev_err(rtd->dev, "hw_constraint_list channel failed\n"); in mt8186_mt6366_rt1019_rt5682s_capture_startup()
505 DAILINK_COMP_ARRAY(COMP_CPU("Hostless LPBK DAI")),
509 DAILINK_COMP_ARRAY(COMP_CPU("Hostless FM DAI")),
524 DAILINK_COMP_ARRAY(COMP_CODEC("mt6358-sound",
525 "mt6358-snd-codec-aif1"),
526 COMP_CODEC("dmic-codec",
527 "dmic-hifi")),
567 DAILINK_COMP_ARRAY(COMP_CODEC("bt-sco", "bt-sco-pcm-wb")),
570 DAILINK_COMP_ARRAY(COMP_CPU("TDM IN")),
576 DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL1 DAI")),
580 DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL2 DAI")),
584 DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL3 DAI")),
588 DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL5 DAI")),
592 DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL6 DAI")),
596 DAILINK_COMP_ARRAY(COMP_CPU("Hostless HW Gain AAudio DAI")),
600 DAILINK_COMP_ARRAY(COMP_CPU("Hostless SRC AAudio DAI")),
631 /* Front End DAI links */
863 /* Back End DAI links */
962 .name = "TDM IN",
1147 card = (struct snd_soc_card *)device_get_match_data(&pdev->dev); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1149 return -EINVAL; in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1150 card->dev = &pdev->dev; in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1152 soc_card_data = devm_kzalloc(&pdev->dev, sizeof(*soc_card_data), GFP_KERNEL); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1154 return -ENOMEM; in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1155 mach_priv = devm_kzalloc(&pdev->dev, sizeof(*mach_priv), GFP_KERNEL); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1157 return -ENOMEM; in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1159 soc_card_data->mach_priv = mach_priv; in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1161 mach_priv->dmic_sel = devm_gpiod_get_optional(&pdev->dev, in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1163 if (IS_ERR(mach_priv->dmic_sel)) { in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1164 dev_err(&pdev->dev, "DMIC gpio failed err=%ld\n", in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1165 PTR_ERR(mach_priv->dmic_sel)); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1166 return PTR_ERR(mach_priv->dmic_sel); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1169 adsp_node = of_parse_phandle(pdev->dev.of_node, "mediatek,adsp", 0); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1173 sof_priv = devm_kzalloc(&pdev->dev, sizeof(*sof_priv), GFP_KERNEL); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1175 ret = -ENOMEM; in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1178 sof_priv->conn_streams = g_sof_conn_streams; in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1179 sof_priv->num_streams = ARRAY_SIZE(g_sof_conn_streams); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1180 sof_priv->sof_dai_link_fixup = mt8186_sof_dai_link_fixup; in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1181 soc_card_data->sof_priv = sof_priv; in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1182 card->probe = mtk_sof_card_probe; in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1183 card->late_probe = mtk_sof_card_late_probe; in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1184 if (!card->topology_shortname_created) { in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1185 snprintf(card->topology_shortname, 32, "sof-%s", card->name); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1186 card->topology_shortname_created = true; in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1188 card->name = card->topology_shortname; in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1191 dev_dbg(&pdev->dev, "Probe without adsp\n"); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1194 if (of_property_read_bool(pdev->dev.of_node, "mediatek,dai-link")) { in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1195 ret = mtk_sof_dailink_parse_of(card, pdev->dev.of_node, in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1196 "mediatek,dai-link", in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1200 dev_dbg(&pdev->dev, "Parse dai-link fail\n"); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1205 card->num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links) in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1206 - ARRAY_SIZE(g_sof_conn_streams); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1209 platform_node = of_parse_phandle(pdev->dev.of_node, "mediatek,platform", 0); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1211 ret = -EINVAL; in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1212 dev_err_probe(&pdev->dev, ret, "Property 'platform' missing or invalid\n"); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1216 playback_codec = of_get_child_by_name(pdev->dev.of_node, "playback-codecs"); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1218 ret = -EINVAL; in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1219 dev_err_probe(&pdev->dev, ret, "Property 'playback-codecs' missing or invalid\n"); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1223 headset_codec = of_get_child_by_name(pdev->dev.of_node, "headset-codec"); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1225 ret = -EINVAL; in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1226 dev_err_probe(&pdev->dev, ret, "Property 'headset-codec' missing or invalid\n"); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1233 dev_err_probe(&pdev->dev, ret, "%s set playback_codec fail\n", in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1234 dai_link->name); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1240 dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n", in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1241 dai_link->name); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1247 dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n", in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1248 dai_link->name); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1252 if (!strncmp(dai_link->name, "AFE_SOF", strlen("AFE_SOF")) && sof_on) in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1253 dai_link->platforms->of_node = adsp_node; in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1255 if (!dai_link->platforms->name && !dai_link->platforms->of_node) in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1256 dai_link->platforms->of_node = platform_node; in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1261 ret = mt8186_afe_gpio_init(&pdev->dev); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1263 dev_err_probe(&pdev->dev, ret, "%s init gpio error\n", __func__); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1267 ret = devm_snd_soc_register_card(&pdev->dev, card); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1269 dev_err_probe(&pdev->dev, ret, "%s snd_soc_register_card fail\n", __func__); in mt8186_mt6366_rt1019_rt5682s_dev_probe()
1287 .compatible = "mediatek,mt8186-mt6366-rt1019-rt5682s-sound",
1291 .compatible = "mediatek,mt8186-mt6366-rt5682s-max98360-sound",
1295 .compatible = "mediatek,mt8186-mt6366-rt5650-sound",
1317 MODULE_DESCRIPTION("MT8186-MT6366-RT1019-RT5682S ALSA SoC machine driver");