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