1 // SPDX-License-Identifier: GPL-2.0 2 // 3 // mt8186-mt6366-rt1019-rt5682s.c 4 // -- MT8186-MT6366-RT1019-RT5682S ALSA SoC machine driver 5 // 6 // Copyright (c) 2022 MediaTek Inc. 7 // Author: Jiaxin Yu <jiaxin.yu@mediatek.com> 8 // 9 10 #include <linux/gpio.h> 11 #include <linux/gpio/consumer.h> 12 #include <linux/input.h> 13 #include <linux/module.h> 14 #include <linux/of_device.h> 15 #include <linux/pm_runtime.h> 16 #include <sound/jack.h> 17 #include <sound/pcm_params.h> 18 #include <sound/rt5682.h> 19 #include <sound/soc.h> 20 21 #include "../../codecs/mt6358.h" 22 #include "../../codecs/rt5682.h" 23 #include "../common/mtk-afe-platform-driver.h" 24 #include "../common/mtk-dsp-sof-common.h" 25 #include "../common/mtk-soc-card.h" 26 #include "mt8186-afe-common.h" 27 #include "mt8186-afe-clk.h" 28 #include "mt8186-afe-gpio.h" 29 #include "mt8186-mt6366-common.h" 30 31 #define RT1019_CODEC_DAI "HiFi" 32 #define RT1019_DEV0_NAME "rt1019p" 33 34 #define RT5682S_CODEC_DAI "rt5682s-aif1" 35 #define RT5682S_DEV0_NAME "rt5682s.5-001a" 36 37 #define SOF_DMA_DL1 "SOF_DMA_DL1" 38 #define SOF_DMA_DL2 "SOF_DMA_DL2" 39 #define SOF_DMA_UL1 "SOF_DMA_UL1" 40 #define SOF_DMA_UL2 "SOF_DMA_UL2" 41 42 struct mt8186_mt6366_rt1019_rt5682s_priv { 43 struct snd_soc_jack headset_jack, hdmi_jack; 44 struct gpio_desc *dmic_sel; 45 int dmic_switch; 46 }; 47 48 /* Headset jack detection DAPM pins */ 49 static struct snd_soc_jack_pin mt8186_jack_pins[] = { 50 { 51 .pin = "Headphone", 52 .mask = SND_JACK_HEADPHONE, 53 }, 54 { 55 .pin = "Headset Mic", 56 .mask = SND_JACK_MICROPHONE, 57 }, 58 }; 59 60 static struct snd_soc_codec_conf mt8186_mt6366_rt1019_rt5682s_codec_conf[] = { 61 { 62 .dlc = COMP_CODEC_CONF("mt6358-sound"), 63 .name_prefix = "Mt6366", 64 }, 65 { 66 .dlc = COMP_CODEC_CONF("bt-sco"), 67 .name_prefix = "Mt8186 bt", 68 }, 69 { 70 .dlc = COMP_CODEC_CONF("hdmi-audio-codec"), 71 .name_prefix = "Mt8186 hdmi", 72 }, 73 }; 74 75 static int dmic_get(struct snd_kcontrol *kcontrol, 76 struct snd_ctl_elem_value *ucontrol) 77 { 78 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol); 79 struct mtk_soc_card_data *soc_card_data = 80 snd_soc_card_get_drvdata(dapm->card); 81 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv; 82 83 ucontrol->value.integer.value[0] = priv->dmic_switch; 84 return 0; 85 } 86 87 static int dmic_set(struct snd_kcontrol *kcontrol, 88 struct snd_ctl_elem_value *ucontrol) 89 { 90 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol); 91 struct mtk_soc_card_data *soc_card_data = 92 snd_soc_card_get_drvdata(dapm->card); 93 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv; 94 95 priv->dmic_switch = ucontrol->value.integer.value[0]; 96 if (priv->dmic_sel) { 97 gpiod_set_value(priv->dmic_sel, priv->dmic_switch); 98 dev_dbg(dapm->card->dev, "dmic_set_value %d\n", 99 priv->dmic_switch); 100 } 101 return 0; 102 } 103 104 static const char * const dmic_mux_text[] = { 105 "Front Mic", 106 "Rear Mic", 107 }; 108 109 static SOC_ENUM_SINGLE_DECL(mt8186_dmic_enum, 110 SND_SOC_NOPM, 0, dmic_mux_text); 111 112 static const struct snd_kcontrol_new mt8186_dmic_mux_control = 113 SOC_DAPM_ENUM_EXT("DMIC Select Mux", mt8186_dmic_enum, 114 dmic_get, dmic_set); 115 116 static const struct snd_soc_dapm_widget dmic_widgets[] = { 117 SND_SOC_DAPM_MIC("DMIC", NULL), 118 SND_SOC_DAPM_MUX("Dmic Mux", SND_SOC_NOPM, 0, 0, &mt8186_dmic_mux_control), 119 }; 120 121 static const struct snd_soc_dapm_route dmic_map[] = { 122 /* digital mics */ 123 {"Dmic Mux", "Front Mic", "DMIC"}, 124 {"Dmic Mux", "Rear Mic", "DMIC"}, 125 }; 126 127 static int primary_codec_init(struct snd_soc_pcm_runtime *rtd) 128 { 129 struct snd_soc_card *card = rtd->card; 130 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card); 131 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv; 132 int ret; 133 134 ret = mt8186_mt6366_init(rtd); 135 136 if (ret) { 137 dev_err(card->dev, "mt8186_mt6366_init failed: %d\n", ret); 138 return ret; 139 } 140 141 if (!priv->dmic_sel) { 142 dev_dbg(card->dev, "dmic_sel is null\n"); 143 return 0; 144 } 145 146 ret = snd_soc_dapm_new_controls(&card->dapm, dmic_widgets, 147 ARRAY_SIZE(dmic_widgets)); 148 if (ret) { 149 dev_err(card->dev, "DMic widget addition failed: %d\n", ret); 150 /* Don't need to add routes if widget addition failed */ 151 return ret; 152 } 153 154 ret = snd_soc_dapm_add_routes(&card->dapm, dmic_map, 155 ARRAY_SIZE(dmic_map)); 156 157 if (ret) 158 dev_err(card->dev, "DMic map addition failed: %d\n", ret); 159 160 return ret; 161 } 162 163 static int mt8186_rt5682s_init(struct snd_soc_pcm_runtime *rtd) 164 { 165 struct snd_soc_component *cmpnt_afe = 166 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); 167 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe); 168 struct mtk_soc_card_data *soc_card_data = 169 snd_soc_card_get_drvdata(rtd->card); 170 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv; 171 struct snd_soc_jack *jack = &priv->headset_jack; 172 struct snd_soc_component *cmpnt_codec = 173 asoc_rtd_to_codec(rtd, 0)->component; 174 int ret; 175 176 ret = mt8186_dai_i2s_set_share(afe, "I2S1", "I2S0"); 177 if (ret) { 178 dev_err(rtd->dev, "Failed to set up shared clocks\n"); 179 return ret; 180 } 181 182 ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack", 183 SND_JACK_HEADSET | SND_JACK_BTN_0 | 184 SND_JACK_BTN_1 | SND_JACK_BTN_2 | 185 SND_JACK_BTN_3, 186 jack, mt8186_jack_pins, 187 ARRAY_SIZE(mt8186_jack_pins)); 188 if (ret) { 189 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret); 190 return ret; 191 } 192 193 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); 194 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND); 195 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP); 196 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN); 197 198 return snd_soc_component_set_jack(cmpnt_codec, jack, NULL); 199 } 200 201 static int mt8186_rt5682s_i2s_hw_params(struct snd_pcm_substream *substream, 202 struct snd_pcm_hw_params *params) 203 { 204 struct snd_soc_pcm_runtime *rtd = substream->private_data; 205 struct snd_soc_card *card = rtd->card; 206 struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0); 207 struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0); 208 unsigned int rate = params_rate(params); 209 unsigned int mclk_fs_ratio = 128; 210 unsigned int mclk_fs = rate * mclk_fs_ratio; 211 int bitwidth; 212 int ret; 213 214 bitwidth = snd_pcm_format_width(params_format(params)); 215 if (bitwidth < 0) { 216 dev_err(card->dev, "invalid bit width: %d\n", bitwidth); 217 return bitwidth; 218 } 219 220 ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth); 221 if (ret) { 222 dev_err(card->dev, "failed to set tdm slot\n"); 223 return ret; 224 } 225 226 ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1, 227 RT5682_PLL1_S_BCLK1, 228 params_rate(params) * 64, 229 params_rate(params) * 512); 230 if (ret) { 231 dev_err(card->dev, "failed to set pll\n"); 232 return ret; 233 } 234 235 ret = snd_soc_dai_set_sysclk(codec_dai, 236 RT5682_SCLK_S_PLL1, 237 params_rate(params) * 512, 238 SND_SOC_CLOCK_IN); 239 if (ret) { 240 dev_err(card->dev, "failed to set sysclk\n"); 241 return ret; 242 } 243 244 return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT); 245 } 246 247 static const struct snd_soc_ops mt8186_rt5682s_i2s_ops = { 248 .hw_params = mt8186_rt5682s_i2s_hw_params, 249 }; 250 251 static int mt8186_mt6366_rt1019_rt5682s_hdmi_init(struct snd_soc_pcm_runtime *rtd) 252 { 253 struct snd_soc_component *cmpnt_afe = 254 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); 255 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe); 256 struct snd_soc_component *cmpnt_codec = 257 asoc_rtd_to_codec(rtd, 0)->component; 258 struct mtk_soc_card_data *soc_card_data = 259 snd_soc_card_get_drvdata(rtd->card); 260 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv; 261 int ret; 262 263 ret = mt8186_dai_i2s_set_share(afe, "I2S2", "I2S3"); 264 if (ret) { 265 dev_err(rtd->dev, "Failed to set up shared clocks\n"); 266 return ret; 267 } 268 269 ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, &priv->hdmi_jack); 270 if (ret) { 271 dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret); 272 return ret; 273 } 274 275 return snd_soc_component_set_jack(cmpnt_codec, &priv->hdmi_jack, NULL); 276 } 277 278 static int mt8186_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, 279 struct snd_pcm_hw_params *params, 280 snd_pcm_format_t fmt) 281 { 282 struct snd_interval *channels = hw_param_interval(params, 283 SNDRV_PCM_HW_PARAM_CHANNELS); 284 285 dev_dbg(rtd->dev, "%s(), fix format to %d\n", __func__, fmt); 286 287 /* fix BE i2s channel to 2 channel */ 288 channels->min = 2; 289 channels->max = 2; 290 291 /* clean param mask first */ 292 snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT), 293 0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST); 294 295 params_set_format(params, fmt); 296 297 return 0; 298 } 299 300 static int mt8186_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, 301 struct snd_pcm_hw_params *params) 302 { 303 return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S24_LE); 304 } 305 306 static int mt8186_it6505_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, 307 struct snd_pcm_hw_params *params) 308 { 309 return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S32_LE); 310 } 311 312 /* fixup the BE DAI link to match any values from topology */ 313 static int mt8186_sof_dai_link_fixup(struct snd_soc_pcm_runtime *rtd, 314 struct snd_pcm_hw_params *params) 315 { 316 int ret; 317 318 ret = mtk_sof_dai_link_fixup(rtd, params); 319 320 if (!strcmp(rtd->dai_link->name, "I2S0") || 321 !strcmp(rtd->dai_link->name, "I2S1") || 322 !strcmp(rtd->dai_link->name, "I2S2")) 323 mt8186_i2s_hw_params_fixup(rtd, params); 324 else if (!strcmp(rtd->dai_link->name, "I2S3")) 325 mt8186_it6505_i2s_hw_params_fixup(rtd, params); 326 327 return ret; 328 } 329 330 static int mt8186_mt6366_rt1019_rt5682s_playback_startup(struct snd_pcm_substream *substream) 331 { 332 static const unsigned int rates[] = { 333 48000 334 }; 335 static const unsigned int channels[] = { 336 2 337 }; 338 static const struct snd_pcm_hw_constraint_list constraints_rates = { 339 .count = ARRAY_SIZE(rates), 340 .list = rates, 341 .mask = 0, 342 }; 343 static const struct snd_pcm_hw_constraint_list constraints_channels = { 344 .count = ARRAY_SIZE(channels), 345 .list = channels, 346 .mask = 0, 347 }; 348 349 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); 350 struct snd_pcm_runtime *runtime = substream->runtime; 351 int ret; 352 353 ret = snd_pcm_hw_constraint_list(runtime, 0, 354 SNDRV_PCM_HW_PARAM_RATE, 355 &constraints_rates); 356 if (ret < 0) { 357 dev_err(rtd->dev, "hw_constraint_list rate failed\n"); 358 return ret; 359 } 360 361 ret = snd_pcm_hw_constraint_list(runtime, 0, 362 SNDRV_PCM_HW_PARAM_CHANNELS, 363 &constraints_channels); 364 if (ret < 0) { 365 dev_err(rtd->dev, "hw_constraint_list channel failed\n"); 366 return ret; 367 } 368 369 return 0; 370 } 371 372 static const struct snd_soc_ops mt8186_mt6366_rt1019_rt5682s_playback_ops = { 373 .startup = mt8186_mt6366_rt1019_rt5682s_playback_startup, 374 }; 375 376 static int mt8186_mt6366_rt1019_rt5682s_capture_startup(struct snd_pcm_substream *substream) 377 { 378 static const unsigned int rates[] = { 379 48000 380 }; 381 static const unsigned int channels[] = { 382 1, 2 383 }; 384 static const struct snd_pcm_hw_constraint_list constraints_rates = { 385 .count = ARRAY_SIZE(rates), 386 .list = rates, 387 .mask = 0, 388 }; 389 static const struct snd_pcm_hw_constraint_list constraints_channels = { 390 .count = ARRAY_SIZE(channels), 391 .list = channels, 392 .mask = 0, 393 }; 394 395 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); 396 struct snd_pcm_runtime *runtime = substream->runtime; 397 int ret; 398 399 ret = snd_pcm_hw_constraint_list(runtime, 0, 400 SNDRV_PCM_HW_PARAM_RATE, 401 &constraints_rates); 402 if (ret < 0) { 403 dev_err(rtd->dev, "hw_constraint_list rate failed\n"); 404 return ret; 405 } 406 407 ret = snd_pcm_hw_constraint_list(runtime, 0, 408 SNDRV_PCM_HW_PARAM_CHANNELS, 409 &constraints_channels); 410 if (ret < 0) { 411 dev_err(rtd->dev, "hw_constraint_list channel failed\n"); 412 return ret; 413 } 414 415 return 0; 416 } 417 418 static const struct snd_soc_ops mt8186_mt6366_rt1019_rt5682s_capture_ops = { 419 .startup = mt8186_mt6366_rt1019_rt5682s_capture_startup, 420 }; 421 422 /* FE */ 423 SND_SOC_DAILINK_DEFS(playback1, 424 DAILINK_COMP_ARRAY(COMP_CPU("DL1")), 425 DAILINK_COMP_ARRAY(COMP_DUMMY()), 426 DAILINK_COMP_ARRAY(COMP_EMPTY())); 427 428 SND_SOC_DAILINK_DEFS(playback12, 429 DAILINK_COMP_ARRAY(COMP_CPU("DL12")), 430 DAILINK_COMP_ARRAY(COMP_DUMMY()), 431 DAILINK_COMP_ARRAY(COMP_EMPTY())); 432 433 SND_SOC_DAILINK_DEFS(playback2, 434 DAILINK_COMP_ARRAY(COMP_CPU("DL2")), 435 DAILINK_COMP_ARRAY(COMP_DUMMY()), 436 DAILINK_COMP_ARRAY(COMP_EMPTY())); 437 438 SND_SOC_DAILINK_DEFS(playback3, 439 DAILINK_COMP_ARRAY(COMP_CPU("DL3")), 440 DAILINK_COMP_ARRAY(COMP_DUMMY()), 441 DAILINK_COMP_ARRAY(COMP_EMPTY())); 442 443 SND_SOC_DAILINK_DEFS(playback4, 444 DAILINK_COMP_ARRAY(COMP_CPU("DL4")), 445 DAILINK_COMP_ARRAY(COMP_DUMMY()), 446 DAILINK_COMP_ARRAY(COMP_EMPTY())); 447 448 SND_SOC_DAILINK_DEFS(playback5, 449 DAILINK_COMP_ARRAY(COMP_CPU("DL5")), 450 DAILINK_COMP_ARRAY(COMP_DUMMY()), 451 DAILINK_COMP_ARRAY(COMP_EMPTY())); 452 453 SND_SOC_DAILINK_DEFS(playback6, 454 DAILINK_COMP_ARRAY(COMP_CPU("DL6")), 455 DAILINK_COMP_ARRAY(COMP_DUMMY()), 456 DAILINK_COMP_ARRAY(COMP_EMPTY())); 457 458 SND_SOC_DAILINK_DEFS(playback7, 459 DAILINK_COMP_ARRAY(COMP_CPU("DL7")), 460 DAILINK_COMP_ARRAY(COMP_DUMMY()), 461 DAILINK_COMP_ARRAY(COMP_EMPTY())); 462 463 SND_SOC_DAILINK_DEFS(playback8, 464 DAILINK_COMP_ARRAY(COMP_CPU("DL8")), 465 DAILINK_COMP_ARRAY(COMP_DUMMY()), 466 DAILINK_COMP_ARRAY(COMP_EMPTY())); 467 468 SND_SOC_DAILINK_DEFS(capture1, 469 DAILINK_COMP_ARRAY(COMP_CPU("UL1")), 470 DAILINK_COMP_ARRAY(COMP_DUMMY()), 471 DAILINK_COMP_ARRAY(COMP_EMPTY())); 472 473 SND_SOC_DAILINK_DEFS(capture2, 474 DAILINK_COMP_ARRAY(COMP_CPU("UL2")), 475 DAILINK_COMP_ARRAY(COMP_DUMMY()), 476 DAILINK_COMP_ARRAY(COMP_EMPTY())); 477 478 SND_SOC_DAILINK_DEFS(capture3, 479 DAILINK_COMP_ARRAY(COMP_CPU("UL3")), 480 DAILINK_COMP_ARRAY(COMP_DUMMY()), 481 DAILINK_COMP_ARRAY(COMP_EMPTY())); 482 483 SND_SOC_DAILINK_DEFS(capture4, 484 DAILINK_COMP_ARRAY(COMP_CPU("UL4")), 485 DAILINK_COMP_ARRAY(COMP_DUMMY()), 486 DAILINK_COMP_ARRAY(COMP_EMPTY())); 487 488 SND_SOC_DAILINK_DEFS(capture5, 489 DAILINK_COMP_ARRAY(COMP_CPU("UL5")), 490 DAILINK_COMP_ARRAY(COMP_DUMMY()), 491 DAILINK_COMP_ARRAY(COMP_EMPTY())); 492 493 SND_SOC_DAILINK_DEFS(capture6, 494 DAILINK_COMP_ARRAY(COMP_CPU("UL6")), 495 DAILINK_COMP_ARRAY(COMP_DUMMY()), 496 DAILINK_COMP_ARRAY(COMP_EMPTY())); 497 498 SND_SOC_DAILINK_DEFS(capture7, 499 DAILINK_COMP_ARRAY(COMP_CPU("UL7")), 500 DAILINK_COMP_ARRAY(COMP_DUMMY()), 501 DAILINK_COMP_ARRAY(COMP_EMPTY())); 502 503 /* hostless */ 504 SND_SOC_DAILINK_DEFS(hostless_lpbk, 505 DAILINK_COMP_ARRAY(COMP_CPU("Hostless LPBK DAI")), 506 DAILINK_COMP_ARRAY(COMP_DUMMY()), 507 DAILINK_COMP_ARRAY(COMP_EMPTY())); 508 SND_SOC_DAILINK_DEFS(hostless_fm, 509 DAILINK_COMP_ARRAY(COMP_CPU("Hostless FM DAI")), 510 DAILINK_COMP_ARRAY(COMP_DUMMY()), 511 DAILINK_COMP_ARRAY(COMP_EMPTY())); 512 SND_SOC_DAILINK_DEFS(hostless_src1, 513 DAILINK_COMP_ARRAY(COMP_CPU("Hostless_SRC_1_DAI")), 514 DAILINK_COMP_ARRAY(COMP_DUMMY()), 515 DAILINK_COMP_ARRAY(COMP_EMPTY())); 516 SND_SOC_DAILINK_DEFS(hostless_src_bargein, 517 DAILINK_COMP_ARRAY(COMP_CPU("Hostless_SRC_Bargein_DAI")), 518 DAILINK_COMP_ARRAY(COMP_DUMMY()), 519 DAILINK_COMP_ARRAY(COMP_EMPTY())); 520 521 /* BE */ 522 SND_SOC_DAILINK_DEFS(adda, 523 DAILINK_COMP_ARRAY(COMP_CPU("ADDA")), 524 DAILINK_COMP_ARRAY(COMP_CODEC("mt6358-sound", 525 "mt6358-snd-codec-aif1"), 526 COMP_CODEC("dmic-codec", 527 "dmic-hifi")), 528 DAILINK_COMP_ARRAY(COMP_EMPTY())); 529 SND_SOC_DAILINK_DEFS(i2s0, 530 DAILINK_COMP_ARRAY(COMP_CPU("I2S0")), 531 DAILINK_COMP_ARRAY(COMP_EMPTY()), 532 DAILINK_COMP_ARRAY(COMP_EMPTY())); 533 SND_SOC_DAILINK_DEFS(i2s1, 534 DAILINK_COMP_ARRAY(COMP_CPU("I2S1")), 535 DAILINK_COMP_ARRAY(COMP_EMPTY()), 536 DAILINK_COMP_ARRAY(COMP_EMPTY())); 537 SND_SOC_DAILINK_DEFS(i2s2, 538 DAILINK_COMP_ARRAY(COMP_CPU("I2S2")), 539 DAILINK_COMP_ARRAY(COMP_DUMMY()), 540 DAILINK_COMP_ARRAY(COMP_EMPTY())); 541 SND_SOC_DAILINK_DEFS(i2s3, 542 DAILINK_COMP_ARRAY(COMP_CPU("I2S3")), 543 DAILINK_COMP_ARRAY(COMP_EMPTY()), 544 DAILINK_COMP_ARRAY(COMP_EMPTY())); 545 SND_SOC_DAILINK_DEFS(hw_gain1, 546 DAILINK_COMP_ARRAY(COMP_CPU("HW Gain 1")), 547 DAILINK_COMP_ARRAY(COMP_DUMMY()), 548 DAILINK_COMP_ARRAY(COMP_EMPTY())); 549 SND_SOC_DAILINK_DEFS(hw_gain2, 550 DAILINK_COMP_ARRAY(COMP_CPU("HW Gain 2")), 551 DAILINK_COMP_ARRAY(COMP_DUMMY()), 552 DAILINK_COMP_ARRAY(COMP_EMPTY())); 553 SND_SOC_DAILINK_DEFS(hw_src1, 554 DAILINK_COMP_ARRAY(COMP_CPU("HW_SRC_1")), 555 DAILINK_COMP_ARRAY(COMP_DUMMY()), 556 DAILINK_COMP_ARRAY(COMP_EMPTY())); 557 SND_SOC_DAILINK_DEFS(hw_src2, 558 DAILINK_COMP_ARRAY(COMP_CPU("HW_SRC_2")), 559 DAILINK_COMP_ARRAY(COMP_DUMMY()), 560 DAILINK_COMP_ARRAY(COMP_EMPTY())); 561 SND_SOC_DAILINK_DEFS(connsys_i2s, 562 DAILINK_COMP_ARRAY(COMP_CPU("CONNSYS_I2S")), 563 DAILINK_COMP_ARRAY(COMP_DUMMY()), 564 DAILINK_COMP_ARRAY(COMP_EMPTY())); 565 SND_SOC_DAILINK_DEFS(pcm1, 566 DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")), 567 DAILINK_COMP_ARRAY(COMP_CODEC("bt-sco", "bt-sco-pcm-wb")), 568 DAILINK_COMP_ARRAY(COMP_EMPTY())); 569 SND_SOC_DAILINK_DEFS(tdm_in, 570 DAILINK_COMP_ARRAY(COMP_CPU("TDM IN")), 571 DAILINK_COMP_ARRAY(COMP_DUMMY()), 572 DAILINK_COMP_ARRAY(COMP_EMPTY())); 573 574 /* hostless */ 575 SND_SOC_DAILINK_DEFS(hostless_ul1, 576 DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL1 DAI")), 577 DAILINK_COMP_ARRAY(COMP_DUMMY()), 578 DAILINK_COMP_ARRAY(COMP_EMPTY())); 579 SND_SOC_DAILINK_DEFS(hostless_ul2, 580 DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL2 DAI")), 581 DAILINK_COMP_ARRAY(COMP_DUMMY()), 582 DAILINK_COMP_ARRAY(COMP_EMPTY())); 583 SND_SOC_DAILINK_DEFS(hostless_ul3, 584 DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL3 DAI")), 585 DAILINK_COMP_ARRAY(COMP_DUMMY()), 586 DAILINK_COMP_ARRAY(COMP_EMPTY())); 587 SND_SOC_DAILINK_DEFS(hostless_ul5, 588 DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL5 DAI")), 589 DAILINK_COMP_ARRAY(COMP_DUMMY()), 590 DAILINK_COMP_ARRAY(COMP_EMPTY())); 591 SND_SOC_DAILINK_DEFS(hostless_ul6, 592 DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL6 DAI")), 593 DAILINK_COMP_ARRAY(COMP_DUMMY()), 594 DAILINK_COMP_ARRAY(COMP_EMPTY())); 595 SND_SOC_DAILINK_DEFS(hostless_hw_gain_aaudio, 596 DAILINK_COMP_ARRAY(COMP_CPU("Hostless HW Gain AAudio DAI")), 597 DAILINK_COMP_ARRAY(COMP_DUMMY()), 598 DAILINK_COMP_ARRAY(COMP_EMPTY())); 599 SND_SOC_DAILINK_DEFS(hostless_src_aaudio, 600 DAILINK_COMP_ARRAY(COMP_CPU("Hostless SRC AAudio DAI")), 601 DAILINK_COMP_ARRAY(COMP_DUMMY()), 602 DAILINK_COMP_ARRAY(COMP_EMPTY())); 603 SND_SOC_DAILINK_DEFS(AFE_SOF_DL1, 604 DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL1")), 605 DAILINK_COMP_ARRAY(COMP_DUMMY()), 606 DAILINK_COMP_ARRAY(COMP_EMPTY())); 607 608 SND_SOC_DAILINK_DEFS(AFE_SOF_DL2, 609 DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")), 610 DAILINK_COMP_ARRAY(COMP_DUMMY()), 611 DAILINK_COMP_ARRAY(COMP_EMPTY())); 612 613 SND_SOC_DAILINK_DEFS(AFE_SOF_UL1, 614 DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL1")), 615 DAILINK_COMP_ARRAY(COMP_DUMMY()), 616 DAILINK_COMP_ARRAY(COMP_EMPTY())); 617 618 SND_SOC_DAILINK_DEFS(AFE_SOF_UL2, 619 DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL2")), 620 DAILINK_COMP_ARRAY(COMP_DUMMY()), 621 DAILINK_COMP_ARRAY(COMP_EMPTY())); 622 623 static const struct sof_conn_stream g_sof_conn_streams[] = { 624 { "I2S1", "AFE_SOF_DL1", SOF_DMA_DL1, SNDRV_PCM_STREAM_PLAYBACK}, 625 { "I2S3", "AFE_SOF_DL2", SOF_DMA_DL2, SNDRV_PCM_STREAM_PLAYBACK}, 626 { "Primary Codec", "AFE_SOF_UL1", SOF_DMA_UL1, SNDRV_PCM_STREAM_CAPTURE}, 627 { "I2S0", "AFE_SOF_UL2", SOF_DMA_UL2, SNDRV_PCM_STREAM_CAPTURE}, 628 }; 629 630 static struct snd_soc_dai_link mt8186_mt6366_rt1019_rt5682s_dai_links[] = { 631 /* Front End DAI links */ 632 { 633 .name = "Playback_1", 634 .stream_name = "Playback_1", 635 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 636 SND_SOC_DPCM_TRIGGER_PRE}, 637 .dynamic = 1, 638 .dpcm_playback = 1, 639 .dpcm_merged_format = 1, 640 .dpcm_merged_chan = 1, 641 .dpcm_merged_rate = 1, 642 .ops = &mt8186_mt6366_rt1019_rt5682s_playback_ops, 643 SND_SOC_DAILINK_REG(playback1), 644 }, 645 { 646 .name = "Playback_12", 647 .stream_name = "Playback_12", 648 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 649 SND_SOC_DPCM_TRIGGER_PRE}, 650 .dynamic = 1, 651 .dpcm_playback = 1, 652 SND_SOC_DAILINK_REG(playback12), 653 }, 654 { 655 .name = "Playback_2", 656 .stream_name = "Playback_2", 657 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 658 SND_SOC_DPCM_TRIGGER_PRE}, 659 .dynamic = 1, 660 .dpcm_playback = 1, 661 .dpcm_merged_format = 1, 662 .dpcm_merged_chan = 1, 663 .dpcm_merged_rate = 1, 664 SND_SOC_DAILINK_REG(playback2), 665 }, 666 { 667 .name = "Playback_3", 668 .stream_name = "Playback_3", 669 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 670 SND_SOC_DPCM_TRIGGER_PRE}, 671 .dynamic = 1, 672 .dpcm_playback = 1, 673 .dpcm_merged_format = 1, 674 .dpcm_merged_chan = 1, 675 .dpcm_merged_rate = 1, 676 .ops = &mt8186_mt6366_rt1019_rt5682s_playback_ops, 677 SND_SOC_DAILINK_REG(playback3), 678 }, 679 { 680 .name = "Playback_4", 681 .stream_name = "Playback_4", 682 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 683 SND_SOC_DPCM_TRIGGER_PRE}, 684 .dynamic = 1, 685 .dpcm_playback = 1, 686 SND_SOC_DAILINK_REG(playback4), 687 }, 688 { 689 .name = "Playback_5", 690 .stream_name = "Playback_5", 691 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 692 SND_SOC_DPCM_TRIGGER_PRE}, 693 .dynamic = 1, 694 .dpcm_playback = 1, 695 SND_SOC_DAILINK_REG(playback5), 696 }, 697 { 698 .name = "Playback_6", 699 .stream_name = "Playback_6", 700 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 701 SND_SOC_DPCM_TRIGGER_PRE}, 702 .dynamic = 1, 703 .dpcm_playback = 1, 704 SND_SOC_DAILINK_REG(playback6), 705 }, 706 { 707 .name = "Playback_7", 708 .stream_name = "Playback_7", 709 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 710 SND_SOC_DPCM_TRIGGER_PRE}, 711 .dynamic = 1, 712 .dpcm_playback = 1, 713 SND_SOC_DAILINK_REG(playback7), 714 }, 715 { 716 .name = "Playback_8", 717 .stream_name = "Playback_8", 718 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 719 SND_SOC_DPCM_TRIGGER_PRE}, 720 .dynamic = 1, 721 .dpcm_playback = 1, 722 SND_SOC_DAILINK_REG(playback8), 723 }, 724 { 725 .name = "Capture_1", 726 .stream_name = "Capture_1", 727 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 728 SND_SOC_DPCM_TRIGGER_PRE}, 729 .dynamic = 1, 730 .dpcm_capture = 1, 731 SND_SOC_DAILINK_REG(capture1), 732 }, 733 { 734 .name = "Capture_2", 735 .stream_name = "Capture_2", 736 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 737 SND_SOC_DPCM_TRIGGER_PRE}, 738 .dynamic = 1, 739 .dpcm_capture = 1, 740 .dpcm_merged_format = 1, 741 .dpcm_merged_chan = 1, 742 .dpcm_merged_rate = 1, 743 .ops = &mt8186_mt6366_rt1019_rt5682s_capture_ops, 744 SND_SOC_DAILINK_REG(capture2), 745 }, 746 { 747 .name = "Capture_3", 748 .stream_name = "Capture_3", 749 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 750 SND_SOC_DPCM_TRIGGER_PRE}, 751 .dynamic = 1, 752 .dpcm_capture = 1, 753 SND_SOC_DAILINK_REG(capture3), 754 }, 755 { 756 .name = "Capture_4", 757 .stream_name = "Capture_4", 758 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 759 SND_SOC_DPCM_TRIGGER_PRE}, 760 .dynamic = 1, 761 .dpcm_capture = 1, 762 .dpcm_merged_format = 1, 763 .dpcm_merged_chan = 1, 764 .dpcm_merged_rate = 1, 765 .ops = &mt8186_mt6366_rt1019_rt5682s_capture_ops, 766 SND_SOC_DAILINK_REG(capture4), 767 }, 768 { 769 .name = "Capture_5", 770 .stream_name = "Capture_5", 771 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 772 SND_SOC_DPCM_TRIGGER_PRE}, 773 .dynamic = 1, 774 .dpcm_capture = 1, 775 SND_SOC_DAILINK_REG(capture5), 776 }, 777 { 778 .name = "Capture_6", 779 .stream_name = "Capture_6", 780 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 781 SND_SOC_DPCM_TRIGGER_PRE}, 782 .dynamic = 1, 783 .dpcm_capture = 1, 784 .dpcm_merged_format = 1, 785 .dpcm_merged_chan = 1, 786 .dpcm_merged_rate = 1, 787 SND_SOC_DAILINK_REG(capture6), 788 }, 789 { 790 .name = "Capture_7", 791 .stream_name = "Capture_7", 792 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 793 SND_SOC_DPCM_TRIGGER_PRE}, 794 .dynamic = 1, 795 .dpcm_capture = 1, 796 SND_SOC_DAILINK_REG(capture7), 797 }, 798 { 799 .name = "Hostless_LPBK", 800 .stream_name = "Hostless_LPBK", 801 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 802 SND_SOC_DPCM_TRIGGER_PRE}, 803 .dynamic = 1, 804 .dpcm_playback = 1, 805 .dpcm_capture = 1, 806 .ignore_suspend = 1, 807 SND_SOC_DAILINK_REG(hostless_lpbk), 808 }, 809 { 810 .name = "Hostless_FM", 811 .stream_name = "Hostless_FM", 812 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 813 SND_SOC_DPCM_TRIGGER_PRE}, 814 .dynamic = 1, 815 .dpcm_playback = 1, 816 .dpcm_capture = 1, 817 .ignore_suspend = 1, 818 SND_SOC_DAILINK_REG(hostless_fm), 819 }, 820 { 821 .name = "Hostless_SRC_1", 822 .stream_name = "Hostless_SRC_1", 823 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 824 SND_SOC_DPCM_TRIGGER_PRE}, 825 .dynamic = 1, 826 .dpcm_playback = 1, 827 .dpcm_capture = 1, 828 .ignore_suspend = 1, 829 SND_SOC_DAILINK_REG(hostless_src1), 830 }, 831 { 832 .name = "Hostless_SRC_Bargein", 833 .stream_name = "Hostless_SRC_Bargein", 834 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 835 SND_SOC_DPCM_TRIGGER_PRE}, 836 .dynamic = 1, 837 .dpcm_playback = 1, 838 .dpcm_capture = 1, 839 .ignore_suspend = 1, 840 SND_SOC_DAILINK_REG(hostless_src_bargein), 841 }, 842 { 843 .name = "Hostless_HW_Gain_AAudio", 844 .stream_name = "Hostless_HW_Gain_AAudio", 845 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 846 SND_SOC_DPCM_TRIGGER_PRE}, 847 .dynamic = 1, 848 .dpcm_capture = 1, 849 .ignore_suspend = 1, 850 SND_SOC_DAILINK_REG(hostless_hw_gain_aaudio), 851 }, 852 { 853 .name = "Hostless_SRC_AAudio", 854 .stream_name = "Hostless_SRC_AAudio", 855 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 856 SND_SOC_DPCM_TRIGGER_PRE}, 857 .dynamic = 1, 858 .dpcm_playback = 1, 859 .dpcm_capture = 1, 860 .ignore_suspend = 1, 861 SND_SOC_DAILINK_REG(hostless_src_aaudio), 862 }, 863 /* Back End DAI links */ 864 { 865 .name = "Primary Codec", 866 .no_pcm = 1, 867 .dpcm_playback = 1, 868 .dpcm_capture = 1, 869 .ignore_suspend = 1, 870 .init = primary_codec_init, 871 SND_SOC_DAILINK_REG(adda), 872 }, 873 { 874 .name = "I2S3", 875 .no_pcm = 1, 876 .dai_fmt = SND_SOC_DAIFMT_I2S | 877 SND_SOC_DAIFMT_IB_IF | 878 SND_SOC_DAIFMT_CBM_CFM, 879 .dpcm_playback = 1, 880 .ignore_suspend = 1, 881 .init = mt8186_mt6366_rt1019_rt5682s_hdmi_init, 882 .be_hw_params_fixup = mt8186_it6505_i2s_hw_params_fixup, 883 SND_SOC_DAILINK_REG(i2s3), 884 }, 885 { 886 .name = "I2S0", 887 .no_pcm = 1, 888 .dpcm_capture = 1, 889 .ignore_suspend = 1, 890 .be_hw_params_fixup = mt8186_i2s_hw_params_fixup, 891 .ops = &mt8186_rt5682s_i2s_ops, 892 SND_SOC_DAILINK_REG(i2s0), 893 }, 894 { 895 .name = "I2S1", 896 .no_pcm = 1, 897 .dpcm_playback = 1, 898 .ignore_suspend = 1, 899 .be_hw_params_fixup = mt8186_i2s_hw_params_fixup, 900 .init = mt8186_rt5682s_init, 901 .ops = &mt8186_rt5682s_i2s_ops, 902 SND_SOC_DAILINK_REG(i2s1), 903 }, 904 { 905 .name = "I2S2", 906 .no_pcm = 1, 907 .dpcm_capture = 1, 908 .ignore_suspend = 1, 909 .be_hw_params_fixup = mt8186_i2s_hw_params_fixup, 910 SND_SOC_DAILINK_REG(i2s2), 911 }, 912 { 913 .name = "HW Gain 1", 914 .no_pcm = 1, 915 .dpcm_playback = 1, 916 .dpcm_capture = 1, 917 .ignore_suspend = 1, 918 SND_SOC_DAILINK_REG(hw_gain1), 919 }, 920 { 921 .name = "HW Gain 2", 922 .no_pcm = 1, 923 .dpcm_playback = 1, 924 .dpcm_capture = 1, 925 .ignore_suspend = 1, 926 SND_SOC_DAILINK_REG(hw_gain2), 927 }, 928 { 929 .name = "HW_SRC_1", 930 .no_pcm = 1, 931 .dpcm_playback = 1, 932 .dpcm_capture = 1, 933 .ignore_suspend = 1, 934 SND_SOC_DAILINK_REG(hw_src1), 935 }, 936 { 937 .name = "HW_SRC_2", 938 .no_pcm = 1, 939 .dpcm_playback = 1, 940 .dpcm_capture = 1, 941 .ignore_suspend = 1, 942 SND_SOC_DAILINK_REG(hw_src2), 943 }, 944 { 945 .name = "CONNSYS_I2S", 946 .no_pcm = 1, 947 .dpcm_capture = 1, 948 .ignore_suspend = 1, 949 SND_SOC_DAILINK_REG(connsys_i2s), 950 }, 951 { 952 .name = "PCM 1", 953 .dai_fmt = SND_SOC_DAIFMT_I2S | 954 SND_SOC_DAIFMT_NB_IF, 955 .no_pcm = 1, 956 .dpcm_playback = 1, 957 .dpcm_capture = 1, 958 .ignore_suspend = 1, 959 SND_SOC_DAILINK_REG(pcm1), 960 }, 961 { 962 .name = "TDM IN", 963 .no_pcm = 1, 964 .dpcm_capture = 1, 965 .ignore_suspend = 1, 966 SND_SOC_DAILINK_REG(tdm_in), 967 }, 968 /* dummy BE for ul memif to record from dl memif */ 969 { 970 .name = "Hostless_UL1", 971 .no_pcm = 1, 972 .dpcm_capture = 1, 973 .ignore_suspend = 1, 974 SND_SOC_DAILINK_REG(hostless_ul1), 975 }, 976 { 977 .name = "Hostless_UL2", 978 .no_pcm = 1, 979 .dpcm_capture = 1, 980 .ignore_suspend = 1, 981 SND_SOC_DAILINK_REG(hostless_ul2), 982 }, 983 { 984 .name = "Hostless_UL3", 985 .no_pcm = 1, 986 .dpcm_capture = 1, 987 .ignore_suspend = 1, 988 SND_SOC_DAILINK_REG(hostless_ul3), 989 }, 990 { 991 .name = "Hostless_UL5", 992 .no_pcm = 1, 993 .dpcm_capture = 1, 994 .ignore_suspend = 1, 995 SND_SOC_DAILINK_REG(hostless_ul5), 996 }, 997 { 998 .name = "Hostless_UL6", 999 .no_pcm = 1, 1000 .dpcm_capture = 1, 1001 .ignore_suspend = 1, 1002 SND_SOC_DAILINK_REG(hostless_ul6), 1003 }, 1004 /* SOF BE */ 1005 { 1006 .name = "AFE_SOF_DL1", 1007 .no_pcm = 1, 1008 .dpcm_playback = 1, 1009 SND_SOC_DAILINK_REG(AFE_SOF_DL1), 1010 }, 1011 { 1012 .name = "AFE_SOF_DL2", 1013 .no_pcm = 1, 1014 .dpcm_playback = 1, 1015 SND_SOC_DAILINK_REG(AFE_SOF_DL2), 1016 }, 1017 { 1018 .name = "AFE_SOF_UL1", 1019 .no_pcm = 1, 1020 .dpcm_capture = 1, 1021 SND_SOC_DAILINK_REG(AFE_SOF_UL1), 1022 }, 1023 { 1024 .name = "AFE_SOF_UL2", 1025 .no_pcm = 1, 1026 .dpcm_capture = 1, 1027 SND_SOC_DAILINK_REG(AFE_SOF_UL2), 1028 }, 1029 }; 1030 1031 static const struct snd_soc_dapm_widget 1032 mt8186_mt6366_rt1019_rt5682s_widgets[] = { 1033 SND_SOC_DAPM_SPK("Speakers", NULL), 1034 SND_SOC_DAPM_HP("Headphone", NULL), 1035 SND_SOC_DAPM_MIC("Headset Mic", NULL), 1036 SND_SOC_DAPM_OUTPUT("HDMI1"), 1037 SND_SOC_DAPM_MIXER(SOF_DMA_DL1, SND_SOC_NOPM, 0, 0, NULL, 0), 1038 SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0), 1039 SND_SOC_DAPM_MIXER(SOF_DMA_UL1, SND_SOC_NOPM, 0, 0, NULL, 0), 1040 SND_SOC_DAPM_MIXER(SOF_DMA_UL2, SND_SOC_NOPM, 0, 0, NULL, 0), 1041 }; 1042 1043 static const struct snd_soc_dapm_route 1044 mt8186_mt6366_rt1019_rt5682s_routes[] = { 1045 /* SPK */ 1046 { "Speakers", NULL, "Speaker" }, 1047 /* Headset */ 1048 { "Headphone", NULL, "HPOL" }, 1049 { "Headphone", NULL, "HPOR" }, 1050 { "IN1P", NULL, "Headset Mic" }, 1051 /* HDMI */ 1052 { "HDMI1", NULL, "TX" }, 1053 /* SOF Uplink */ 1054 {SOF_DMA_UL1, NULL, "UL1_CH1"}, 1055 {SOF_DMA_UL1, NULL, "UL1_CH2"}, 1056 {SOF_DMA_UL2, NULL, "UL2_CH1"}, 1057 {SOF_DMA_UL2, NULL, "UL2_CH2"}, 1058 /* SOF Downlink */ 1059 {"DSP_DL1_VIRT", NULL, SOF_DMA_DL1}, 1060 {"DSP_DL2_VIRT", NULL, SOF_DMA_DL2}, 1061 }; 1062 1063 static const struct snd_kcontrol_new 1064 mt8186_mt6366_rt1019_rt5682s_controls[] = { 1065 SOC_DAPM_PIN_SWITCH("Speakers"), 1066 SOC_DAPM_PIN_SWITCH("Headphone"), 1067 SOC_DAPM_PIN_SWITCH("Headset Mic"), 1068 SOC_DAPM_PIN_SWITCH("HDMI1"), 1069 }; 1070 1071 static struct snd_soc_card mt8186_mt6366_rt1019_rt5682s_soc_card = { 1072 .name = "mt8186_rt1019_rt5682s", 1073 .owner = THIS_MODULE, 1074 .dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links, 1075 .num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links), 1076 .controls = mt8186_mt6366_rt1019_rt5682s_controls, 1077 .num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls), 1078 .dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets, 1079 .num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets), 1080 .dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes, 1081 .num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes), 1082 .codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf, 1083 .num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf), 1084 }; 1085 1086 static struct snd_soc_card mt8186_mt6366_rt5682s_max98360_soc_card = { 1087 .name = "mt8186_rt5682s_max98360", 1088 .owner = THIS_MODULE, 1089 .dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links, 1090 .num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links), 1091 .controls = mt8186_mt6366_rt1019_rt5682s_controls, 1092 .num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls), 1093 .dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets, 1094 .num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets), 1095 .dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes, 1096 .num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes), 1097 .codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf, 1098 .num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf), 1099 }; 1100 1101 static int mt8186_mt6366_rt1019_rt5682s_dev_probe(struct platform_device *pdev) 1102 { 1103 struct snd_soc_card *card; 1104 struct snd_soc_dai_link *dai_link; 1105 struct mtk_soc_card_data *soc_card_data; 1106 struct mt8186_mt6366_rt1019_rt5682s_priv *mach_priv; 1107 struct device_node *platform_node, *headset_codec, *playback_codec, *adsp_node; 1108 int sof_on = 0; 1109 int ret, i; 1110 1111 card = (struct snd_soc_card *)device_get_match_data(&pdev->dev); 1112 if (!card) 1113 return -EINVAL; 1114 card->dev = &pdev->dev; 1115 1116 soc_card_data = devm_kzalloc(&pdev->dev, sizeof(*soc_card_data), GFP_KERNEL); 1117 if (!soc_card_data) 1118 return -ENOMEM; 1119 mach_priv = devm_kzalloc(&pdev->dev, sizeof(*mach_priv), GFP_KERNEL); 1120 if (!mach_priv) 1121 return -ENOMEM; 1122 1123 soc_card_data->mach_priv = mach_priv; 1124 1125 mach_priv->dmic_sel = devm_gpiod_get_optional(&pdev->dev, 1126 "dmic", GPIOD_OUT_LOW); 1127 if (IS_ERR(mach_priv->dmic_sel)) { 1128 dev_err(&pdev->dev, "DMIC gpio failed err=%ld\n", 1129 PTR_ERR(mach_priv->dmic_sel)); 1130 return PTR_ERR(mach_priv->dmic_sel); 1131 } 1132 1133 adsp_node = of_parse_phandle(pdev->dev.of_node, "mediatek,adsp", 0); 1134 if (adsp_node) { 1135 struct mtk_sof_priv *sof_priv; 1136 1137 sof_priv = devm_kzalloc(&pdev->dev, sizeof(*sof_priv), GFP_KERNEL); 1138 if (!sof_priv) { 1139 ret = -ENOMEM; 1140 goto err_adsp_node; 1141 } 1142 sof_priv->conn_streams = g_sof_conn_streams; 1143 sof_priv->num_streams = ARRAY_SIZE(g_sof_conn_streams); 1144 sof_priv->sof_dai_link_fixup = mt8186_sof_dai_link_fixup; 1145 soc_card_data->sof_priv = sof_priv; 1146 card->probe = mtk_sof_card_probe; 1147 card->late_probe = mtk_sof_card_late_probe; 1148 if (!card->topology_shortname_created) { 1149 snprintf(card->topology_shortname, 32, "sof-%s", card->name); 1150 card->topology_shortname_created = true; 1151 } 1152 card->name = card->topology_shortname; 1153 sof_on = 1; 1154 } else { 1155 dev_dbg(&pdev->dev, "Probe without adsp\n"); 1156 } 1157 1158 if (of_property_read_bool(pdev->dev.of_node, "mediatek,dai-link")) { 1159 ret = mtk_sof_dailink_parse_of(card, pdev->dev.of_node, 1160 "mediatek,dai-link", 1161 mt8186_mt6366_rt1019_rt5682s_dai_links, 1162 ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links)); 1163 if (ret) { 1164 dev_dbg(&pdev->dev, "Parse dai-link fail\n"); 1165 goto err_adsp_node; 1166 } 1167 } else { 1168 if (!sof_on) 1169 card->num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links) 1170 - ARRAY_SIZE(g_sof_conn_streams); 1171 } 1172 1173 platform_node = of_parse_phandle(pdev->dev.of_node, "mediatek,platform", 0); 1174 if (!platform_node) { 1175 ret = -EINVAL; 1176 dev_err_probe(&pdev->dev, ret, "Property 'platform' missing or invalid\n"); 1177 goto err_platform_node; 1178 } 1179 1180 playback_codec = of_get_child_by_name(pdev->dev.of_node, "playback-codecs"); 1181 if (!playback_codec) { 1182 ret = -EINVAL; 1183 dev_err_probe(&pdev->dev, ret, "Property 'speaker-codecs' missing or invalid\n"); 1184 goto err_playback_codec; 1185 } 1186 1187 headset_codec = of_get_child_by_name(pdev->dev.of_node, "headset-codec"); 1188 if (!headset_codec) { 1189 ret = -EINVAL; 1190 dev_err_probe(&pdev->dev, ret, "Property 'headset-codec' missing or invalid\n"); 1191 goto err_headset_codec; 1192 } 1193 1194 for_each_card_prelinks(card, i, dai_link) { 1195 ret = mt8186_mt6366_card_set_be_link(card, dai_link, playback_codec, "I2S3"); 1196 if (ret) { 1197 dev_err_probe(&pdev->dev, ret, "%s set speaker_codec fail\n", 1198 dai_link->name); 1199 goto err_probe; 1200 } 1201 1202 ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S0"); 1203 if (ret) { 1204 dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n", 1205 dai_link->name); 1206 goto err_probe; 1207 } 1208 1209 ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S1"); 1210 if (ret) { 1211 dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n", 1212 dai_link->name); 1213 goto err_probe; 1214 } 1215 1216 if (!strncmp(dai_link->name, "AFE_SOF", strlen("AFE_SOF")) && sof_on) 1217 dai_link->platforms->of_node = adsp_node; 1218 1219 if (!dai_link->platforms->name && !dai_link->platforms->of_node) 1220 dai_link->platforms->of_node = platform_node; 1221 } 1222 1223 snd_soc_card_set_drvdata(card, soc_card_data); 1224 1225 ret = mt8186_afe_gpio_init(&pdev->dev); 1226 if (ret) { 1227 dev_err_probe(&pdev->dev, ret, "%s init gpio error\n", __func__); 1228 goto err_probe; 1229 } 1230 1231 ret = devm_snd_soc_register_card(&pdev->dev, card); 1232 if (ret) 1233 dev_err_probe(&pdev->dev, ret, "%s snd_soc_register_card fail\n", __func__); 1234 1235 err_probe: 1236 of_node_put(headset_codec); 1237 err_headset_codec: 1238 of_node_put(playback_codec); 1239 err_playback_codec: 1240 of_node_put(platform_node); 1241 err_platform_node: 1242 err_adsp_node: 1243 of_node_put(adsp_node); 1244 1245 return ret; 1246 } 1247 1248 #if IS_ENABLED(CONFIG_OF) 1249 static const struct of_device_id mt8186_mt6366_rt1019_rt5682s_dt_match[] = { 1250 { 1251 .compatible = "mediatek,mt8186-mt6366-rt1019-rt5682s-sound", 1252 .data = &mt8186_mt6366_rt1019_rt5682s_soc_card, 1253 }, 1254 { 1255 .compatible = "mediatek,mt8186-mt6366-rt5682s-max98360-sound", 1256 .data = &mt8186_mt6366_rt5682s_max98360_soc_card, 1257 }, 1258 {} 1259 }; 1260 MODULE_DEVICE_TABLE(of, mt8186_mt6366_rt1019_rt5682s_dt_match); 1261 #endif 1262 1263 static struct platform_driver mt8186_mt6366_rt1019_rt5682s_driver = { 1264 .driver = { 1265 .name = "mt8186_mt6366_rt1019_rt5682s", 1266 #if IS_ENABLED(CONFIG_OF) 1267 .of_match_table = mt8186_mt6366_rt1019_rt5682s_dt_match, 1268 #endif 1269 .pm = &snd_soc_pm_ops, 1270 }, 1271 .probe = mt8186_mt6366_rt1019_rt5682s_dev_probe, 1272 }; 1273 1274 module_platform_driver(mt8186_mt6366_rt1019_rt5682s_driver); 1275 1276 /* Module information */ 1277 MODULE_DESCRIPTION("MT8186-MT6366-RT1019-RT5682S ALSA SoC machine driver"); 1278 MODULE_AUTHOR("Jiaxin Yu <jiaxin.yu@mediatek.com>"); 1279 MODULE_LICENSE("GPL v2"); 1280 MODULE_ALIAS("mt8186_mt6366_rt1019_rt5682s soc card"); 1281