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