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