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