1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * mt8195-mt6359.c -- 4 * MT8195-MT6359 ALSA SoC machine driver code 5 * 6 * Copyright (c) 2022 MediaTek Inc. 7 * Author: Trevor Wu <trevor.wu@mediatek.com> 8 * YC Hung <yc.hung@mediatek.com> 9 */ 10 11 #include <linux/input.h> 12 #include <linux/module.h> 13 #include <linux/of.h> 14 #include <linux/pm_runtime.h> 15 #include <sound/jack.h> 16 #include <sound/pcm_params.h> 17 #include <sound/rt5682.h> 18 #include <sound/soc.h> 19 #include "../../codecs/mt6359.h" 20 #include "../../codecs/rt1011.h" 21 #include "../../codecs/rt5682.h" 22 #include "../common/mtk-afe-platform-driver.h" 23 #include "../common/mtk-dsp-sof-common.h" 24 #include "../common/mtk-soc-card.h" 25 #include "../common/mtk-soundcard-driver.h" 26 #include "mt8195-afe-clk.h" 27 #include "mt8195-afe-common.h" 28 29 #define RT1011_SPEAKER_AMP_PRESENT BIT(0) 30 #define RT1019_SPEAKER_AMP_PRESENT BIT(1) 31 #define MAX98390_SPEAKER_AMP_PRESENT BIT(2) 32 33 #define DUMB_CODEC_INIT BIT(0) 34 #define MT6359_CODEC_INIT BIT(1) 35 #define RT1011_CODEC_INIT BIT(2) 36 #define RT1019_CODEC_INIT BIT(3) 37 #define MAX98390_CODEC_INIT BIT(4) 38 #define RT5682_CODEC_INIT BIT(5) 39 40 #define RT1011_CODEC_DAI "rt1011-aif" 41 #define RT1011_DEV0_NAME "rt1011.2-0038" 42 #define RT1011_DEV1_NAME "rt1011.2-0039" 43 44 #define RT1019_CODEC_DAI "HiFi" 45 #define RT1019_DEV0_NAME "rt1019p" 46 47 #define MAX98390_CODEC_DAI "max98390-aif1" 48 #define MAX98390_DEV0_NAME "max98390.2-0038" /* right */ 49 #define MAX98390_DEV1_NAME "max98390.2-0039" /* left */ 50 51 #define RT5682_CODEC_DAI "rt5682-aif1" 52 #define RT5682_DEV0_NAME "rt5682.2-001a" 53 54 #define RT5682S_CODEC_DAI "rt5682s-aif1" 55 #define RT5682S_DEV0_NAME "rt5682s.2-001a" 56 57 #define SOF_DMA_DL2 "SOF_DMA_DL2" 58 #define SOF_DMA_DL3 "SOF_DMA_DL3" 59 #define SOF_DMA_UL4 "SOF_DMA_UL4" 60 #define SOF_DMA_UL5 "SOF_DMA_UL5" 61 62 struct mt8195_mt6359_priv { 63 struct clk *i2so1_mclk; 64 }; 65 66 enum mt8195_jacks { 67 MT8195_JACK_HEADSET, 68 MT8195_JACK_DP, 69 MT8195_JACK_HDMI, 70 MT8195_JACK_MAX, 71 }; 72 73 /* Headset jack detection DAPM pins */ 74 static struct snd_soc_jack_pin mt8195_jack_pins[] = { 75 { 76 .pin = "Headphone", 77 .mask = SND_JACK_HEADPHONE, 78 }, 79 { 80 .pin = "Headset Mic", 81 .mask = SND_JACK_MICROPHONE, 82 }, 83 }; 84 85 static const struct snd_soc_dapm_widget mt8195_mt6359_widgets[] = { 86 SND_SOC_DAPM_HP("Headphone", NULL), 87 SND_SOC_DAPM_MIC("Headset Mic", NULL), 88 SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0), 89 SND_SOC_DAPM_MIXER(SOF_DMA_DL3, SND_SOC_NOPM, 0, 0, NULL, 0), 90 SND_SOC_DAPM_MIXER(SOF_DMA_UL4, SND_SOC_NOPM, 0, 0, NULL, 0), 91 SND_SOC_DAPM_MIXER(SOF_DMA_UL5, SND_SOC_NOPM, 0, 0, NULL, 0), 92 }; 93 94 static const struct snd_soc_dapm_route mt8195_mt6359_routes[] = { 95 /* SOF Uplink */ 96 {SOF_DMA_UL4, NULL, "O034"}, 97 {SOF_DMA_UL4, NULL, "O035"}, 98 {SOF_DMA_UL5, NULL, "O036"}, 99 {SOF_DMA_UL5, NULL, "O037"}, 100 /* SOF Downlink */ 101 {"I070", NULL, SOF_DMA_DL2}, 102 {"I071", NULL, SOF_DMA_DL2}, 103 {"I020", NULL, SOF_DMA_DL3}, 104 {"I021", NULL, SOF_DMA_DL3}, 105 }; 106 107 static const struct snd_kcontrol_new mt8195_mt6359_controls[] = { 108 SOC_DAPM_PIN_SWITCH("Headphone"), 109 SOC_DAPM_PIN_SWITCH("Headset Mic"), 110 }; 111 112 static const struct snd_soc_dapm_widget mt8195_dual_speaker_widgets[] = { 113 SND_SOC_DAPM_SPK("Left Spk", NULL), 114 SND_SOC_DAPM_SPK("Right Spk", NULL), 115 }; 116 117 static const struct snd_kcontrol_new mt8195_dual_speaker_controls[] = { 118 SOC_DAPM_PIN_SWITCH("Left Spk"), 119 SOC_DAPM_PIN_SWITCH("Right Spk"), 120 }; 121 122 static const struct snd_soc_dapm_widget mt8195_speaker_widgets[] = { 123 SND_SOC_DAPM_SPK("Ext Spk", NULL), 124 }; 125 126 static const struct snd_kcontrol_new mt8195_speaker_controls[] = { 127 SOC_DAPM_PIN_SWITCH("Ext Spk"), 128 }; 129 130 static const struct snd_soc_dapm_route mt8195_rt5682_routes[] = { 131 /* headset */ 132 { "Headphone", NULL, "HPOL" }, 133 { "Headphone", NULL, "HPOR" }, 134 { "IN1P", NULL, "Headset Mic" }, 135 }; 136 137 static const struct snd_soc_dapm_route mt8195_rt1011_routes[] = { 138 { "Left Spk", NULL, "Left SPO" }, 139 { "Right Spk", NULL, "Right SPO" }, 140 }; 141 142 static const struct snd_soc_dapm_route mt8195_rt1019_routes[] = { 143 { "Ext Spk", NULL, "Speaker" }, 144 }; 145 146 static const struct snd_soc_dapm_route mt8195_max98390_routes[] = { 147 { "Left Spk", NULL, "Left BE_OUT" }, 148 { "Right Spk", NULL, "Right BE_OUT" }, 149 }; 150 151 #define CKSYS_AUD_TOP_CFG 0x032c 152 #define CKSYS_AUD_TOP_MON 0x0330 153 154 static int mt8195_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd) 155 { 156 struct snd_soc_component *cmpnt_afe = 157 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); 158 struct snd_soc_component *cmpnt_codec = 159 snd_soc_rtd_to_codec(rtd, 0)->component; 160 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe); 161 struct mt8195_afe_private *afe_priv = afe->platform_priv; 162 struct mtkaif_param *param = &afe_priv->mtkaif_params; 163 int chosen_phase_1, chosen_phase_2, chosen_phase_3; 164 int prev_cycle_1, prev_cycle_2, prev_cycle_3; 165 int test_done_1, test_done_2, test_done_3; 166 int cycle_1, cycle_2, cycle_3; 167 int mtkaif_chosen_phase[MT8195_MTKAIF_MISO_NUM]; 168 int mtkaif_phase_cycle[MT8195_MTKAIF_MISO_NUM]; 169 int mtkaif_calibration_num_phase; 170 bool mtkaif_calibration_ok; 171 unsigned int monitor = 0; 172 int counter; 173 int phase; 174 int i; 175 176 dev_dbg(afe->dev, "%s(), start\n", __func__); 177 178 param->mtkaif_calibration_ok = false; 179 for (i = 0; i < MT8195_MTKAIF_MISO_NUM; i++) { 180 param->mtkaif_chosen_phase[i] = -1; 181 param->mtkaif_phase_cycle[i] = 0; 182 mtkaif_chosen_phase[i] = -1; 183 mtkaif_phase_cycle[i] = 0; 184 } 185 186 if (IS_ERR(afe_priv->topckgen)) { 187 dev_info(afe->dev, "%s() Cannot find topckgen controller\n", 188 __func__); 189 return 0; 190 } 191 192 pm_runtime_get_sync(afe->dev); 193 mt6359_mtkaif_calibration_enable(cmpnt_codec); 194 195 /* set test type to synchronizer pulse */ 196 regmap_update_bits(afe_priv->topckgen, 197 CKSYS_AUD_TOP_CFG, 0xffff, 0x4); 198 mtkaif_calibration_num_phase = 42; /* mt6359: 0 ~ 42 */ 199 mtkaif_calibration_ok = true; 200 201 for (phase = 0; 202 phase <= mtkaif_calibration_num_phase && mtkaif_calibration_ok; 203 phase++) { 204 mt6359_set_mtkaif_calibration_phase(cmpnt_codec, 205 phase, phase, phase); 206 207 regmap_update_bits(afe_priv->topckgen, 208 CKSYS_AUD_TOP_CFG, 0x1, 0x1); 209 210 test_done_1 = 0; 211 test_done_2 = 0; 212 test_done_3 = 0; 213 cycle_1 = -1; 214 cycle_2 = -1; 215 cycle_3 = -1; 216 counter = 0; 217 while (!(test_done_1 & test_done_2 & test_done_3)) { 218 regmap_read(afe_priv->topckgen, 219 CKSYS_AUD_TOP_MON, &monitor); 220 test_done_1 = (monitor >> 28) & 0x1; 221 test_done_2 = (monitor >> 29) & 0x1; 222 test_done_3 = (monitor >> 30) & 0x1; 223 if (test_done_1 == 1) 224 cycle_1 = monitor & 0xf; 225 226 if (test_done_2 == 1) 227 cycle_2 = (monitor >> 4) & 0xf; 228 229 if (test_done_3 == 1) 230 cycle_3 = (monitor >> 8) & 0xf; 231 232 /* handle if never test done */ 233 if (++counter > 10000) { 234 dev_info(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, cycle_3 %d, monitor 0x%x\n", 235 __func__, 236 cycle_1, cycle_2, cycle_3, monitor); 237 mtkaif_calibration_ok = false; 238 break; 239 } 240 } 241 242 if (phase == 0) { 243 prev_cycle_1 = cycle_1; 244 prev_cycle_2 = cycle_2; 245 prev_cycle_3 = cycle_3; 246 } 247 248 if (cycle_1 != prev_cycle_1 && 249 mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] < 0) { 250 mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] = phase - 1; 251 mtkaif_phase_cycle[MT8195_MTKAIF_MISO_0] = prev_cycle_1; 252 } 253 254 if (cycle_2 != prev_cycle_2 && 255 mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] < 0) { 256 mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] = phase - 1; 257 mtkaif_phase_cycle[MT8195_MTKAIF_MISO_1] = prev_cycle_2; 258 } 259 260 if (cycle_3 != prev_cycle_3 && 261 mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] < 0) { 262 mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] = phase - 1; 263 mtkaif_phase_cycle[MT8195_MTKAIF_MISO_2] = prev_cycle_3; 264 } 265 266 regmap_update_bits(afe_priv->topckgen, 267 CKSYS_AUD_TOP_CFG, 0x1, 0x0); 268 269 if (mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] >= 0 && 270 mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] >= 0 && 271 mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] >= 0) 272 break; 273 } 274 275 if (mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] < 0) { 276 mtkaif_calibration_ok = false; 277 chosen_phase_1 = 0; 278 } else { 279 chosen_phase_1 = mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0]; 280 } 281 282 if (mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] < 0) { 283 mtkaif_calibration_ok = false; 284 chosen_phase_2 = 0; 285 } else { 286 chosen_phase_2 = mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1]; 287 } 288 289 if (mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] < 0) { 290 mtkaif_calibration_ok = false; 291 chosen_phase_3 = 0; 292 } else { 293 chosen_phase_3 = mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2]; 294 } 295 296 mt6359_set_mtkaif_calibration_phase(cmpnt_codec, 297 chosen_phase_1, 298 chosen_phase_2, 299 chosen_phase_3); 300 301 mt6359_mtkaif_calibration_disable(cmpnt_codec); 302 pm_runtime_put(afe->dev); 303 304 param->mtkaif_calibration_ok = mtkaif_calibration_ok; 305 param->mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] = chosen_phase_1; 306 param->mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] = chosen_phase_2; 307 param->mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] = chosen_phase_3; 308 for (i = 0; i < MT8195_MTKAIF_MISO_NUM; i++) 309 param->mtkaif_phase_cycle[i] = mtkaif_phase_cycle[i]; 310 311 dev_info(afe->dev, "%s(), end, calibration ok %d\n", 312 __func__, param->mtkaif_calibration_ok); 313 314 return 0; 315 } 316 317 static int mt8195_mt6359_init(struct snd_soc_pcm_runtime *rtd) 318 { 319 struct snd_soc_component *cmpnt_codec = 320 snd_soc_rtd_to_codec(rtd, 0)->component; 321 322 /* set mtkaif protocol */ 323 mt6359_set_mtkaif_protocol(cmpnt_codec, 324 MT6359_MTKAIF_PROTOCOL_2_CLK_P2); 325 326 /* mtkaif calibration */ 327 mt8195_mt6359_mtkaif_calibration(rtd); 328 329 return 0; 330 } 331 332 static int mt8195_hdmitx_dptx_startup(struct snd_pcm_substream *substream) 333 { 334 return mtk_soundcard_startup(substream, MTK_CONSTRAINT_HDMIDP); 335 } 336 337 static const struct snd_soc_ops mt8195_hdmitx_dptx_playback_ops = { 338 .startup = mt8195_hdmitx_dptx_startup, 339 }; 340 341 static int mt8195_dptx_hw_params(struct snd_pcm_substream *substream, 342 struct snd_pcm_hw_params *params) 343 { 344 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 345 struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); 346 347 return snd_soc_dai_set_sysclk(cpu_dai, 0, params_rate(params) * 256, 348 SND_SOC_CLOCK_OUT); 349 } 350 351 static const struct snd_soc_ops mt8195_dptx_ops = { 352 .hw_params = mt8195_dptx_hw_params, 353 }; 354 355 static int mt8195_dptx_codec_init(struct snd_soc_pcm_runtime *rtd) 356 { 357 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card); 358 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8195_JACK_DP]; 359 struct snd_soc_component *cmpnt_codec = 360 snd_soc_rtd_to_codec(rtd, 0)->component; 361 int ret; 362 363 ret = snd_soc_card_jack_new(rtd->card, "DP Jack", SND_JACK_AVOUT, jack); 364 if (ret) 365 return ret; 366 367 return snd_soc_component_set_jack(cmpnt_codec, jack, NULL); 368 } 369 370 static int mt8195_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd) 371 { 372 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card); 373 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8195_JACK_HDMI]; 374 struct snd_soc_component *cmpnt_codec = 375 snd_soc_rtd_to_codec(rtd, 0)->component; 376 int ret; 377 378 ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_AVOUT, jack); 379 if (ret) 380 return ret; 381 382 return snd_soc_component_set_jack(cmpnt_codec, jack, NULL); 383 } 384 385 static int mt8195_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, 386 struct snd_pcm_hw_params *params) 387 { 388 /* fix BE i2s format to S24_LE, clean param mask first */ 389 snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT), 390 0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST); 391 392 params_set_format(params, SNDRV_PCM_FORMAT_S24_LE); 393 394 return 0; 395 } 396 397 static int mt8195_rt5682_etdm_hw_params(struct snd_pcm_substream *substream, 398 struct snd_pcm_hw_params *params) 399 { 400 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 401 struct snd_soc_card *card = rtd->card; 402 struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); 403 struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0); 404 unsigned int rate = params_rate(params); 405 int bitwidth; 406 int ret; 407 408 bitwidth = snd_pcm_format_width(params_format(params)); 409 if (bitwidth < 0) { 410 dev_err(card->dev, "invalid bit width: %d\n", bitwidth); 411 return bitwidth; 412 } 413 414 ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth); 415 if (ret) { 416 dev_err(card->dev, "failed to set tdm slot\n"); 417 return ret; 418 } 419 420 ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1, RT5682_PLL1_S_MCLK, 421 rate * 256, rate * 512); 422 if (ret) { 423 dev_err(card->dev, "failed to set pll\n"); 424 return ret; 425 } 426 427 ret = snd_soc_dai_set_sysclk(codec_dai, RT5682_SCLK_S_PLL1, 428 rate * 512, SND_SOC_CLOCK_IN); 429 if (ret) { 430 dev_err(card->dev, "failed to set sysclk\n"); 431 return ret; 432 } 433 434 return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 256, 435 SND_SOC_CLOCK_OUT); 436 } 437 438 static const struct snd_soc_ops mt8195_rt5682_etdm_ops = { 439 .hw_params = mt8195_rt5682_etdm_hw_params, 440 }; 441 442 static int mt8195_rt5682_init(struct snd_soc_pcm_runtime *rtd) 443 { 444 struct snd_soc_component *cmpnt_codec = 445 snd_soc_rtd_to_codec(rtd, 0)->component; 446 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card); 447 struct mt8195_mt6359_priv *priv = soc_card_data->mach_priv; 448 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8195_JACK_HEADSET]; 449 struct snd_soc_component *cmpnt_afe = 450 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); 451 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe); 452 struct mt8195_afe_private *afe_priv = afe->platform_priv; 453 struct snd_soc_card *card = rtd->card; 454 int ret; 455 456 priv->i2so1_mclk = afe_priv->clk[MT8195_CLK_TOP_APLL12_DIV2]; 457 458 ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack", 459 SND_JACK_HEADSET | SND_JACK_BTN_0 | 460 SND_JACK_BTN_1 | SND_JACK_BTN_2 | 461 SND_JACK_BTN_3, 462 jack, mt8195_jack_pins, 463 ARRAY_SIZE(mt8195_jack_pins)); 464 if (ret) { 465 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret); 466 return ret; 467 } 468 469 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); 470 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND); 471 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP); 472 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN); 473 474 ret = snd_soc_component_set_jack(cmpnt_codec, jack, NULL); 475 if (ret) { 476 dev_err(rtd->dev, "Headset Jack set failed: %d\n", ret); 477 return ret; 478 } 479 480 ret = snd_soc_dapm_add_routes(&card->dapm, mt8195_rt5682_routes, 481 ARRAY_SIZE(mt8195_rt5682_routes)); 482 if (ret) 483 dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret); 484 485 return ret; 486 }; 487 488 static int mt8195_rt1011_etdm_hw_params(struct snd_pcm_substream *substream, 489 struct snd_pcm_hw_params *params) 490 { 491 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 492 struct snd_soc_dai *codec_dai; 493 struct snd_soc_card *card = rtd->card; 494 int srate, i, ret; 495 496 srate = params_rate(params); 497 498 for_each_rtd_codec_dais(rtd, i, codec_dai) { 499 ret = snd_soc_dai_set_pll(codec_dai, 0, RT1011_PLL1_S_BCLK, 500 64 * srate, 256 * srate); 501 if (ret < 0) { 502 dev_err(card->dev, "codec_dai clock not set\n"); 503 return ret; 504 } 505 506 ret = snd_soc_dai_set_sysclk(codec_dai, 507 RT1011_FS_SYS_PRE_S_PLL1, 508 256 * srate, SND_SOC_CLOCK_IN); 509 if (ret < 0) { 510 dev_err(card->dev, "codec_dai clock not set\n"); 511 return ret; 512 } 513 } 514 return 0; 515 } 516 517 static const struct snd_soc_ops mt8195_rt1011_etdm_ops = { 518 .hw_params = mt8195_rt1011_etdm_hw_params, 519 }; 520 521 static int mt8195_sof_be_hw_params(struct snd_pcm_substream *substream, 522 struct snd_pcm_hw_params *params) 523 { 524 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 525 struct snd_soc_component *cmpnt_afe = NULL; 526 struct snd_soc_pcm_runtime *runtime; 527 528 /* find afe component */ 529 for_each_card_rtds(rtd->card, runtime) { 530 cmpnt_afe = snd_soc_rtdcom_lookup(runtime, AFE_PCM_NAME); 531 if (cmpnt_afe) 532 break; 533 } 534 535 if (cmpnt_afe && !pm_runtime_active(cmpnt_afe->dev)) { 536 dev_err(rtd->dev, "afe pm runtime is not active!!\n"); 537 return -EINVAL; 538 } 539 540 return 0; 541 } 542 543 static const struct snd_soc_ops mt8195_sof_be_ops = { 544 .hw_params = mt8195_sof_be_hw_params, 545 }; 546 547 static int mt8195_rt1011_init(struct snd_soc_pcm_runtime *rtd) 548 { 549 struct snd_soc_card *card = rtd->card; 550 int ret; 551 552 ret = snd_soc_dapm_new_controls(&card->dapm, mt8195_dual_speaker_widgets, 553 ARRAY_SIZE(mt8195_dual_speaker_widgets)); 554 if (ret) { 555 dev_err(rtd->dev, "unable to add dapm controls, ret %d\n", ret); 556 /* Don't need to add routes if widget addition failed */ 557 return ret; 558 } 559 560 ret = snd_soc_add_card_controls(card, mt8195_dual_speaker_controls, 561 ARRAY_SIZE(mt8195_dual_speaker_controls)); 562 if (ret) { 563 dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret); 564 return ret; 565 } 566 567 ret = snd_soc_dapm_add_routes(&card->dapm, mt8195_rt1011_routes, 568 ARRAY_SIZE(mt8195_rt1011_routes)); 569 if (ret) 570 dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret); 571 572 return ret; 573 } 574 575 static int mt8195_dumb_amp_init(struct snd_soc_pcm_runtime *rtd) 576 { 577 struct snd_soc_card *card = rtd->card; 578 int ret; 579 580 ret = snd_soc_dapm_new_controls(&card->dapm, mt8195_speaker_widgets, 581 ARRAY_SIZE(mt8195_speaker_widgets)); 582 if (ret) { 583 dev_err(rtd->dev, "unable to add dapm controls, ret %d\n", ret); 584 /* Don't need to add routes if widget addition failed */ 585 return ret; 586 } 587 588 ret = snd_soc_add_card_controls(card, mt8195_speaker_controls, 589 ARRAY_SIZE(mt8195_speaker_controls)); 590 if (ret) { 591 dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret); 592 return ret; 593 } 594 595 return 0; 596 } 597 598 static int mt8195_rt1019_init(struct snd_soc_pcm_runtime *rtd) 599 { 600 struct snd_soc_card *card = rtd->card; 601 int ret; 602 603 ret = mt8195_dumb_amp_init(rtd); 604 if (ret) 605 return ret; 606 607 ret = snd_soc_dapm_add_routes(&card->dapm, mt8195_rt1019_routes, 608 ARRAY_SIZE(mt8195_rt1019_routes)); 609 if (ret) 610 dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret); 611 612 return ret; 613 } 614 615 static int mt8195_max98390_init(struct snd_soc_pcm_runtime *rtd) 616 { 617 struct snd_soc_card *card = rtd->card; 618 int ret; 619 620 ret = snd_soc_dapm_new_controls(&card->dapm, mt8195_dual_speaker_widgets, 621 ARRAY_SIZE(mt8195_dual_speaker_widgets)); 622 if (ret) { 623 dev_err(rtd->dev, "unable to add dapm controls, ret %d\n", ret); 624 /* Don't need to add routes if widget addition failed */ 625 return ret; 626 } 627 628 ret = snd_soc_add_card_controls(card, mt8195_dual_speaker_controls, 629 ARRAY_SIZE(mt8195_dual_speaker_controls)); 630 if (ret) { 631 dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret); 632 return ret; 633 } 634 635 ret = snd_soc_dapm_add_routes(&card->dapm, mt8195_max98390_routes, 636 ARRAY_SIZE(mt8195_max98390_routes)); 637 if (ret) 638 dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret); 639 640 return ret; 641 } 642 643 static int mt8195_etdm_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, 644 struct snd_pcm_hw_params *params) 645 { 646 /* fix BE i2s format to S24_LE, clean param mask first */ 647 snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT), 648 0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST); 649 650 params_set_format(params, SNDRV_PCM_FORMAT_S24_LE); 651 652 return 0; 653 } 654 655 static int mt8195_set_bias_level_post(struct snd_soc_card *card, 656 struct snd_soc_dapm_context *dapm, enum snd_soc_bias_level level) 657 { 658 struct snd_soc_component *component = dapm->component; 659 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card); 660 struct mt8195_mt6359_priv *priv = soc_card_data->mach_priv; 661 int ret; 662 663 /* 664 * It's required to control mclk directly in the set_bias_level_post 665 * function for rt5682 and rt5682s codec, or the unexpected pop happens 666 * at the end of playback. 667 */ 668 if (!component || 669 (strcmp(component->name, RT5682_DEV0_NAME) && 670 strcmp(component->name, RT5682S_DEV0_NAME))) 671 return 0; 672 673 switch (level) { 674 case SND_SOC_BIAS_OFF: 675 if (!__clk_is_enabled(priv->i2so1_mclk)) 676 return 0; 677 678 clk_disable_unprepare(priv->i2so1_mclk); 679 dev_dbg(card->dev, "Disable i2so1 mclk\n"); 680 break; 681 case SND_SOC_BIAS_ON: 682 ret = clk_prepare_enable(priv->i2so1_mclk); 683 if (ret) { 684 dev_err(card->dev, "Can't enable i2so1 mclk: %d\n", ret); 685 return ret; 686 } 687 dev_dbg(card->dev, "Enable i2so1 mclk\n"); 688 break; 689 default: 690 break; 691 } 692 693 return 0; 694 } 695 696 enum { 697 DAI_LINK_DL2_FE, 698 DAI_LINK_DL3_FE, 699 DAI_LINK_DL6_FE, 700 DAI_LINK_DL7_FE, 701 DAI_LINK_DL8_FE, 702 DAI_LINK_DL10_FE, 703 DAI_LINK_DL11_FE, 704 DAI_LINK_UL1_FE, 705 DAI_LINK_UL2_FE, 706 DAI_LINK_UL3_FE, 707 DAI_LINK_UL4_FE, 708 DAI_LINK_UL5_FE, 709 DAI_LINK_UL6_FE, 710 DAI_LINK_UL8_FE, 711 DAI_LINK_UL9_FE, 712 DAI_LINK_UL10_FE, 713 DAI_LINK_DL_SRC_BE, 714 DAI_LINK_DPTX_BE, 715 DAI_LINK_ETDM1_IN_BE, 716 DAI_LINK_ETDM2_IN_BE, 717 DAI_LINK_ETDM1_OUT_BE, 718 DAI_LINK_ETDM2_OUT_BE, 719 DAI_LINK_ETDM3_OUT_BE, 720 DAI_LINK_PCM1_BE, 721 DAI_LINK_UL_SRC1_BE, 722 DAI_LINK_UL_SRC2_BE, 723 DAI_LINK_REGULAR_LAST = DAI_LINK_UL_SRC2_BE, 724 DAI_LINK_SOF_START, 725 DAI_LINK_SOF_DL2_BE = DAI_LINK_SOF_START, 726 DAI_LINK_SOF_DL3_BE, 727 DAI_LINK_SOF_UL4_BE, 728 DAI_LINK_SOF_UL5_BE, 729 DAI_LINK_SOF_END = DAI_LINK_SOF_UL5_BE, 730 }; 731 732 #define DAI_LINK_REGULAR_NUM (DAI_LINK_REGULAR_LAST + 1) 733 734 /* FE */ 735 SND_SOC_DAILINK_DEFS(DL2_FE, 736 DAILINK_COMP_ARRAY(COMP_CPU("DL2")), 737 DAILINK_COMP_ARRAY(COMP_DUMMY()), 738 DAILINK_COMP_ARRAY(COMP_EMPTY())); 739 740 SND_SOC_DAILINK_DEFS(DL3_FE, 741 DAILINK_COMP_ARRAY(COMP_CPU("DL3")), 742 DAILINK_COMP_ARRAY(COMP_DUMMY()), 743 DAILINK_COMP_ARRAY(COMP_EMPTY())); 744 745 SND_SOC_DAILINK_DEFS(DL6_FE, 746 DAILINK_COMP_ARRAY(COMP_CPU("DL6")), 747 DAILINK_COMP_ARRAY(COMP_DUMMY()), 748 DAILINK_COMP_ARRAY(COMP_EMPTY())); 749 750 SND_SOC_DAILINK_DEFS(DL7_FE, 751 DAILINK_COMP_ARRAY(COMP_CPU("DL7")), 752 DAILINK_COMP_ARRAY(COMP_DUMMY()), 753 DAILINK_COMP_ARRAY(COMP_EMPTY())); 754 755 SND_SOC_DAILINK_DEFS(DL8_FE, 756 DAILINK_COMP_ARRAY(COMP_CPU("DL8")), 757 DAILINK_COMP_ARRAY(COMP_DUMMY()), 758 DAILINK_COMP_ARRAY(COMP_EMPTY())); 759 760 SND_SOC_DAILINK_DEFS(DL10_FE, 761 DAILINK_COMP_ARRAY(COMP_CPU("DL10")), 762 DAILINK_COMP_ARRAY(COMP_DUMMY()), 763 DAILINK_COMP_ARRAY(COMP_EMPTY())); 764 765 SND_SOC_DAILINK_DEFS(DL11_FE, 766 DAILINK_COMP_ARRAY(COMP_CPU("DL11")), 767 DAILINK_COMP_ARRAY(COMP_DUMMY()), 768 DAILINK_COMP_ARRAY(COMP_EMPTY())); 769 770 SND_SOC_DAILINK_DEFS(UL1_FE, 771 DAILINK_COMP_ARRAY(COMP_CPU("UL1")), 772 DAILINK_COMP_ARRAY(COMP_DUMMY()), 773 DAILINK_COMP_ARRAY(COMP_EMPTY())); 774 775 SND_SOC_DAILINK_DEFS(UL2_FE, 776 DAILINK_COMP_ARRAY(COMP_CPU("UL2")), 777 DAILINK_COMP_ARRAY(COMP_DUMMY()), 778 DAILINK_COMP_ARRAY(COMP_EMPTY())); 779 780 SND_SOC_DAILINK_DEFS(UL3_FE, 781 DAILINK_COMP_ARRAY(COMP_CPU("UL3")), 782 DAILINK_COMP_ARRAY(COMP_DUMMY()), 783 DAILINK_COMP_ARRAY(COMP_EMPTY())); 784 785 SND_SOC_DAILINK_DEFS(UL4_FE, 786 DAILINK_COMP_ARRAY(COMP_CPU("UL4")), 787 DAILINK_COMP_ARRAY(COMP_DUMMY()), 788 DAILINK_COMP_ARRAY(COMP_EMPTY())); 789 790 SND_SOC_DAILINK_DEFS(UL5_FE, 791 DAILINK_COMP_ARRAY(COMP_CPU("UL5")), 792 DAILINK_COMP_ARRAY(COMP_DUMMY()), 793 DAILINK_COMP_ARRAY(COMP_EMPTY())); 794 795 SND_SOC_DAILINK_DEFS(UL6_FE, 796 DAILINK_COMP_ARRAY(COMP_CPU("UL6")), 797 DAILINK_COMP_ARRAY(COMP_DUMMY()), 798 DAILINK_COMP_ARRAY(COMP_EMPTY())); 799 800 SND_SOC_DAILINK_DEFS(UL8_FE, 801 DAILINK_COMP_ARRAY(COMP_CPU("UL8")), 802 DAILINK_COMP_ARRAY(COMP_DUMMY()), 803 DAILINK_COMP_ARRAY(COMP_EMPTY())); 804 805 SND_SOC_DAILINK_DEFS(UL9_FE, 806 DAILINK_COMP_ARRAY(COMP_CPU("UL9")), 807 DAILINK_COMP_ARRAY(COMP_DUMMY()), 808 DAILINK_COMP_ARRAY(COMP_EMPTY())); 809 810 SND_SOC_DAILINK_DEFS(UL10_FE, 811 DAILINK_COMP_ARRAY(COMP_CPU("UL10")), 812 DAILINK_COMP_ARRAY(COMP_DUMMY()), 813 DAILINK_COMP_ARRAY(COMP_EMPTY())); 814 815 /* BE */ 816 SND_SOC_DAILINK_DEFS(DL_SRC_BE, 817 DAILINK_COMP_ARRAY(COMP_CPU("DL_SRC")), 818 DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound", 819 "mt6359-snd-codec-aif1")), 820 DAILINK_COMP_ARRAY(COMP_EMPTY())); 821 822 SND_SOC_DAILINK_DEFS(DPTX_BE, 823 DAILINK_COMP_ARRAY(COMP_CPU("DPTX")), 824 DAILINK_COMP_ARRAY(COMP_DUMMY()), 825 DAILINK_COMP_ARRAY(COMP_EMPTY())); 826 827 SND_SOC_DAILINK_DEFS(ETDM1_IN_BE, 828 DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_IN")), 829 DAILINK_COMP_ARRAY(COMP_DUMMY()), 830 DAILINK_COMP_ARRAY(COMP_EMPTY())); 831 832 SND_SOC_DAILINK_DEFS(ETDM2_IN_BE, 833 DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_IN")), 834 DAILINK_COMP_ARRAY(COMP_DUMMY()), 835 DAILINK_COMP_ARRAY(COMP_EMPTY())); 836 837 SND_SOC_DAILINK_DEFS(ETDM1_OUT_BE, 838 DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_OUT")), 839 DAILINK_COMP_ARRAY(COMP_DUMMY()), 840 DAILINK_COMP_ARRAY(COMP_EMPTY())); 841 842 SND_SOC_DAILINK_DEFS(ETDM2_OUT_BE, 843 DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_OUT")), 844 DAILINK_COMP_ARRAY(COMP_DUMMY()), 845 DAILINK_COMP_ARRAY(COMP_EMPTY())); 846 847 SND_SOC_DAILINK_DEFS(ETDM3_OUT_BE, 848 DAILINK_COMP_ARRAY(COMP_CPU("ETDM3_OUT")), 849 DAILINK_COMP_ARRAY(COMP_DUMMY()), 850 DAILINK_COMP_ARRAY(COMP_EMPTY())); 851 852 SND_SOC_DAILINK_DEFS(PCM1_BE, 853 DAILINK_COMP_ARRAY(COMP_CPU("PCM1")), 854 DAILINK_COMP_ARRAY(COMP_DUMMY()), 855 DAILINK_COMP_ARRAY(COMP_EMPTY())); 856 857 SND_SOC_DAILINK_DEFS(UL_SRC1_BE, 858 DAILINK_COMP_ARRAY(COMP_CPU("UL_SRC1")), 859 DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound", 860 "mt6359-snd-codec-aif1"), 861 COMP_CODEC("dmic-codec", 862 "dmic-hifi")), 863 DAILINK_COMP_ARRAY(COMP_EMPTY())); 864 865 SND_SOC_DAILINK_DEFS(UL_SRC2_BE, 866 DAILINK_COMP_ARRAY(COMP_CPU("UL_SRC2")), 867 DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound", 868 "mt6359-snd-codec-aif2")), 869 DAILINK_COMP_ARRAY(COMP_EMPTY())); 870 871 SND_SOC_DAILINK_DEFS(AFE_SOF_DL2, 872 DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")), 873 DAILINK_COMP_ARRAY(COMP_DUMMY()), 874 DAILINK_COMP_ARRAY(COMP_EMPTY())); 875 876 SND_SOC_DAILINK_DEFS(AFE_SOF_DL3, 877 DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL3")), 878 DAILINK_COMP_ARRAY(COMP_DUMMY()), 879 DAILINK_COMP_ARRAY(COMP_EMPTY())); 880 881 SND_SOC_DAILINK_DEFS(AFE_SOF_UL4, 882 DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL4")), 883 DAILINK_COMP_ARRAY(COMP_DUMMY()), 884 DAILINK_COMP_ARRAY(COMP_EMPTY())); 885 886 SND_SOC_DAILINK_DEFS(AFE_SOF_UL5, 887 DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL5")), 888 DAILINK_COMP_ARRAY(COMP_DUMMY()), 889 DAILINK_COMP_ARRAY(COMP_EMPTY())); 890 891 /* codec */ 892 SND_SOC_DAILINK_DEF(rt1019_comps, 893 DAILINK_COMP_ARRAY(COMP_CODEC(RT1019_DEV0_NAME, 894 RT1019_CODEC_DAI))); 895 896 SND_SOC_DAILINK_DEF(rt1011_comps, 897 DAILINK_COMP_ARRAY(COMP_CODEC(RT1011_DEV0_NAME, 898 RT1011_CODEC_DAI), 899 COMP_CODEC(RT1011_DEV1_NAME, 900 RT1011_CODEC_DAI))); 901 902 SND_SOC_DAILINK_DEF(max98390_comps, 903 DAILINK_COMP_ARRAY(COMP_CODEC(MAX98390_DEV0_NAME, 904 MAX98390_CODEC_DAI), 905 COMP_CODEC(MAX98390_DEV1_NAME, 906 MAX98390_CODEC_DAI))); 907 908 static const struct sof_conn_stream g_sof_conn_streams[] = { 909 { "ETDM2_OUT_BE", "AFE_SOF_DL2", SOF_DMA_DL2, SNDRV_PCM_STREAM_PLAYBACK}, 910 { "ETDM1_OUT_BE", "AFE_SOF_DL3", SOF_DMA_DL3, SNDRV_PCM_STREAM_PLAYBACK}, 911 { "UL_SRC1_BE", "AFE_SOF_UL4", SOF_DMA_UL4, SNDRV_PCM_STREAM_CAPTURE}, 912 { "ETDM2_IN_BE", "AFE_SOF_UL5", SOF_DMA_UL5, SNDRV_PCM_STREAM_CAPTURE}, 913 }; 914 915 static struct snd_soc_dai_link mt8195_mt6359_dai_links[] = { 916 /* FE */ 917 [DAI_LINK_DL2_FE] = { 918 .name = "DL2_FE", 919 .stream_name = "DL2 Playback", 920 .trigger = { 921 SND_SOC_DPCM_TRIGGER_POST, 922 SND_SOC_DPCM_TRIGGER_POST, 923 }, 924 .dynamic = 1, 925 .playback_only = 1, 926 .ops = &mtk_soundcard_common_playback_ops, 927 SND_SOC_DAILINK_REG(DL2_FE), 928 }, 929 [DAI_LINK_DL3_FE] = { 930 .name = "DL3_FE", 931 .stream_name = "DL3 Playback", 932 .trigger = { 933 SND_SOC_DPCM_TRIGGER_POST, 934 SND_SOC_DPCM_TRIGGER_POST, 935 }, 936 .dynamic = 1, 937 .playback_only = 1, 938 .ops = &mtk_soundcard_common_playback_ops, 939 SND_SOC_DAILINK_REG(DL3_FE), 940 }, 941 [DAI_LINK_DL6_FE] = { 942 .name = "DL6_FE", 943 .stream_name = "DL6 Playback", 944 .trigger = { 945 SND_SOC_DPCM_TRIGGER_POST, 946 SND_SOC_DPCM_TRIGGER_POST, 947 }, 948 .dynamic = 1, 949 .playback_only = 1, 950 .ops = &mtk_soundcard_common_playback_ops, 951 SND_SOC_DAILINK_REG(DL6_FE), 952 }, 953 [DAI_LINK_DL7_FE] = { 954 .name = "DL7_FE", 955 .stream_name = "DL7 Playback", 956 .trigger = { 957 SND_SOC_DPCM_TRIGGER_PRE, 958 SND_SOC_DPCM_TRIGGER_PRE, 959 }, 960 .dynamic = 1, 961 .playback_only = 1, 962 SND_SOC_DAILINK_REG(DL7_FE), 963 }, 964 [DAI_LINK_DL8_FE] = { 965 .name = "DL8_FE", 966 .stream_name = "DL8 Playback", 967 .trigger = { 968 SND_SOC_DPCM_TRIGGER_POST, 969 SND_SOC_DPCM_TRIGGER_POST, 970 }, 971 .dynamic = 1, 972 .playback_only = 1, 973 .ops = &mtk_soundcard_common_playback_ops, 974 SND_SOC_DAILINK_REG(DL8_FE), 975 }, 976 [DAI_LINK_DL10_FE] = { 977 .name = "DL10_FE", 978 .stream_name = "DL10 Playback", 979 .trigger = { 980 SND_SOC_DPCM_TRIGGER_POST, 981 SND_SOC_DPCM_TRIGGER_POST, 982 }, 983 .dynamic = 1, 984 .playback_only = 1, 985 .ops = &mt8195_hdmitx_dptx_playback_ops, 986 SND_SOC_DAILINK_REG(DL10_FE), 987 }, 988 [DAI_LINK_DL11_FE] = { 989 .name = "DL11_FE", 990 .stream_name = "DL11 Playback", 991 .trigger = { 992 SND_SOC_DPCM_TRIGGER_POST, 993 SND_SOC_DPCM_TRIGGER_POST, 994 }, 995 .dynamic = 1, 996 .playback_only = 1, 997 .ops = &mtk_soundcard_common_playback_ops, 998 SND_SOC_DAILINK_REG(DL11_FE), 999 }, 1000 [DAI_LINK_UL1_FE] = { 1001 .name = "UL1_FE", 1002 .stream_name = "UL1 Capture", 1003 .trigger = { 1004 SND_SOC_DPCM_TRIGGER_PRE, 1005 SND_SOC_DPCM_TRIGGER_PRE, 1006 }, 1007 .dynamic = 1, 1008 .capture_only = 1, 1009 SND_SOC_DAILINK_REG(UL1_FE), 1010 }, 1011 [DAI_LINK_UL2_FE] = { 1012 .name = "UL2_FE", 1013 .stream_name = "UL2 Capture", 1014 .trigger = { 1015 SND_SOC_DPCM_TRIGGER_POST, 1016 SND_SOC_DPCM_TRIGGER_POST, 1017 }, 1018 .dynamic = 1, 1019 .capture_only = 1, 1020 .ops = &mtk_soundcard_common_capture_ops, 1021 SND_SOC_DAILINK_REG(UL2_FE), 1022 }, 1023 [DAI_LINK_UL3_FE] = { 1024 .name = "UL3_FE", 1025 .stream_name = "UL3 Capture", 1026 .trigger = { 1027 SND_SOC_DPCM_TRIGGER_POST, 1028 SND_SOC_DPCM_TRIGGER_POST, 1029 }, 1030 .dynamic = 1, 1031 .capture_only = 1, 1032 .ops = &mtk_soundcard_common_capture_ops, 1033 SND_SOC_DAILINK_REG(UL3_FE), 1034 }, 1035 [DAI_LINK_UL4_FE] = { 1036 .name = "UL4_FE", 1037 .stream_name = "UL4 Capture", 1038 .trigger = { 1039 SND_SOC_DPCM_TRIGGER_POST, 1040 SND_SOC_DPCM_TRIGGER_POST, 1041 }, 1042 .dynamic = 1, 1043 .capture_only = 1, 1044 .ops = &mtk_soundcard_common_capture_ops, 1045 SND_SOC_DAILINK_REG(UL4_FE), 1046 }, 1047 [DAI_LINK_UL5_FE] = { 1048 .name = "UL5_FE", 1049 .stream_name = "UL5 Capture", 1050 .trigger = { 1051 SND_SOC_DPCM_TRIGGER_POST, 1052 SND_SOC_DPCM_TRIGGER_POST, 1053 }, 1054 .dynamic = 1, 1055 .capture_only = 1, 1056 .ops = &mtk_soundcard_common_capture_ops, 1057 SND_SOC_DAILINK_REG(UL5_FE), 1058 }, 1059 [DAI_LINK_UL6_FE] = { 1060 .name = "UL6_FE", 1061 .stream_name = "UL6 Capture", 1062 .trigger = { 1063 SND_SOC_DPCM_TRIGGER_PRE, 1064 SND_SOC_DPCM_TRIGGER_PRE, 1065 }, 1066 .dynamic = 1, 1067 .capture_only = 1, 1068 SND_SOC_DAILINK_REG(UL6_FE), 1069 }, 1070 [DAI_LINK_UL8_FE] = { 1071 .name = "UL8_FE", 1072 .stream_name = "UL8 Capture", 1073 .trigger = { 1074 SND_SOC_DPCM_TRIGGER_POST, 1075 SND_SOC_DPCM_TRIGGER_POST, 1076 }, 1077 .dynamic = 1, 1078 .capture_only = 1, 1079 .ops = &mtk_soundcard_common_capture_ops, 1080 SND_SOC_DAILINK_REG(UL8_FE), 1081 }, 1082 [DAI_LINK_UL9_FE] = { 1083 .name = "UL9_FE", 1084 .stream_name = "UL9 Capture", 1085 .trigger = { 1086 SND_SOC_DPCM_TRIGGER_POST, 1087 SND_SOC_DPCM_TRIGGER_POST, 1088 }, 1089 .dynamic = 1, 1090 .capture_only = 1, 1091 .ops = &mtk_soundcard_common_capture_ops, 1092 SND_SOC_DAILINK_REG(UL9_FE), 1093 }, 1094 [DAI_LINK_UL10_FE] = { 1095 .name = "UL10_FE", 1096 .stream_name = "UL10 Capture", 1097 .trigger = { 1098 SND_SOC_DPCM_TRIGGER_POST, 1099 SND_SOC_DPCM_TRIGGER_POST, 1100 }, 1101 .dynamic = 1, 1102 .capture_only = 1, 1103 .ops = &mtk_soundcard_common_capture_ops, 1104 SND_SOC_DAILINK_REG(UL10_FE), 1105 }, 1106 /* BE */ 1107 [DAI_LINK_DL_SRC_BE] = { 1108 .name = "DL_SRC_BE", 1109 .no_pcm = 1, 1110 .playback_only = 1, 1111 SND_SOC_DAILINK_REG(DL_SRC_BE), 1112 }, 1113 [DAI_LINK_DPTX_BE] = { 1114 .name = "DPTX_BE", 1115 .no_pcm = 1, 1116 .playback_only = 1, 1117 .ops = &mt8195_dptx_ops, 1118 .be_hw_params_fixup = mt8195_dptx_hw_params_fixup, 1119 SND_SOC_DAILINK_REG(DPTX_BE), 1120 }, 1121 [DAI_LINK_ETDM1_IN_BE] = { 1122 .name = "ETDM1_IN_BE", 1123 .no_pcm = 1, 1124 .dai_fmt = SND_SOC_DAIFMT_I2S | 1125 SND_SOC_DAIFMT_NB_NF | 1126 SND_SOC_DAIFMT_CBC_CFC, 1127 .capture_only = 1, 1128 SND_SOC_DAILINK_REG(ETDM1_IN_BE), 1129 }, 1130 [DAI_LINK_ETDM2_IN_BE] = { 1131 .name = "ETDM2_IN_BE", 1132 .no_pcm = 1, 1133 .dai_fmt = SND_SOC_DAIFMT_I2S | 1134 SND_SOC_DAIFMT_NB_NF | 1135 SND_SOC_DAIFMT_CBC_CFC, 1136 .capture_only = 1, 1137 .be_hw_params_fixup = mt8195_etdm_hw_params_fixup, 1138 SND_SOC_DAILINK_REG(ETDM2_IN_BE), 1139 }, 1140 [DAI_LINK_ETDM1_OUT_BE] = { 1141 .name = "ETDM1_OUT_BE", 1142 .no_pcm = 1, 1143 .dai_fmt = SND_SOC_DAIFMT_I2S | 1144 SND_SOC_DAIFMT_NB_NF | 1145 SND_SOC_DAIFMT_CBC_CFC, 1146 .playback_only = 1, 1147 .be_hw_params_fixup = mt8195_etdm_hw_params_fixup, 1148 SND_SOC_DAILINK_REG(ETDM1_OUT_BE), 1149 }, 1150 [DAI_LINK_ETDM2_OUT_BE] = { 1151 .name = "ETDM2_OUT_BE", 1152 .no_pcm = 1, 1153 .dai_fmt = SND_SOC_DAIFMT_I2S | 1154 SND_SOC_DAIFMT_NB_NF | 1155 SND_SOC_DAIFMT_CBC_CFC, 1156 .playback_only = 1, 1157 SND_SOC_DAILINK_REG(ETDM2_OUT_BE), 1158 }, 1159 [DAI_LINK_ETDM3_OUT_BE] = { 1160 .name = "ETDM3_OUT_BE", 1161 .no_pcm = 1, 1162 .dai_fmt = SND_SOC_DAIFMT_I2S | 1163 SND_SOC_DAIFMT_NB_NF | 1164 SND_SOC_DAIFMT_CBC_CFC, 1165 .playback_only = 1, 1166 SND_SOC_DAILINK_REG(ETDM3_OUT_BE), 1167 }, 1168 [DAI_LINK_PCM1_BE] = { 1169 .name = "PCM1_BE", 1170 .no_pcm = 1, 1171 .dai_fmt = SND_SOC_DAIFMT_I2S | 1172 SND_SOC_DAIFMT_NB_NF | 1173 SND_SOC_DAIFMT_CBC_CFC, 1174 SND_SOC_DAILINK_REG(PCM1_BE), 1175 }, 1176 [DAI_LINK_UL_SRC1_BE] = { 1177 .name = "UL_SRC1_BE", 1178 .no_pcm = 1, 1179 .capture_only = 1, 1180 SND_SOC_DAILINK_REG(UL_SRC1_BE), 1181 }, 1182 [DAI_LINK_UL_SRC2_BE] = { 1183 .name = "UL_SRC2_BE", 1184 .no_pcm = 1, 1185 .capture_only = 1, 1186 SND_SOC_DAILINK_REG(UL_SRC2_BE), 1187 }, 1188 /* SOF BE */ 1189 [DAI_LINK_SOF_DL2_BE] = { 1190 .name = "AFE_SOF_DL2", 1191 .no_pcm = 1, 1192 .playback_only = 1, 1193 .ops = &mt8195_sof_be_ops, 1194 SND_SOC_DAILINK_REG(AFE_SOF_DL2), 1195 }, 1196 [DAI_LINK_SOF_DL3_BE] = { 1197 .name = "AFE_SOF_DL3", 1198 .no_pcm = 1, 1199 .playback_only = 1, 1200 .ops = &mt8195_sof_be_ops, 1201 SND_SOC_DAILINK_REG(AFE_SOF_DL3), 1202 }, 1203 [DAI_LINK_SOF_UL4_BE] = { 1204 .name = "AFE_SOF_UL4", 1205 .no_pcm = 1, 1206 .capture_only = 1, 1207 .ops = &mt8195_sof_be_ops, 1208 SND_SOC_DAILINK_REG(AFE_SOF_UL4), 1209 }, 1210 [DAI_LINK_SOF_UL5_BE] = { 1211 .name = "AFE_SOF_UL5", 1212 .no_pcm = 1, 1213 .capture_only = 1, 1214 .ops = &mt8195_sof_be_ops, 1215 SND_SOC_DAILINK_REG(AFE_SOF_UL5), 1216 }, 1217 }; 1218 1219 static struct snd_soc_codec_conf rt1011_codec_conf[] = { 1220 { 1221 .dlc = COMP_CODEC_CONF(RT1011_DEV0_NAME), 1222 .name_prefix = "Left", 1223 }, 1224 { 1225 .dlc = COMP_CODEC_CONF(RT1011_DEV1_NAME), 1226 .name_prefix = "Right", 1227 }, 1228 }; 1229 1230 static struct snd_soc_codec_conf max98390_codec_conf[] = { 1231 { 1232 .dlc = COMP_CODEC_CONF(MAX98390_DEV0_NAME), 1233 .name_prefix = "Right", 1234 }, 1235 { 1236 .dlc = COMP_CODEC_CONF(MAX98390_DEV1_NAME), 1237 .name_prefix = "Left", 1238 }, 1239 }; 1240 1241 static struct snd_soc_card mt8195_mt6359_soc_card = { 1242 .owner = THIS_MODULE, 1243 .dai_link = mt8195_mt6359_dai_links, 1244 .num_links = ARRAY_SIZE(mt8195_mt6359_dai_links), 1245 .controls = mt8195_mt6359_controls, 1246 .num_controls = ARRAY_SIZE(mt8195_mt6359_controls), 1247 .dapm_widgets = mt8195_mt6359_widgets, 1248 .num_dapm_widgets = ARRAY_SIZE(mt8195_mt6359_widgets), 1249 .dapm_routes = mt8195_mt6359_routes, 1250 .num_dapm_routes = ARRAY_SIZE(mt8195_mt6359_routes), 1251 .set_bias_level_post = mt8195_set_bias_level_post, 1252 }; 1253 1254 /* fixup the BE DAI link to match any values from topology */ 1255 static int mt8195_dai_link_fixup(struct snd_soc_pcm_runtime *rtd, 1256 struct snd_pcm_hw_params *params) 1257 { 1258 int ret; 1259 1260 ret = mtk_sof_dai_link_fixup(rtd, params); 1261 1262 if (!strcmp(rtd->dai_link->name, "ETDM2_IN_BE") || 1263 !strcmp(rtd->dai_link->name, "ETDM1_OUT_BE")) { 1264 mt8195_etdm_hw_params_fixup(rtd, params); 1265 } 1266 1267 return ret; 1268 } 1269 1270 static int mt8195_mt6359_legacy_probe(struct mtk_soc_card_data *soc_card_data) 1271 { 1272 struct mtk_platform_card_data *card_data = soc_card_data->card_data; 1273 struct snd_soc_card *card = card_data->card; 1274 struct device_node *codec_node, *dp_node, *hdmi_node; 1275 struct snd_soc_dai_link *dai_link; 1276 struct device *dev = card->dev; 1277 bool is5682s, init6359 = false; 1278 int i; 1279 1280 if (strstr(card->name, "_5682s")) { 1281 codec_node = of_find_compatible_node(NULL, NULL, "realtek,rt5682s"); 1282 is5682s = true; 1283 } else { 1284 codec_node = of_find_compatible_node(NULL, NULL, "realtek,rt5682i"); 1285 is5682s = false; 1286 } 1287 1288 dp_node = of_parse_phandle(dev->of_node, "mediatek,dptx-codec", 0); 1289 hdmi_node = of_parse_phandle(dev->of_node, "mediatek,hdmi-codec", 0); 1290 1291 for_each_card_prelinks(card, i, dai_link) { 1292 if (strcmp(dai_link->name, "DPTX_BE") == 0) { 1293 if (!dp_node) { 1294 dev_dbg(dev, "No property 'dptx-codec'\n"); 1295 } else { 1296 dai_link->codecs->of_node = dp_node; 1297 dai_link->codecs->name = NULL; 1298 dai_link->codecs->dai_name = "i2s-hifi"; 1299 dai_link->init = mt8195_dptx_codec_init; 1300 } 1301 } else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) { 1302 if (!hdmi_node) { 1303 dev_dbg(dev, "No property 'hdmi-codec'\n"); 1304 } else { 1305 dai_link->codecs->of_node = hdmi_node; 1306 dai_link->codecs->name = NULL; 1307 dai_link->codecs->dai_name = "i2s-hifi"; 1308 dai_link->init = mt8195_hdmi_codec_init; 1309 } 1310 } else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0) { 1311 if (!codec_node) { 1312 dev_err(dev, "Codec not found!\n"); 1313 } else { 1314 dai_link->codecs->of_node = codec_node; 1315 dai_link->codecs->name = NULL; 1316 dai_link->codecs->dai_name = 1317 is5682s ? RT5682S_CODEC_DAI : RT5682_CODEC_DAI; 1318 dai_link->init = mt8195_rt5682_init; 1319 dai_link->ops = &mt8195_rt5682_etdm_ops; 1320 } 1321 } else if (strcmp(dai_link->name, "ETDM2_IN_BE") == 0) { 1322 if (!codec_node) { 1323 dev_err(dev, "Codec not found!\n"); 1324 } else { 1325 dai_link->codecs->of_node = codec_node; 1326 dai_link->codecs->name = NULL; 1327 dai_link->codecs->dai_name = 1328 is5682s ? RT5682S_CODEC_DAI : RT5682_CODEC_DAI; 1329 dai_link->ops = &mt8195_rt5682_etdm_ops; 1330 } 1331 } else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 || 1332 strcmp(dai_link->name, "UL_SRC1_BE") == 0 || 1333 strcmp(dai_link->name, "UL_SRC2_BE") == 0) { 1334 if (!init6359) { 1335 dai_link->init = mt8195_mt6359_init; 1336 init6359 = true; 1337 } 1338 } else if (strcmp(dai_link->name, "ETDM2_OUT_BE") == 0) { 1339 switch (card_data->flags) { 1340 case RT1011_SPEAKER_AMP_PRESENT: 1341 dai_link->codecs = rt1011_comps; 1342 dai_link->num_codecs = ARRAY_SIZE(rt1011_comps); 1343 dai_link->init = mt8195_rt1011_init; 1344 dai_link->ops = &mt8195_rt1011_etdm_ops; 1345 dai_link->be_hw_params_fixup = mt8195_etdm_hw_params_fixup; 1346 card->codec_conf = rt1011_codec_conf; 1347 card->num_configs = ARRAY_SIZE(rt1011_codec_conf); 1348 break; 1349 case RT1019_SPEAKER_AMP_PRESENT: 1350 dai_link->codecs = rt1019_comps; 1351 dai_link->num_codecs = ARRAY_SIZE(rt1019_comps); 1352 dai_link->init = mt8195_rt1019_init; 1353 break; 1354 case MAX98390_SPEAKER_AMP_PRESENT: 1355 dai_link->codecs = max98390_comps; 1356 dai_link->num_codecs = ARRAY_SIZE(max98390_comps); 1357 dai_link->init = mt8195_max98390_init; 1358 card->codec_conf = max98390_codec_conf; 1359 card->num_configs = ARRAY_SIZE(max98390_codec_conf); 1360 break; 1361 default: 1362 break; 1363 } 1364 } 1365 } 1366 1367 return 0; 1368 } 1369 1370 static int mt8195_mt6359_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy) 1371 { 1372 struct mtk_platform_card_data *card_data = soc_card_data->card_data; 1373 struct snd_soc_card *card = card_data->card; 1374 struct mt8195_mt6359_priv *mach_priv; 1375 struct snd_soc_dai_link *dai_link; 1376 u8 codec_init = 0; 1377 int i; 1378 1379 mach_priv = devm_kzalloc(card->dev, sizeof(*mach_priv), GFP_KERNEL); 1380 if (!mach_priv) 1381 return -ENOMEM; 1382 1383 soc_card_data->mach_priv = mach_priv; 1384 1385 if (legacy) 1386 return mt8195_mt6359_legacy_probe(soc_card_data); 1387 1388 for_each_card_prelinks(card, i, dai_link) { 1389 if (strcmp(dai_link->name, "DPTX_BE") == 0) { 1390 if (dai_link->num_codecs && 1391 !snd_soc_dlc_is_dummy(dai_link->codecs)) 1392 dai_link->init = mt8195_dptx_codec_init; 1393 } else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) { 1394 if (dai_link->num_codecs && 1395 !snd_soc_dlc_is_dummy(dai_link->codecs)) 1396 dai_link->init = mt8195_hdmi_codec_init; 1397 } else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 || 1398 strcmp(dai_link->name, "UL_SRC1_BE") == 0 || 1399 strcmp(dai_link->name, "UL_SRC2_BE") == 0) { 1400 if (!(codec_init & MT6359_CODEC_INIT)) { 1401 dai_link->init = mt8195_mt6359_init; 1402 codec_init |= MT6359_CODEC_INIT; 1403 } 1404 } else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0 || 1405 strcmp(dai_link->name, "ETDM2_OUT_BE") == 0 || 1406 strcmp(dai_link->name, "ETDM1_IN_BE") == 0 || 1407 strcmp(dai_link->name, "ETDM2_IN_BE") == 0) { 1408 if (!dai_link->num_codecs) 1409 continue; 1410 1411 if (!strcmp(dai_link->codecs->dai_name, MAX98390_CODEC_DAI)) { 1412 if (!(codec_init & MAX98390_CODEC_INIT)) { 1413 dai_link->init = mt8195_max98390_init; 1414 codec_init |= MAX98390_CODEC_INIT; 1415 } 1416 } else if (!strcmp(dai_link->codecs->dai_name, RT1011_CODEC_DAI)) { 1417 dai_link->ops = &mt8195_rt1011_etdm_ops; 1418 if (!(codec_init & RT1011_CODEC_INIT)) { 1419 dai_link->init = mt8195_rt1011_init; 1420 codec_init |= RT1011_CODEC_INIT; 1421 } 1422 } else if (!strcmp(dai_link->codecs->dai_name, RT1019_CODEC_DAI)) { 1423 if (!(codec_init & RT1019_CODEC_INIT)) { 1424 dai_link->init = mt8195_rt1019_init; 1425 codec_init |= RT1019_CODEC_INIT; 1426 } 1427 } else if (!strcmp(dai_link->codecs->dai_name, RT5682_CODEC_DAI) || 1428 !strcmp(dai_link->codecs->dai_name, RT5682S_CODEC_DAI)) { 1429 dai_link->ops = &mt8195_rt5682_etdm_ops; 1430 if (!(codec_init & RT5682_CODEC_INIT)) { 1431 dai_link->init = mt8195_rt5682_init; 1432 codec_init |= RT5682_CODEC_INIT; 1433 } 1434 } else { 1435 if (!snd_soc_dlc_is_dummy(dai_link->codecs)) { 1436 if (!(codec_init & DUMB_CODEC_INIT)) { 1437 dai_link->init = mt8195_dumb_amp_init; 1438 codec_init |= DUMB_CODEC_INIT; 1439 } 1440 } 1441 } 1442 } 1443 } 1444 1445 return 0; 1446 } 1447 1448 static const unsigned int mt8195_pcm_playback_channels[] = { 2 }; 1449 static const unsigned int mt8195_pcm_capture_channels[] = { 1, 2 }; 1450 static const unsigned int mt8195_pcm_hdmidp_channels[] = { 2, 4, 6, 8 }; 1451 static const unsigned int mt8195_pcm_rates[] = { 48000 }; 1452 1453 static const struct snd_pcm_hw_constraint_list mt8195_rate_constraint = { 1454 .list = mt8195_pcm_rates, 1455 .count = ARRAY_SIZE(mt8195_pcm_rates) 1456 }; 1457 1458 static const struct mtk_pcm_constraints_data mt8195_pcm_constraints[MTK_CONSTRAINT_HDMIDP + 1] = { 1459 [MTK_CONSTRAINT_PLAYBACK] = { 1460 .channels = &(const struct snd_pcm_hw_constraint_list) { 1461 .list = mt8195_pcm_playback_channels, 1462 .count = ARRAY_SIZE(mt8195_pcm_playback_channels) 1463 }, 1464 .rates = &mt8195_rate_constraint, 1465 }, 1466 [MTK_CONSTRAINT_CAPTURE] = { 1467 .channels = &(const struct snd_pcm_hw_constraint_list) { 1468 .list = mt8195_pcm_capture_channels, 1469 .count = ARRAY_SIZE(mt8195_pcm_capture_channels) 1470 }, 1471 .rates = &mt8195_rate_constraint, 1472 }, 1473 [MTK_CONSTRAINT_HDMIDP] = { 1474 .channels = &(const struct snd_pcm_hw_constraint_list) { 1475 .list = mt8195_pcm_hdmidp_channels, 1476 .count = ARRAY_SIZE(mt8195_pcm_hdmidp_channels) 1477 }, 1478 .rates = &mt8195_rate_constraint, 1479 }, 1480 }; 1481 1482 static const struct mtk_sof_priv mt8195_sof_priv = { 1483 .conn_streams = g_sof_conn_streams, 1484 .num_streams = ARRAY_SIZE(g_sof_conn_streams), 1485 .sof_dai_link_fixup = mt8195_dai_link_fixup 1486 }; 1487 1488 static const struct mtk_soundcard_pdata mt8195_mt6359_rt1019_rt5682_card = { 1489 .card_name = "mt8195_r1019_5682", 1490 .card_data = &(struct mtk_platform_card_data) { 1491 .card = &mt8195_mt6359_soc_card, 1492 .num_jacks = MT8195_JACK_MAX, 1493 .pcm_constraints = mt8195_pcm_constraints, 1494 .num_pcm_constraints = ARRAY_SIZE(mt8195_pcm_constraints), 1495 .flags = RT1019_SPEAKER_AMP_PRESENT 1496 }, 1497 .sof_priv = &mt8195_sof_priv, 1498 .soc_probe = mt8195_mt6359_soc_card_probe 1499 }; 1500 1501 static const struct mtk_soundcard_pdata mt8195_mt6359_rt1011_rt5682_card = { 1502 .card_name = "mt8195_r1011_5682", 1503 .card_data = &(struct mtk_platform_card_data) { 1504 .card = &mt8195_mt6359_soc_card, 1505 .num_jacks = MT8195_JACK_MAX, 1506 .pcm_constraints = mt8195_pcm_constraints, 1507 .num_pcm_constraints = ARRAY_SIZE(mt8195_pcm_constraints), 1508 .flags = RT1011_SPEAKER_AMP_PRESENT 1509 }, 1510 .sof_priv = &mt8195_sof_priv, 1511 .soc_probe = mt8195_mt6359_soc_card_probe 1512 }; 1513 1514 static const struct mtk_soundcard_pdata mt8195_mt6359_max98390_rt5682_card = { 1515 .card_name = "mt8195_m98390_r5682", 1516 .card_data = &(struct mtk_platform_card_data) { 1517 .card = &mt8195_mt6359_soc_card, 1518 .num_jacks = MT8195_JACK_MAX, 1519 .pcm_constraints = mt8195_pcm_constraints, 1520 .num_pcm_constraints = ARRAY_SIZE(mt8195_pcm_constraints), 1521 .flags = MAX98390_SPEAKER_AMP_PRESENT 1522 }, 1523 .sof_priv = &mt8195_sof_priv, 1524 .soc_probe = mt8195_mt6359_soc_card_probe 1525 }; 1526 1527 static const struct mtk_soundcard_pdata mt8195_mt6359_card = { 1528 .card_name = "mt8195_mt6359", 1529 .card_data = &(struct mtk_platform_card_data) { 1530 .card = &mt8195_mt6359_soc_card, 1531 .num_jacks = MT8195_JACK_MAX, 1532 .pcm_constraints = mt8195_pcm_constraints, 1533 .num_pcm_constraints = ARRAY_SIZE(mt8195_pcm_constraints), 1534 }, 1535 .sof_priv = &mt8195_sof_priv, 1536 .soc_probe = mt8195_mt6359_soc_card_probe 1537 }; 1538 1539 static const struct of_device_id mt8195_mt6359_dt_match[] = { 1540 { 1541 .compatible = "mediatek,mt8195_mt6359_rt1019_rt5682", 1542 .data = &mt8195_mt6359_rt1019_rt5682_card, 1543 }, 1544 { 1545 .compatible = "mediatek,mt8195_mt6359_rt1011_rt5682", 1546 .data = &mt8195_mt6359_rt1011_rt5682_card, 1547 }, 1548 { 1549 .compatible = "mediatek,mt8195_mt6359_max98390_rt5682", 1550 .data = &mt8195_mt6359_max98390_rt5682_card, 1551 }, 1552 { 1553 .compatible = "mediatek,mt8195_mt6359", 1554 .data = &mt8195_mt6359_card, 1555 }, 1556 {}, 1557 }; 1558 MODULE_DEVICE_TABLE(of, mt8195_mt6359_dt_match); 1559 1560 static struct platform_driver mt8195_mt6359_driver = { 1561 .driver = { 1562 .name = "mt8195_mt6359", 1563 .of_match_table = mt8195_mt6359_dt_match, 1564 .pm = &snd_soc_pm_ops, 1565 }, 1566 .probe = mtk_soundcard_common_probe, 1567 }; 1568 1569 module_platform_driver(mt8195_mt6359_driver); 1570 1571 /* Module information */ 1572 MODULE_DESCRIPTION("MT8195-MT6359 ALSA SoC machine driver"); 1573 MODULE_AUTHOR("Trevor Wu <trevor.wu@mediatek.com>"); 1574 MODULE_AUTHOR("YC Hung <yc.hung@mediatek.com>"); 1575 MODULE_LICENSE("GPL"); 1576 MODULE_ALIAS("mt8195_mt6359 soc card"); 1577