1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * mt8188-mt6359.c -- MT8188-MT6359 ALSA SoC machine driver 4 * 5 * Copyright (c) 2022 MediaTek Inc. 6 * Author: Trevor Wu <trevor.wu@mediatek.com> 7 */ 8 9 #include <linux/bitfield.h> 10 #include <linux/input.h> 11 #include <linux/module.h> 12 #include <linux/of.h> 13 #include <linux/pm_runtime.h> 14 #include <sound/jack.h> 15 #include <sound/pcm_params.h> 16 #include <sound/soc.h> 17 #include "mt8188-afe-common.h" 18 #include "../../codecs/nau8825.h" 19 #include "../../codecs/mt6359.h" 20 #include "../../codecs/mt6359-accdet.h" 21 #include "../../codecs/rt5682.h" 22 #include "../common/mtk-afe-platform-driver.h" 23 #include "../common/mtk-soundcard-driver.h" 24 #include "../common/mtk-dsp-sof-common.h" 25 #include "../common/mtk-soc-card.h" 26 27 #define CKSYS_AUD_TOP_CFG 0x032c 28 #define RG_TEST_ON BIT(0) 29 #define RG_TEST_TYPE BIT(2) 30 #define CKSYS_AUD_TOP_MON 0x0330 31 #define TEST_MISO_COUNT_1 GENMASK(3, 0) 32 #define TEST_MISO_COUNT_2 GENMASK(7, 4) 33 #define TEST_MISO_DONE_1 BIT(28) 34 #define TEST_MISO_DONE_2 BIT(29) 35 36 #define NAU8825_HS_PRESENT BIT(0) 37 #define RT5682S_HS_PRESENT BIT(1) 38 #define ES8326_HS_PRESENT BIT(2) 39 #define MAX98390_TWO_AMP BIT(3) 40 /* 41 * Maxim MAX98390 42 */ 43 #define MAX98390_CODEC_DAI "max98390-aif1" 44 #define MAX98390_DEV0_NAME "max98390.0-0038" /* rear right */ 45 #define MAX98390_DEV1_NAME "max98390.0-0039" /* rear left */ 46 #define MAX98390_DEV2_NAME "max98390.0-003a" /* front right */ 47 #define MAX98390_DEV3_NAME "max98390.0-003b" /* front left */ 48 49 /* 50 * Nau88l25 51 */ 52 #define NAU8825_CODEC_DAI "nau8825-hifi" 53 54 /* 55 * ES8326 56 */ 57 #define ES8326_CODEC_DAI "ES8326 HiFi" 58 59 #define SOF_DMA_DL2 "SOF_DMA_DL2" 60 #define SOF_DMA_DL3 "SOF_DMA_DL3" 61 #define SOF_DMA_UL4 "SOF_DMA_UL4" 62 #define SOF_DMA_UL5 "SOF_DMA_UL5" 63 64 #define RT5682S_CODEC_DAI "rt5682s-aif1" 65 66 /* FE */ 67 SND_SOC_DAILINK_DEFS(playback2, 68 DAILINK_COMP_ARRAY(COMP_CPU("DL2")), 69 DAILINK_COMP_ARRAY(COMP_DUMMY()), 70 DAILINK_COMP_ARRAY(COMP_EMPTY())); 71 72 SND_SOC_DAILINK_DEFS(playback3, 73 DAILINK_COMP_ARRAY(COMP_CPU("DL3")), 74 DAILINK_COMP_ARRAY(COMP_DUMMY()), 75 DAILINK_COMP_ARRAY(COMP_EMPTY())); 76 77 SND_SOC_DAILINK_DEFS(playback6, 78 DAILINK_COMP_ARRAY(COMP_CPU("DL6")), 79 DAILINK_COMP_ARRAY(COMP_DUMMY()), 80 DAILINK_COMP_ARRAY(COMP_EMPTY())); 81 82 SND_SOC_DAILINK_DEFS(playback7, 83 DAILINK_COMP_ARRAY(COMP_CPU("DL7")), 84 DAILINK_COMP_ARRAY(COMP_DUMMY()), 85 DAILINK_COMP_ARRAY(COMP_EMPTY())); 86 87 SND_SOC_DAILINK_DEFS(playback8, 88 DAILINK_COMP_ARRAY(COMP_CPU("DL8")), 89 DAILINK_COMP_ARRAY(COMP_DUMMY()), 90 DAILINK_COMP_ARRAY(COMP_EMPTY())); 91 92 SND_SOC_DAILINK_DEFS(playback10, 93 DAILINK_COMP_ARRAY(COMP_CPU("DL10")), 94 DAILINK_COMP_ARRAY(COMP_DUMMY()), 95 DAILINK_COMP_ARRAY(COMP_EMPTY())); 96 97 SND_SOC_DAILINK_DEFS(playback11, 98 DAILINK_COMP_ARRAY(COMP_CPU("DL11")), 99 DAILINK_COMP_ARRAY(COMP_DUMMY()), 100 DAILINK_COMP_ARRAY(COMP_EMPTY())); 101 102 SND_SOC_DAILINK_DEFS(capture1, 103 DAILINK_COMP_ARRAY(COMP_CPU("UL1")), 104 DAILINK_COMP_ARRAY(COMP_DUMMY()), 105 DAILINK_COMP_ARRAY(COMP_EMPTY())); 106 107 SND_SOC_DAILINK_DEFS(capture2, 108 DAILINK_COMP_ARRAY(COMP_CPU("UL2")), 109 DAILINK_COMP_ARRAY(COMP_DUMMY()), 110 DAILINK_COMP_ARRAY(COMP_EMPTY())); 111 112 SND_SOC_DAILINK_DEFS(capture3, 113 DAILINK_COMP_ARRAY(COMP_CPU("UL3")), 114 DAILINK_COMP_ARRAY(COMP_DUMMY()), 115 DAILINK_COMP_ARRAY(COMP_EMPTY())); 116 117 SND_SOC_DAILINK_DEFS(capture4, 118 DAILINK_COMP_ARRAY(COMP_CPU("UL4")), 119 DAILINK_COMP_ARRAY(COMP_DUMMY()), 120 DAILINK_COMP_ARRAY(COMP_EMPTY())); 121 122 SND_SOC_DAILINK_DEFS(capture5, 123 DAILINK_COMP_ARRAY(COMP_CPU("UL5")), 124 DAILINK_COMP_ARRAY(COMP_DUMMY()), 125 DAILINK_COMP_ARRAY(COMP_EMPTY())); 126 127 SND_SOC_DAILINK_DEFS(capture6, 128 DAILINK_COMP_ARRAY(COMP_CPU("UL6")), 129 DAILINK_COMP_ARRAY(COMP_DUMMY()), 130 DAILINK_COMP_ARRAY(COMP_EMPTY())); 131 132 SND_SOC_DAILINK_DEFS(capture8, 133 DAILINK_COMP_ARRAY(COMP_CPU("UL8")), 134 DAILINK_COMP_ARRAY(COMP_DUMMY()), 135 DAILINK_COMP_ARRAY(COMP_EMPTY())); 136 137 SND_SOC_DAILINK_DEFS(capture9, 138 DAILINK_COMP_ARRAY(COMP_CPU("UL9")), 139 DAILINK_COMP_ARRAY(COMP_DUMMY()), 140 DAILINK_COMP_ARRAY(COMP_EMPTY())); 141 142 SND_SOC_DAILINK_DEFS(capture10, 143 DAILINK_COMP_ARRAY(COMP_CPU("UL10")), 144 DAILINK_COMP_ARRAY(COMP_DUMMY()), 145 DAILINK_COMP_ARRAY(COMP_EMPTY())); 146 147 /* BE */ 148 SND_SOC_DAILINK_DEFS(dl_src, 149 DAILINK_COMP_ARRAY(COMP_CPU("DL_SRC")), 150 DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound", 151 "mt6359-snd-codec-aif1")), 152 DAILINK_COMP_ARRAY(COMP_EMPTY())); 153 154 SND_SOC_DAILINK_DEFS(DMIC_BE, 155 DAILINK_COMP_ARRAY(COMP_CPU("DMIC")), 156 DAILINK_COMP_ARRAY(COMP_DUMMY()), 157 DAILINK_COMP_ARRAY(COMP_EMPTY())); 158 159 SND_SOC_DAILINK_DEFS(dptx, 160 DAILINK_COMP_ARRAY(COMP_CPU("DPTX")), 161 DAILINK_COMP_ARRAY(COMP_DUMMY()), 162 DAILINK_COMP_ARRAY(COMP_EMPTY())); 163 164 SND_SOC_DAILINK_DEFS(etdm1_in, 165 DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_IN")), 166 DAILINK_COMP_ARRAY(COMP_DUMMY()), 167 DAILINK_COMP_ARRAY(COMP_EMPTY())); 168 169 SND_SOC_DAILINK_DEFS(etdm2_in, 170 DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_IN")), 171 DAILINK_COMP_ARRAY(COMP_DUMMY()), 172 DAILINK_COMP_ARRAY(COMP_EMPTY())); 173 174 SND_SOC_DAILINK_DEFS(etdm1_out, 175 DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_OUT")), 176 DAILINK_COMP_ARRAY(COMP_DUMMY()), 177 DAILINK_COMP_ARRAY(COMP_EMPTY())); 178 179 SND_SOC_DAILINK_DEFS(etdm2_out, 180 DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_OUT")), 181 DAILINK_COMP_ARRAY(COMP_DUMMY()), 182 DAILINK_COMP_ARRAY(COMP_EMPTY())); 183 184 SND_SOC_DAILINK_DEFS(etdm3_out, 185 DAILINK_COMP_ARRAY(COMP_CPU("ETDM3_OUT")), 186 DAILINK_COMP_ARRAY(COMP_DUMMY()), 187 DAILINK_COMP_ARRAY(COMP_EMPTY())); 188 189 SND_SOC_DAILINK_DEFS(pcm1, 190 DAILINK_COMP_ARRAY(COMP_CPU("PCM1")), 191 DAILINK_COMP_ARRAY(COMP_DUMMY()), 192 DAILINK_COMP_ARRAY(COMP_EMPTY())); 193 194 SND_SOC_DAILINK_DEFS(ul_src, 195 DAILINK_COMP_ARRAY(COMP_CPU("UL_SRC")), 196 DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound", 197 "mt6359-snd-codec-aif1")), 198 DAILINK_COMP_ARRAY(COMP_EMPTY())); 199 200 SND_SOC_DAILINK_DEFS(AFE_SOF_DL2, 201 DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")), 202 DAILINK_COMP_ARRAY(COMP_DUMMY()), 203 DAILINK_COMP_ARRAY(COMP_EMPTY())); 204 205 SND_SOC_DAILINK_DEFS(AFE_SOF_DL3, 206 DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL3")), 207 DAILINK_COMP_ARRAY(COMP_DUMMY()), 208 DAILINK_COMP_ARRAY(COMP_EMPTY())); 209 210 SND_SOC_DAILINK_DEFS(AFE_SOF_UL4, 211 DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL4")), 212 DAILINK_COMP_ARRAY(COMP_DUMMY()), 213 DAILINK_COMP_ARRAY(COMP_EMPTY())); 214 215 SND_SOC_DAILINK_DEFS(AFE_SOF_UL5, 216 DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL5")), 217 DAILINK_COMP_ARRAY(COMP_DUMMY()), 218 DAILINK_COMP_ARRAY(COMP_EMPTY())); 219 220 static const struct sof_conn_stream g_sof_conn_streams[] = { 221 { 222 .sof_link = "AFE_SOF_DL2", 223 .sof_dma = SOF_DMA_DL2, 224 .stream_dir = SNDRV_PCM_STREAM_PLAYBACK 225 }, 226 { 227 .sof_link = "AFE_SOF_DL3", 228 .sof_dma = SOF_DMA_DL3, 229 .stream_dir = SNDRV_PCM_STREAM_PLAYBACK 230 }, 231 { 232 .sof_link = "AFE_SOF_UL4", 233 .sof_dma = SOF_DMA_UL4, 234 .stream_dir = SNDRV_PCM_STREAM_CAPTURE 235 }, 236 { 237 .sof_link = "AFE_SOF_UL5", 238 .sof_dma = SOF_DMA_UL5, 239 .stream_dir = SNDRV_PCM_STREAM_CAPTURE 240 }, 241 }; 242 243 enum mt8188_jacks { 244 MT8188_JACK_HEADSET, 245 MT8188_JACK_DP, 246 MT8188_JACK_HDMI, 247 MT8188_JACK_MAX, 248 }; 249 250 static struct snd_soc_jack_pin mt8188_hdmi_jack_pins[] = { 251 { 252 .pin = "HDMI", 253 .mask = SND_JACK_AVOUT, 254 }, 255 }; 256 257 static struct snd_soc_jack_pin mt8188_dp_jack_pins[] = { 258 { 259 .pin = "DP", 260 .mask = SND_JACK_AVOUT, 261 }, 262 }; 263 264 static struct snd_soc_jack_pin nau8825_jack_pins[] = { 265 { 266 .pin = "Headphone Jack", 267 .mask = SND_JACK_HEADPHONE, 268 }, 269 { 270 .pin = "Headset Mic", 271 .mask = SND_JACK_MICROPHONE, 272 }, 273 }; 274 275 static struct snd_soc_jack_pin mt8188_headset_jack_pins[] = { 276 { 277 .pin = "Headphone", 278 .mask = SND_JACK_HEADPHONE, 279 }, 280 { 281 .pin = "Headset Mic", 282 .mask = SND_JACK_MICROPHONE, 283 }, 284 }; 285 286 static const struct snd_kcontrol_new mt8188_dumb_spk_controls[] = { 287 SOC_DAPM_PIN_SWITCH("Ext Spk"), 288 }; 289 290 static const struct snd_soc_dapm_widget mt8188_dumb_spk_widgets[] = { 291 SND_SOC_DAPM_SPK("Ext Spk", NULL), 292 }; 293 294 static const struct snd_kcontrol_new mt8188_dual_spk_controls[] = { 295 SOC_DAPM_PIN_SWITCH("Left Spk"), 296 SOC_DAPM_PIN_SWITCH("Right Spk"), 297 }; 298 299 static const struct snd_soc_dapm_widget mt8188_dual_spk_widgets[] = { 300 SND_SOC_DAPM_SPK("Left Spk", NULL), 301 SND_SOC_DAPM_SPK("Right Spk", NULL), 302 }; 303 304 static const struct snd_kcontrol_new mt8188_rear_spk_controls[] = { 305 SOC_DAPM_PIN_SWITCH("Rear Left Spk"), 306 SOC_DAPM_PIN_SWITCH("Rear Right Spk"), 307 }; 308 309 static const struct snd_soc_dapm_widget mt8188_rear_spk_widgets[] = { 310 SND_SOC_DAPM_SPK("Rear Left Spk", NULL), 311 SND_SOC_DAPM_SPK("Rear Right Spk", NULL), 312 }; 313 314 static const struct snd_soc_dapm_widget mt8188_mt6359_widgets[] = { 315 SND_SOC_DAPM_HP("Headphone", NULL), 316 SND_SOC_DAPM_MIC("Headset Mic", NULL), 317 SND_SOC_DAPM_MIC("AP DMIC", NULL), 318 SND_SOC_DAPM_SINK("HDMI"), 319 SND_SOC_DAPM_SINK("DP"), 320 SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0), 321 SND_SOC_DAPM_MIXER(SOF_DMA_DL3, SND_SOC_NOPM, 0, 0, NULL, 0), 322 SND_SOC_DAPM_MIXER(SOF_DMA_UL4, SND_SOC_NOPM, 0, 0, NULL, 0), 323 SND_SOC_DAPM_MIXER(SOF_DMA_UL5, SND_SOC_NOPM, 0, 0, NULL, 0), 324 325 /* dynamic pinctrl */ 326 SND_SOC_DAPM_PINCTRL("ETDM_SPK_PIN", "aud_etdm_spk_on", "aud_etdm_spk_off"), 327 SND_SOC_DAPM_PINCTRL("ETDM_HP_PIN", "aud_etdm_hp_on", "aud_etdm_hp_off"), 328 SND_SOC_DAPM_PINCTRL("MTKAIF_PIN", "aud_mtkaif_on", "aud_mtkaif_off"), 329 }; 330 331 static const struct snd_kcontrol_new mt8188_mt6359_controls[] = { 332 SOC_DAPM_PIN_SWITCH("Headphone"), 333 SOC_DAPM_PIN_SWITCH("Headset Mic"), 334 }; 335 336 static const struct snd_soc_dapm_widget mt8188_nau8825_widgets[] = { 337 SND_SOC_DAPM_HP("Headphone Jack", NULL), 338 }; 339 340 static const struct snd_kcontrol_new mt8188_nau8825_controls[] = { 341 SOC_DAPM_PIN_SWITCH("Headphone Jack"), 342 }; 343 344 static const struct snd_soc_dapm_route mt8188_mt6359_routes[] = { 345 /* SOF Uplink */ 346 {SOF_DMA_UL4, NULL, "O034"}, 347 {SOF_DMA_UL4, NULL, "O035"}, 348 {SOF_DMA_UL5, NULL, "O036"}, 349 {SOF_DMA_UL5, NULL, "O037"}, 350 /* SOF Downlink */ 351 {"I070", NULL, SOF_DMA_DL2}, 352 {"I071", NULL, SOF_DMA_DL2}, 353 {"I020", NULL, SOF_DMA_DL3}, 354 {"I021", NULL, SOF_DMA_DL3}, 355 }; 356 357 static int mt8188_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd) 358 { 359 struct snd_soc_component *cmpnt_afe = 360 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); 361 struct snd_soc_component *cmpnt_codec = 362 snd_soc_rtd_to_codec(rtd, 0)->component; 363 struct snd_soc_dapm_widget *pin_w = NULL, *w; 364 struct mtk_base_afe *afe; 365 struct mt8188_afe_private *afe_priv; 366 struct mtkaif_param *param; 367 int chosen_phase_1, chosen_phase_2; 368 int prev_cycle_1, prev_cycle_2; 369 u8 test_done_1, test_done_2; 370 int cycle_1, cycle_2; 371 int mtkaif_chosen_phase[MT8188_MTKAIF_MISO_NUM]; 372 int mtkaif_phase_cycle[MT8188_MTKAIF_MISO_NUM]; 373 int mtkaif_calibration_num_phase; 374 bool mtkaif_calibration_ok; 375 u32 monitor = 0; 376 int counter; 377 int phase; 378 int i; 379 380 if (!cmpnt_afe) 381 return -EINVAL; 382 383 afe = snd_soc_component_get_drvdata(cmpnt_afe); 384 afe_priv = afe->platform_priv; 385 param = &afe_priv->mtkaif_params; 386 387 dev_dbg(afe->dev, "%s(), start\n", __func__); 388 389 param->mtkaif_calibration_ok = false; 390 for (i = 0; i < MT8188_MTKAIF_MISO_NUM; i++) { 391 param->mtkaif_chosen_phase[i] = -1; 392 param->mtkaif_phase_cycle[i] = 0; 393 mtkaif_chosen_phase[i] = -1; 394 mtkaif_phase_cycle[i] = 0; 395 } 396 397 if (IS_ERR(afe_priv->topckgen)) { 398 dev_info(afe->dev, "%s() Cannot find topckgen controller\n", 399 __func__); 400 return 0; 401 } 402 403 for_each_card_widgets(rtd->card, w) { 404 if (!strcmp(w->name, "MTKAIF_PIN")) { 405 pin_w = w; 406 break; 407 } 408 } 409 410 if (pin_w) 411 snd_soc_dapm_pinctrl_event(pin_w, NULL, SND_SOC_DAPM_PRE_PMU); 412 else 413 dev_dbg(afe->dev, "%s(), no pinmux widget, please check if default on\n", __func__); 414 415 pm_runtime_get_sync(afe->dev); 416 mt6359_mtkaif_calibration_enable(cmpnt_codec); 417 418 /* set test type to synchronizer pulse */ 419 regmap_write(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_TYPE); 420 mtkaif_calibration_num_phase = 42; /* mt6359: 0 ~ 42 */ 421 mtkaif_calibration_ok = true; 422 423 for (phase = 0; 424 phase <= mtkaif_calibration_num_phase && mtkaif_calibration_ok; 425 phase++) { 426 mt6359_set_mtkaif_calibration_phase(cmpnt_codec, 427 phase, phase, phase); 428 429 regmap_set_bits(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_ON); 430 431 test_done_1 = 0; 432 test_done_2 = 0; 433 434 cycle_1 = -1; 435 cycle_2 = -1; 436 437 counter = 0; 438 while (!(test_done_1 & test_done_2)) { 439 regmap_read(afe_priv->topckgen, 440 CKSYS_AUD_TOP_MON, &monitor); 441 test_done_1 = FIELD_GET(TEST_MISO_DONE_1, monitor); 442 test_done_2 = FIELD_GET(TEST_MISO_DONE_2, monitor); 443 444 if (test_done_1 == 1) 445 cycle_1 = FIELD_GET(TEST_MISO_COUNT_1, monitor); 446 447 if (test_done_2 == 1) 448 cycle_2 = FIELD_GET(TEST_MISO_COUNT_2, monitor); 449 450 /* handle if never test done */ 451 if (++counter > 10000) { 452 dev_err(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, monitor 0x%x\n", 453 __func__, cycle_1, cycle_2, monitor); 454 mtkaif_calibration_ok = false; 455 break; 456 } 457 } 458 459 if (phase == 0) { 460 prev_cycle_1 = cycle_1; 461 prev_cycle_2 = cycle_2; 462 } 463 464 if (cycle_1 != prev_cycle_1 && 465 mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] < 0) { 466 mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] = phase - 1; 467 mtkaif_phase_cycle[MT8188_MTKAIF_MISO_0] = prev_cycle_1; 468 } 469 470 if (cycle_2 != prev_cycle_2 && 471 mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] < 0) { 472 mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] = phase - 1; 473 mtkaif_phase_cycle[MT8188_MTKAIF_MISO_1] = prev_cycle_2; 474 } 475 476 regmap_clear_bits(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_ON); 477 478 if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] >= 0 && 479 mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] >= 0) 480 break; 481 } 482 483 if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] < 0) { 484 mtkaif_calibration_ok = false; 485 chosen_phase_1 = 0; 486 } else { 487 chosen_phase_1 = mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0]; 488 } 489 490 if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] < 0) { 491 mtkaif_calibration_ok = false; 492 chosen_phase_2 = 0; 493 } else { 494 chosen_phase_2 = mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1]; 495 } 496 497 mt6359_set_mtkaif_calibration_phase(cmpnt_codec, 498 chosen_phase_1, 499 chosen_phase_2, 500 0); 501 502 mt6359_mtkaif_calibration_disable(cmpnt_codec); 503 pm_runtime_put(afe->dev); 504 505 param->mtkaif_calibration_ok = mtkaif_calibration_ok; 506 param->mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] = chosen_phase_1; 507 param->mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] = chosen_phase_2; 508 509 for (i = 0; i < MT8188_MTKAIF_MISO_NUM; i++) 510 param->mtkaif_phase_cycle[i] = mtkaif_phase_cycle[i]; 511 512 if (pin_w) 513 snd_soc_dapm_pinctrl_event(pin_w, NULL, SND_SOC_DAPM_POST_PMD); 514 515 dev_dbg(afe->dev, "%s(), end, calibration ok %d\n", 516 __func__, param->mtkaif_calibration_ok); 517 518 return 0; 519 } 520 521 static int mt8188_mt6359_accdet_init(struct snd_soc_pcm_runtime *rtd) 522 { 523 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card); 524 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_HEADSET]; 525 int ret; 526 527 if (!soc_card_data->accdet) 528 return 0; 529 530 ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack", 531 SND_JACK_HEADSET | SND_JACK_BTN_0 | 532 SND_JACK_BTN_1 | SND_JACK_BTN_2 | 533 SND_JACK_BTN_3, 534 jack, mt8188_headset_jack_pins, 535 ARRAY_SIZE(mt8188_headset_jack_pins)); 536 if (ret) { 537 dev_err(rtd->dev, "Headset Jack create failed: %d\n", ret); 538 return ret; 539 } 540 541 ret = mt6359_accdet_enable_jack_detect(soc_card_data->accdet, jack); 542 if (ret) { 543 dev_err(rtd->dev, "Headset Jack enable failed: %d\n", ret); 544 return ret; 545 } 546 547 return 0; 548 } 549 550 static int mt8188_mt6359_init(struct snd_soc_pcm_runtime *rtd) 551 { 552 struct snd_soc_component *cmpnt_codec = 553 snd_soc_rtd_to_codec(rtd, 0)->component; 554 555 /* set mtkaif protocol */ 556 mt6359_set_mtkaif_protocol(cmpnt_codec, 557 MT6359_MTKAIF_PROTOCOL_2_CLK_P2); 558 559 /* mtkaif calibration */ 560 mt8188_mt6359_mtkaif_calibration(rtd); 561 562 mt8188_mt6359_accdet_init(rtd); 563 564 return 0; 565 } 566 567 enum { 568 DAI_LINK_DL2_FE, 569 DAI_LINK_DL3_FE, 570 DAI_LINK_DL6_FE, 571 DAI_LINK_DL7_FE, 572 DAI_LINK_DL8_FE, 573 DAI_LINK_DL10_FE, 574 DAI_LINK_DL11_FE, 575 DAI_LINK_UL1_FE, 576 DAI_LINK_UL2_FE, 577 DAI_LINK_UL3_FE, 578 DAI_LINK_UL4_FE, 579 DAI_LINK_UL5_FE, 580 DAI_LINK_UL6_FE, 581 DAI_LINK_UL8_FE, 582 DAI_LINK_UL9_FE, 583 DAI_LINK_UL10_FE, 584 DAI_LINK_DL_SRC_BE, 585 DAI_LINK_DMIC_BE, 586 DAI_LINK_DPTX_BE, 587 DAI_LINK_ETDM1_IN_BE, 588 DAI_LINK_ETDM2_IN_BE, 589 DAI_LINK_ETDM1_OUT_BE, 590 DAI_LINK_ETDM2_OUT_BE, 591 DAI_LINK_ETDM3_OUT_BE, 592 DAI_LINK_PCM1_BE, 593 DAI_LINK_UL_SRC_BE, 594 DAI_LINK_REGULAR_LAST = DAI_LINK_UL_SRC_BE, 595 DAI_LINK_SOF_START, 596 DAI_LINK_SOF_DL2_BE = DAI_LINK_SOF_START, 597 DAI_LINK_SOF_DL3_BE, 598 DAI_LINK_SOF_UL4_BE, 599 DAI_LINK_SOF_UL5_BE, 600 DAI_LINK_SOF_END = DAI_LINK_SOF_UL5_BE, 601 }; 602 603 #define DAI_LINK_REGULAR_NUM (DAI_LINK_REGULAR_LAST + 1) 604 605 static int mt8188_dptx_hw_params(struct snd_pcm_substream *substream, 606 struct snd_pcm_hw_params *params) 607 { 608 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 609 unsigned int rate = params_rate(params); 610 unsigned int mclk_fs_ratio = 256; 611 unsigned int mclk_fs = rate * mclk_fs_ratio; 612 struct snd_soc_dai *dai = snd_soc_rtd_to_cpu(rtd, 0); 613 614 return snd_soc_dai_set_sysclk(dai, 0, mclk_fs, SND_SOC_CLOCK_OUT); 615 } 616 617 static const struct snd_soc_ops mt8188_dptx_ops = { 618 .hw_params = mt8188_dptx_hw_params, 619 }; 620 621 static int mt8188_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, 622 struct snd_pcm_hw_params *params) 623 { 624 /* fix BE i2s format to 32bit, clean param mask first */ 625 snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT), 626 0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST); 627 628 params_set_format(params, SNDRV_PCM_FORMAT_S32_LE); 629 630 return 0; 631 } 632 633 static int mt8188_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd) 634 { 635 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card); 636 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_HDMI]; 637 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component; 638 int ret = 0; 639 640 ret = snd_soc_card_jack_new_pins(rtd->card, "HDMI Jack", 641 SND_JACK_AVOUT, jack, 642 mt8188_hdmi_jack_pins, 643 ARRAY_SIZE(mt8188_hdmi_jack_pins)); 644 if (ret) { 645 dev_err(rtd->dev, "%s, new jack failed: %d\n", __func__, ret); 646 return ret; 647 } 648 649 ret = snd_soc_component_set_jack(component, jack, NULL); 650 if (ret) { 651 dev_err(rtd->dev, "%s, set jack failed on %s (ret=%d)\n", 652 __func__, component->name, ret); 653 return ret; 654 } 655 656 return 0; 657 } 658 659 static int mt8188_dptx_codec_init(struct snd_soc_pcm_runtime *rtd) 660 { 661 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card); 662 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_DP]; 663 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component; 664 int ret = 0; 665 666 ret = snd_soc_card_jack_new_pins(rtd->card, "DP Jack", SND_JACK_AVOUT, 667 jack, mt8188_dp_jack_pins, 668 ARRAY_SIZE(mt8188_dp_jack_pins)); 669 if (ret) { 670 dev_err(rtd->dev, "%s, new jack failed: %d\n", __func__, ret); 671 return ret; 672 } 673 674 ret = snd_soc_component_set_jack(component, jack, NULL); 675 if (ret) { 676 dev_err(rtd->dev, "%s, set jack failed on %s (ret=%d)\n", 677 __func__, component->name, ret); 678 return ret; 679 } 680 681 return 0; 682 } 683 684 static int mt8188_dumb_amp_init(struct snd_soc_pcm_runtime *rtd) 685 { 686 struct snd_soc_card *card = rtd->card; 687 int ret = 0; 688 689 ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_dumb_spk_widgets, 690 ARRAY_SIZE(mt8188_dumb_spk_widgets)); 691 if (ret) { 692 dev_err(rtd->dev, "unable to add Dumb Speaker dapm, ret %d\n", ret); 693 return ret; 694 } 695 696 ret = snd_soc_add_card_controls(card, mt8188_dumb_spk_controls, 697 ARRAY_SIZE(mt8188_dumb_spk_controls)); 698 if (ret) { 699 dev_err(rtd->dev, "unable to add Dumb card controls, ret %d\n", ret); 700 return ret; 701 } 702 703 return 0; 704 } 705 706 static int mt8188_max98390_hw_params(struct snd_pcm_substream *substream, 707 struct snd_pcm_hw_params *params) 708 { 709 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 710 unsigned int bit_width = params_width(params); 711 struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); 712 struct snd_soc_dai *codec_dai; 713 int i; 714 715 snd_soc_dai_set_tdm_slot(cpu_dai, 0xf, 0xf, 4, bit_width); 716 717 for_each_rtd_codec_dais(rtd, i, codec_dai) { 718 if (!strcmp(codec_dai->component->name, MAX98390_DEV0_NAME)) 719 snd_soc_dai_set_tdm_slot(codec_dai, 0x8, 0x3, 4, bit_width); 720 721 if (!strcmp(codec_dai->component->name, MAX98390_DEV1_NAME)) 722 snd_soc_dai_set_tdm_slot(codec_dai, 0x4, 0x3, 4, bit_width); 723 724 if (!strcmp(codec_dai->component->name, MAX98390_DEV2_NAME)) 725 snd_soc_dai_set_tdm_slot(codec_dai, 0x2, 0x3, 4, bit_width); 726 727 if (!strcmp(codec_dai->component->name, MAX98390_DEV3_NAME)) 728 snd_soc_dai_set_tdm_slot(codec_dai, 0x1, 0x3, 4, bit_width); 729 } 730 return 0; 731 } 732 733 static const struct snd_soc_ops mt8188_max98390_ops = { 734 .hw_params = mt8188_max98390_hw_params, 735 }; 736 737 static int mt8188_max98390_codec_init(struct snd_soc_pcm_runtime *rtd) 738 { 739 struct snd_soc_card *card = rtd->card; 740 int ret; 741 742 /* add regular speakers dapm route */ 743 ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_dual_spk_widgets, 744 ARRAY_SIZE(mt8188_dual_spk_widgets)); 745 if (ret) { 746 dev_err(rtd->dev, "unable to add Left/Right Speaker widget, ret %d\n", ret); 747 return ret; 748 } 749 750 ret = snd_soc_add_card_controls(card, mt8188_dual_spk_controls, 751 ARRAY_SIZE(mt8188_dual_spk_controls)); 752 if (ret) { 753 dev_err(rtd->dev, "unable to add Left/Right card controls, ret %d\n", ret); 754 return ret; 755 } 756 757 if (rtd->dai_link->num_codecs <= 2) 758 return 0; 759 760 /* add widgets/controls/dapm for rear speakers */ 761 ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_rear_spk_widgets, 762 ARRAY_SIZE(mt8188_rear_spk_widgets)); 763 if (ret) { 764 dev_err(rtd->dev, "unable to add Rear Speaker widget, ret %d\n", ret); 765 /* Don't need to add routes if widget addition failed */ 766 return ret; 767 } 768 769 ret = snd_soc_add_card_controls(card, mt8188_rear_spk_controls, 770 ARRAY_SIZE(mt8188_rear_spk_controls)); 771 if (ret) { 772 dev_err(rtd->dev, "unable to add Rear card controls, ret %d\n", ret); 773 return ret; 774 } 775 776 return 0; 777 } 778 779 static int mt8188_headset_codec_init(struct snd_soc_pcm_runtime *rtd) 780 { 781 struct snd_soc_card *card = rtd->card; 782 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card); 783 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_HEADSET]; 784 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component; 785 struct mtk_platform_card_data *card_data = soc_card_data->card_data; 786 int ret; 787 788 ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_nau8825_widgets, 789 ARRAY_SIZE(mt8188_nau8825_widgets)); 790 if (ret) { 791 dev_err(rtd->dev, "unable to add nau8825 card widget, ret %d\n", ret); 792 return ret; 793 } 794 795 ret = snd_soc_add_card_controls(card, mt8188_nau8825_controls, 796 ARRAY_SIZE(mt8188_nau8825_controls)); 797 if (ret) { 798 dev_err(rtd->dev, "unable to add nau8825 card controls, ret %d\n", ret); 799 return ret; 800 } 801 802 ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack", 803 SND_JACK_HEADSET | SND_JACK_BTN_0 | 804 SND_JACK_BTN_1 | SND_JACK_BTN_2 | 805 SND_JACK_BTN_3, 806 jack, 807 nau8825_jack_pins, 808 ARRAY_SIZE(nau8825_jack_pins)); 809 if (ret) { 810 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret); 811 return ret; 812 } 813 814 if (card_data->flags & ES8326_HS_PRESENT) { 815 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); 816 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOLUMEUP); 817 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEDOWN); 818 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOICECOMMAND); 819 } else { 820 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); 821 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND); 822 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP); 823 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN); 824 } 825 826 ret = snd_soc_component_set_jack(component, jack, NULL); 827 828 if (ret) { 829 dev_err(rtd->dev, "Headset Jack call-back failed: %d\n", ret); 830 return ret; 831 } 832 833 return 0; 834 }; 835 836 static void mt8188_headset_codec_exit(struct snd_soc_pcm_runtime *rtd) 837 { 838 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component; 839 840 snd_soc_component_set_jack(component, NULL, NULL); 841 } 842 843 844 static int mt8188_nau8825_hw_params(struct snd_pcm_substream *substream, 845 struct snd_pcm_hw_params *params) 846 { 847 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 848 struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0); 849 unsigned int rate = params_rate(params); 850 unsigned int bit_width = params_width(params); 851 int clk_freq, ret; 852 853 clk_freq = rate * 2 * bit_width; 854 855 /* Configure clock for codec */ 856 ret = snd_soc_dai_set_sysclk(codec_dai, NAU8825_CLK_FLL_BLK, 0, 857 SND_SOC_CLOCK_IN); 858 if (ret < 0) { 859 dev_err(codec_dai->dev, "can't set BCLK clock %d\n", ret); 860 return ret; 861 } 862 863 /* Configure pll for codec */ 864 ret = snd_soc_dai_set_pll(codec_dai, 0, 0, clk_freq, 865 params_rate(params) * 256); 866 if (ret < 0) { 867 dev_err(codec_dai->dev, "can't set BCLK: %d\n", ret); 868 return ret; 869 } 870 871 return 0; 872 } 873 874 static const struct snd_soc_ops mt8188_nau8825_ops = { 875 .hw_params = mt8188_nau8825_hw_params, 876 }; 877 878 static int mt8188_rt5682s_i2s_hw_params(struct snd_pcm_substream *substream, 879 struct snd_pcm_hw_params *params) 880 { 881 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 882 struct snd_soc_card *card = rtd->card; 883 struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); 884 struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0); 885 unsigned int rate = params_rate(params); 886 int bitwidth; 887 int ret; 888 889 bitwidth = snd_pcm_format_width(params_format(params)); 890 if (bitwidth < 0) { 891 dev_err(card->dev, "invalid bit width: %d\n", bitwidth); 892 return bitwidth; 893 } 894 895 ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth); 896 if (ret) { 897 dev_err(card->dev, "failed to set tdm slot\n"); 898 return ret; 899 } 900 901 ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1, RT5682_PLL1_S_BCLK1, 902 rate * 32, rate * 512); 903 if (ret) { 904 dev_err(card->dev, "failed to set pll\n"); 905 return ret; 906 } 907 908 ret = snd_soc_dai_set_sysclk(codec_dai, RT5682_SCLK_S_PLL1, 909 rate * 512, SND_SOC_CLOCK_IN); 910 if (ret) { 911 dev_err(card->dev, "failed to set sysclk\n"); 912 return ret; 913 } 914 915 return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 128, 916 SND_SOC_CLOCK_OUT); 917 } 918 919 static const struct snd_soc_ops mt8188_rt5682s_i2s_ops = { 920 .hw_params = mt8188_rt5682s_i2s_hw_params, 921 }; 922 923 static int mt8188_sof_be_hw_params(struct snd_pcm_substream *substream, 924 struct snd_pcm_hw_params *params) 925 { 926 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 927 struct snd_soc_component *cmpnt_afe = NULL; 928 struct snd_soc_pcm_runtime *runtime; 929 930 /* find afe component */ 931 for_each_card_rtds(rtd->card, runtime) { 932 cmpnt_afe = snd_soc_rtdcom_lookup(runtime, AFE_PCM_NAME); 933 if (cmpnt_afe) 934 break; 935 } 936 937 if (cmpnt_afe && !pm_runtime_active(cmpnt_afe->dev)) { 938 dev_err(rtd->dev, "afe pm runtime is not active!!\n"); 939 return -EINVAL; 940 } 941 942 return 0; 943 } 944 945 static const struct snd_soc_ops mt8188_sof_be_ops = { 946 .hw_params = mt8188_sof_be_hw_params, 947 }; 948 949 static int mt8188_es8326_hw_params(struct snd_pcm_substream *substream, 950 struct snd_pcm_hw_params *params) 951 { 952 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 953 struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); 954 struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0); 955 unsigned int rate = params_rate(params); 956 int ret; 957 958 /* Configure MCLK for codec */ 959 ret = snd_soc_dai_set_sysclk(codec_dai, 0, rate * 256, SND_SOC_CLOCK_IN); 960 if (ret < 0) { 961 dev_err(codec_dai->dev, "can't set MCLK %d\n", ret); 962 return ret; 963 } 964 965 /* Configure MCLK for cpu */ 966 return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 256, SND_SOC_CLOCK_OUT); 967 } 968 969 static const struct snd_soc_ops mt8188_es8326_ops = { 970 .hw_params = mt8188_es8326_hw_params, 971 }; 972 973 static struct snd_soc_dai_link mt8188_mt6359_dai_links[] = { 974 /* FE */ 975 [DAI_LINK_DL2_FE] = { 976 .name = "DL2_FE", 977 .stream_name = "DL2 Playback", 978 .trigger = { 979 SND_SOC_DPCM_TRIGGER_POST, 980 SND_SOC_DPCM_TRIGGER_POST, 981 }, 982 .dynamic = 1, 983 .playback_only = 1, 984 .dpcm_merged_chan = 1, 985 .dpcm_merged_rate = 1, 986 .dpcm_merged_format = 1, 987 SND_SOC_DAILINK_REG(playback2), 988 }, 989 [DAI_LINK_DL3_FE] = { 990 .name = "DL3_FE", 991 .stream_name = "DL3 Playback", 992 .trigger = { 993 SND_SOC_DPCM_TRIGGER_POST, 994 SND_SOC_DPCM_TRIGGER_POST, 995 }, 996 .dynamic = 1, 997 .playback_only = 1, 998 .dpcm_merged_chan = 1, 999 .dpcm_merged_rate = 1, 1000 .dpcm_merged_format = 1, 1001 SND_SOC_DAILINK_REG(playback3), 1002 }, 1003 [DAI_LINK_DL6_FE] = { 1004 .name = "DL6_FE", 1005 .stream_name = "DL6 Playback", 1006 .trigger = { 1007 SND_SOC_DPCM_TRIGGER_POST, 1008 SND_SOC_DPCM_TRIGGER_POST, 1009 }, 1010 .dynamic = 1, 1011 .playback_only = 1, 1012 .dpcm_merged_chan = 1, 1013 .dpcm_merged_rate = 1, 1014 .dpcm_merged_format = 1, 1015 SND_SOC_DAILINK_REG(playback6), 1016 }, 1017 [DAI_LINK_DL7_FE] = { 1018 .name = "DL7_FE", 1019 .stream_name = "DL7 Playback", 1020 .trigger = { 1021 SND_SOC_DPCM_TRIGGER_PRE, 1022 SND_SOC_DPCM_TRIGGER_PRE, 1023 }, 1024 .dynamic = 1, 1025 .playback_only = 1, 1026 SND_SOC_DAILINK_REG(playback7), 1027 }, 1028 [DAI_LINK_DL8_FE] = { 1029 .name = "DL8_FE", 1030 .stream_name = "DL8 Playback", 1031 .trigger = { 1032 SND_SOC_DPCM_TRIGGER_POST, 1033 SND_SOC_DPCM_TRIGGER_POST, 1034 }, 1035 .dynamic = 1, 1036 .playback_only = 1, 1037 SND_SOC_DAILINK_REG(playback8), 1038 }, 1039 [DAI_LINK_DL10_FE] = { 1040 .name = "DL10_FE", 1041 .stream_name = "DL10 Playback", 1042 .trigger = { 1043 SND_SOC_DPCM_TRIGGER_POST, 1044 SND_SOC_DPCM_TRIGGER_POST, 1045 }, 1046 .dynamic = 1, 1047 .playback_only = 1, 1048 SND_SOC_DAILINK_REG(playback10), 1049 }, 1050 [DAI_LINK_DL11_FE] = { 1051 .name = "DL11_FE", 1052 .stream_name = "DL11 Playback", 1053 .trigger = { 1054 SND_SOC_DPCM_TRIGGER_POST, 1055 SND_SOC_DPCM_TRIGGER_POST, 1056 }, 1057 .dynamic = 1, 1058 .playback_only = 1, 1059 SND_SOC_DAILINK_REG(playback11), 1060 }, 1061 [DAI_LINK_UL1_FE] = { 1062 .name = "UL1_FE", 1063 .stream_name = "UL1 Capture", 1064 .trigger = { 1065 SND_SOC_DPCM_TRIGGER_PRE, 1066 SND_SOC_DPCM_TRIGGER_PRE, 1067 }, 1068 .dynamic = 1, 1069 .capture_only = 1, 1070 SND_SOC_DAILINK_REG(capture1), 1071 }, 1072 [DAI_LINK_UL2_FE] = { 1073 .name = "UL2_FE", 1074 .stream_name = "UL2 Capture", 1075 .trigger = { 1076 SND_SOC_DPCM_TRIGGER_POST, 1077 SND_SOC_DPCM_TRIGGER_POST, 1078 }, 1079 .dynamic = 1, 1080 .capture_only = 1, 1081 SND_SOC_DAILINK_REG(capture2), 1082 }, 1083 [DAI_LINK_UL3_FE] = { 1084 .name = "UL3_FE", 1085 .stream_name = "UL3 Capture", 1086 .trigger = { 1087 SND_SOC_DPCM_TRIGGER_POST, 1088 SND_SOC_DPCM_TRIGGER_POST, 1089 }, 1090 .dynamic = 1, 1091 .capture_only = 1, 1092 SND_SOC_DAILINK_REG(capture3), 1093 }, 1094 [DAI_LINK_UL4_FE] = { 1095 .name = "UL4_FE", 1096 .stream_name = "UL4 Capture", 1097 .trigger = { 1098 SND_SOC_DPCM_TRIGGER_POST, 1099 SND_SOC_DPCM_TRIGGER_POST, 1100 }, 1101 .dynamic = 1, 1102 .capture_only = 1, 1103 .dpcm_merged_chan = 1, 1104 .dpcm_merged_rate = 1, 1105 .dpcm_merged_format = 1, 1106 SND_SOC_DAILINK_REG(capture4), 1107 }, 1108 [DAI_LINK_UL5_FE] = { 1109 .name = "UL5_FE", 1110 .stream_name = "UL5 Capture", 1111 .trigger = { 1112 SND_SOC_DPCM_TRIGGER_POST, 1113 SND_SOC_DPCM_TRIGGER_POST, 1114 }, 1115 .dynamic = 1, 1116 .capture_only = 1, 1117 .dpcm_merged_chan = 1, 1118 .dpcm_merged_rate = 1, 1119 .dpcm_merged_format = 1, 1120 SND_SOC_DAILINK_REG(capture5), 1121 }, 1122 [DAI_LINK_UL6_FE] = { 1123 .name = "UL6_FE", 1124 .stream_name = "UL6 Capture", 1125 .trigger = { 1126 SND_SOC_DPCM_TRIGGER_PRE, 1127 SND_SOC_DPCM_TRIGGER_PRE, 1128 }, 1129 .dynamic = 1, 1130 .capture_only = 1, 1131 SND_SOC_DAILINK_REG(capture6), 1132 }, 1133 [DAI_LINK_UL8_FE] = { 1134 .name = "UL8_FE", 1135 .stream_name = "UL8 Capture", 1136 .trigger = { 1137 SND_SOC_DPCM_TRIGGER_POST, 1138 SND_SOC_DPCM_TRIGGER_POST, 1139 }, 1140 .dynamic = 1, 1141 .capture_only = 1, 1142 SND_SOC_DAILINK_REG(capture8), 1143 }, 1144 [DAI_LINK_UL9_FE] = { 1145 .name = "UL9_FE", 1146 .stream_name = "UL9 Capture", 1147 .trigger = { 1148 SND_SOC_DPCM_TRIGGER_POST, 1149 SND_SOC_DPCM_TRIGGER_POST, 1150 }, 1151 .dynamic = 1, 1152 .capture_only = 1, 1153 SND_SOC_DAILINK_REG(capture9), 1154 }, 1155 [DAI_LINK_UL10_FE] = { 1156 .name = "UL10_FE", 1157 .stream_name = "UL10 Capture", 1158 .trigger = { 1159 SND_SOC_DPCM_TRIGGER_POST, 1160 SND_SOC_DPCM_TRIGGER_POST, 1161 }, 1162 .dynamic = 1, 1163 .capture_only = 1, 1164 SND_SOC_DAILINK_REG(capture10), 1165 }, 1166 /* BE */ 1167 [DAI_LINK_DL_SRC_BE] = { 1168 .name = "DL_SRC_BE", 1169 .no_pcm = 1, 1170 .playback_only = 1, 1171 SND_SOC_DAILINK_REG(dl_src), 1172 }, 1173 [DAI_LINK_DMIC_BE] = { 1174 .name = "DMIC_BE", 1175 .no_pcm = 1, 1176 .capture_only = 1, 1177 .ignore_suspend = 1, 1178 SND_SOC_DAILINK_REG(DMIC_BE), 1179 }, 1180 [DAI_LINK_DPTX_BE] = { 1181 .name = "DPTX_BE", 1182 .ops = &mt8188_dptx_ops, 1183 .be_hw_params_fixup = mt8188_dptx_hw_params_fixup, 1184 .no_pcm = 1, 1185 .playback_only = 1, 1186 SND_SOC_DAILINK_REG(dptx), 1187 }, 1188 [DAI_LINK_ETDM1_IN_BE] = { 1189 .name = "ETDM1_IN_BE", 1190 .no_pcm = 1, 1191 .dai_fmt = SND_SOC_DAIFMT_I2S | 1192 SND_SOC_DAIFMT_NB_NF | 1193 SND_SOC_DAIFMT_CBP_CFP, 1194 .capture_only = 1, 1195 .ignore_suspend = 1, 1196 SND_SOC_DAILINK_REG(etdm1_in), 1197 }, 1198 [DAI_LINK_ETDM2_IN_BE] = { 1199 .name = "ETDM2_IN_BE", 1200 .no_pcm = 1, 1201 .dai_fmt = SND_SOC_DAIFMT_I2S | 1202 SND_SOC_DAIFMT_NB_NF | 1203 SND_SOC_DAIFMT_CBP_CFP, 1204 .capture_only = 1, 1205 SND_SOC_DAILINK_REG(etdm2_in), 1206 }, 1207 [DAI_LINK_ETDM1_OUT_BE] = { 1208 .name = "ETDM1_OUT_BE", 1209 .no_pcm = 1, 1210 .dai_fmt = SND_SOC_DAIFMT_I2S | 1211 SND_SOC_DAIFMT_NB_NF | 1212 SND_SOC_DAIFMT_CBC_CFC, 1213 .playback_only = 1, 1214 SND_SOC_DAILINK_REG(etdm1_out), 1215 }, 1216 [DAI_LINK_ETDM2_OUT_BE] = { 1217 .name = "ETDM2_OUT_BE", 1218 .no_pcm = 1, 1219 .dai_fmt = SND_SOC_DAIFMT_I2S | 1220 SND_SOC_DAIFMT_NB_NF | 1221 SND_SOC_DAIFMT_CBC_CFC, 1222 .playback_only = 1, 1223 SND_SOC_DAILINK_REG(etdm2_out), 1224 }, 1225 [DAI_LINK_ETDM3_OUT_BE] = { 1226 .name = "ETDM3_OUT_BE", 1227 .no_pcm = 1, 1228 .dai_fmt = SND_SOC_DAIFMT_I2S | 1229 SND_SOC_DAIFMT_NB_NF | 1230 SND_SOC_DAIFMT_CBC_CFC, 1231 .playback_only = 1, 1232 SND_SOC_DAILINK_REG(etdm3_out), 1233 }, 1234 [DAI_LINK_PCM1_BE] = { 1235 .name = "PCM1_BE", 1236 .no_pcm = 1, 1237 .dai_fmt = SND_SOC_DAIFMT_I2S | 1238 SND_SOC_DAIFMT_NB_NF | 1239 SND_SOC_DAIFMT_CBC_CFC, 1240 SND_SOC_DAILINK_REG(pcm1), 1241 }, 1242 [DAI_LINK_UL_SRC_BE] = { 1243 .name = "UL_SRC_BE", 1244 .no_pcm = 1, 1245 .capture_only = 1, 1246 SND_SOC_DAILINK_REG(ul_src), 1247 }, 1248 1249 /* SOF BE */ 1250 [DAI_LINK_SOF_DL2_BE] = { 1251 .name = "AFE_SOF_DL2", 1252 .no_pcm = 1, 1253 .playback_only = 1, 1254 .ops = &mt8188_sof_be_ops, 1255 SND_SOC_DAILINK_REG(AFE_SOF_DL2), 1256 }, 1257 [DAI_LINK_SOF_DL3_BE] = { 1258 .name = "AFE_SOF_DL3", 1259 .no_pcm = 1, 1260 .playback_only = 1, 1261 .ops = &mt8188_sof_be_ops, 1262 SND_SOC_DAILINK_REG(AFE_SOF_DL3), 1263 }, 1264 [DAI_LINK_SOF_UL4_BE] = { 1265 .name = "AFE_SOF_UL4", 1266 .no_pcm = 1, 1267 .capture_only = 1, 1268 .ops = &mt8188_sof_be_ops, 1269 SND_SOC_DAILINK_REG(AFE_SOF_UL4), 1270 }, 1271 [DAI_LINK_SOF_UL5_BE] = { 1272 .name = "AFE_SOF_UL5", 1273 .no_pcm = 1, 1274 .capture_only = 1, 1275 .ops = &mt8188_sof_be_ops, 1276 SND_SOC_DAILINK_REG(AFE_SOF_UL5), 1277 }, 1278 }; 1279 1280 static void mt8188_fixup_controls(struct snd_soc_card *card) 1281 { 1282 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card); 1283 struct mtk_platform_card_data *card_data = soc_card_data->card_data; 1284 struct snd_kcontrol *kctl; 1285 1286 if (card_data->flags & (NAU8825_HS_PRESENT | RT5682S_HS_PRESENT | ES8326_HS_PRESENT)) { 1287 struct snd_soc_dapm_widget *w, *next_w; 1288 1289 for_each_card_widgets_safe(card, w, next_w) { 1290 if (strcmp(w->name, "Headphone")) 1291 continue; 1292 1293 snd_soc_dapm_free_widget(w); 1294 } 1295 1296 kctl = snd_ctl_find_id_mixer(card->snd_card, "Headphone Switch"); 1297 if (kctl) 1298 snd_ctl_remove(card->snd_card, kctl); 1299 else 1300 dev_warn(card->dev, "Cannot find ctl : Headphone Switch\n"); 1301 } 1302 } 1303 1304 static struct snd_soc_card mt8188_mt6359_soc_card = { 1305 .owner = THIS_MODULE, 1306 .dai_link = mt8188_mt6359_dai_links, 1307 .num_links = ARRAY_SIZE(mt8188_mt6359_dai_links), 1308 .dapm_widgets = mt8188_mt6359_widgets, 1309 .num_dapm_widgets = ARRAY_SIZE(mt8188_mt6359_widgets), 1310 .dapm_routes = mt8188_mt6359_routes, 1311 .num_dapm_routes = ARRAY_SIZE(mt8188_mt6359_routes), 1312 .controls = mt8188_mt6359_controls, 1313 .num_controls = ARRAY_SIZE(mt8188_mt6359_controls), 1314 .fixup_controls = mt8188_fixup_controls, 1315 }; 1316 1317 static int mt8188_mt6359_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy) 1318 { 1319 struct mtk_platform_card_data *card_data = soc_card_data->card_data; 1320 struct snd_soc_card *card = soc_card_data->card_data->card; 1321 struct snd_soc_dai_link *dai_link; 1322 bool init_mt6359 = false; 1323 bool init_es8326 = false; 1324 bool init_nau8825 = false; 1325 bool init_rt5682s = false; 1326 bool init_max98390 = false; 1327 bool init_dumb = false; 1328 int i; 1329 1330 if (legacy) 1331 return -EINVAL; 1332 1333 for_each_card_prelinks(card, i, dai_link) { 1334 if (strcmp(dai_link->name, "DPTX_BE") == 0) { 1335 if (dai_link->num_codecs && 1336 !snd_soc_dlc_is_dummy(dai_link->codecs)) 1337 dai_link->init = mt8188_dptx_codec_init; 1338 } else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) { 1339 if (dai_link->num_codecs && 1340 !snd_soc_dlc_is_dummy(dai_link->codecs)) 1341 dai_link->init = mt8188_hdmi_codec_init; 1342 } else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 || 1343 strcmp(dai_link->name, "UL_SRC_BE") == 0) { 1344 if (!init_mt6359) { 1345 dai_link->init = mt8188_mt6359_init; 1346 init_mt6359 = true; 1347 } 1348 } else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0 || 1349 strcmp(dai_link->name, "ETDM2_OUT_BE") == 0 || 1350 strcmp(dai_link->name, "ETDM1_IN_BE") == 0 || 1351 strcmp(dai_link->name, "ETDM2_IN_BE") == 0) { 1352 if (!dai_link->num_codecs) 1353 continue; 1354 1355 if (!strcmp(dai_link->codecs->dai_name, MAX98390_CODEC_DAI)) { 1356 /* 1357 * The TDM protocol settings with fixed 4 slots are defined in 1358 * mt8188_max98390_ops. Two amps is I2S mode, 1359 * SOC and codec don't require TDM settings. 1360 */ 1361 if (!(card_data->flags & MAX98390_TWO_AMP)) { 1362 dai_link->ops = &mt8188_max98390_ops; 1363 } 1364 if (!init_max98390) { 1365 dai_link->init = mt8188_max98390_codec_init; 1366 init_max98390 = true; 1367 } 1368 } else if (!strcmp(dai_link->codecs->dai_name, NAU8825_CODEC_DAI)) { 1369 dai_link->ops = &mt8188_nau8825_ops; 1370 if (!init_nau8825) { 1371 dai_link->init = mt8188_headset_codec_init; 1372 dai_link->exit = mt8188_headset_codec_exit; 1373 init_nau8825 = true; 1374 } 1375 } else if (!strcmp(dai_link->codecs->dai_name, RT5682S_CODEC_DAI)) { 1376 dai_link->ops = &mt8188_rt5682s_i2s_ops; 1377 if (!init_rt5682s) { 1378 dai_link->init = mt8188_headset_codec_init; 1379 dai_link->exit = mt8188_headset_codec_exit; 1380 init_rt5682s = true; 1381 } 1382 } else if (!strcmp(dai_link->codecs->dai_name, ES8326_CODEC_DAI)) { 1383 dai_link->ops = &mt8188_es8326_ops; 1384 if (!init_es8326) { 1385 dai_link->init = mt8188_headset_codec_init; 1386 dai_link->exit = mt8188_headset_codec_exit; 1387 init_es8326 = true; 1388 } 1389 } else { 1390 if (!snd_soc_dlc_is_dummy(dai_link->codecs)) { 1391 if (!init_dumb) { 1392 dai_link->init = mt8188_dumb_amp_init; 1393 init_dumb = true; 1394 } 1395 } 1396 } 1397 } 1398 } 1399 1400 return 0; 1401 } 1402 1403 static const struct mtk_sof_priv mt8188_sof_priv = { 1404 .conn_streams = g_sof_conn_streams, 1405 .num_streams = ARRAY_SIZE(g_sof_conn_streams), 1406 }; 1407 1408 static const struct mtk_soundcard_pdata mt8188_evb_card = { 1409 .card_name = "mt8188_mt6359", 1410 .card_data = &(struct mtk_platform_card_data) { 1411 .card = &mt8188_mt6359_soc_card, 1412 .num_jacks = MT8188_JACK_MAX, 1413 }, 1414 .sof_priv = &mt8188_sof_priv, 1415 .soc_probe = mt8188_mt6359_soc_card_probe, 1416 }; 1417 1418 static const struct mtk_soundcard_pdata mt8188_nau8825_card = { 1419 .card_name = "mt8188_nau8825", 1420 .card_data = &(struct mtk_platform_card_data) { 1421 .card = &mt8188_mt6359_soc_card, 1422 .num_jacks = MT8188_JACK_MAX, 1423 .flags = NAU8825_HS_PRESENT 1424 }, 1425 .sof_priv = &mt8188_sof_priv, 1426 .soc_probe = mt8188_mt6359_soc_card_probe, 1427 }; 1428 1429 static const struct mtk_soundcard_pdata mt8188_rt5682s_card = { 1430 .card_name = "mt8188_rt5682s", 1431 .card_data = &(struct mtk_platform_card_data) { 1432 .card = &mt8188_mt6359_soc_card, 1433 .num_jacks = MT8188_JACK_MAX, 1434 .flags = RT5682S_HS_PRESENT | MAX98390_TWO_AMP 1435 }, 1436 .sof_priv = &mt8188_sof_priv, 1437 .soc_probe = mt8188_mt6359_soc_card_probe, 1438 }; 1439 1440 static const struct mtk_soundcard_pdata mt8188_es8326_card = { 1441 .card_name = "mt8188_es8326", 1442 .card_data = &(struct mtk_platform_card_data) { 1443 .card = &mt8188_mt6359_soc_card, 1444 .num_jacks = MT8188_JACK_MAX, 1445 .flags = ES8326_HS_PRESENT | MAX98390_TWO_AMP 1446 }, 1447 .sof_priv = &mt8188_sof_priv, 1448 .soc_probe = mt8188_mt6359_soc_card_probe, 1449 }; 1450 1451 static const struct of_device_id mt8188_mt6359_dt_match[] = { 1452 { .compatible = "mediatek,mt8188-mt6359-evb", .data = &mt8188_evb_card, }, 1453 { .compatible = "mediatek,mt8188-nau8825", .data = &mt8188_nau8825_card, }, 1454 { .compatible = "mediatek,mt8188-rt5682s", .data = &mt8188_rt5682s_card, }, 1455 { .compatible = "mediatek,mt8188-es8326", .data = &mt8188_es8326_card, }, 1456 { /* sentinel */ }, 1457 }; 1458 MODULE_DEVICE_TABLE(of, mt8188_mt6359_dt_match); 1459 1460 static struct platform_driver mt8188_mt6359_driver = { 1461 .driver = { 1462 .name = "mt8188_mt6359", 1463 .of_match_table = mt8188_mt6359_dt_match, 1464 .pm = &snd_soc_pm_ops, 1465 }, 1466 .probe = mtk_soundcard_common_probe, 1467 }; 1468 1469 module_platform_driver(mt8188_mt6359_driver); 1470 1471 /* Module information */ 1472 MODULE_DESCRIPTION("MT8188-MT6359 ALSA SoC machine driver"); 1473 MODULE_AUTHOR("Trevor Wu <trevor.wu@mediatek.com>"); 1474 MODULE_LICENSE("GPL"); 1475 MODULE_ALIAS("mt8188 mt6359 soc card"); 1476