FILE
mt8188-mt6359.c
File preview with syntax highlighting.
linux-6.19.14/sound/soc/mediatek/mt8188/mt8188-mt6359.c
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 */ 67SND_SOC_DAILINK_DEFS(playback2, 68 DAILINK_COMP_ARRAY(COMP_CPU("DL2")), 69 DAILINK_COMP_ARRAY(COMP_DUMMY()), 70 DAILINK_COMP_ARRAY(COMP_EMPTY())); 71 72SND_SOC_DAILINK_DEFS(playback3, 73 DAILINK_COMP_ARRAY(COMP_CPU("DL3")), 74 DAILINK_COMP_ARRAY(COMP_DUMMY()), 75 DAILINK_COMP_ARRAY(COMP_EMPTY())); 76 77SND_SOC_DAILINK_DEFS(playback6, 78 DAILINK_COMP_ARRAY(COMP_CPU("DL6")), 79 DAILINK_COMP_ARRAY(COMP_DUMMY()), 80 DAILINK_COMP_ARRAY(COMP_EMPTY())); 81 82SND_SOC_DAILINK_DEFS(playback7, 83 DAILINK_COMP_ARRAY(COMP_CPU("DL7")), 84 DAILINK_COMP_ARRAY(COMP_DUMMY()), 85 DAILINK_COMP_ARRAY(COMP_EMPTY())); 86 87SND_SOC_DAILINK_DEFS(playback8, 88 DAILINK_COMP_ARRAY(COMP_CPU("DL8")), 89 DAILINK_COMP_ARRAY(COMP_DUMMY()), 90 DAILINK_COMP_ARRAY(COMP_EMPTY())); 91 92SND_SOC_DAILINK_DEFS(playback10, 93 DAILINK_COMP_ARRAY(COMP_CPU("DL10")), 94 DAILINK_COMP_ARRAY(COMP_DUMMY()), 95 DAILINK_COMP_ARRAY(COMP_EMPTY())); 96 97SND_SOC_DAILINK_DEFS(playback11, 98 DAILINK_COMP_ARRAY(COMP_CPU("DL11")), 99 DAILINK_COMP_ARRAY(COMP_DUMMY()), 100 DAILINK_COMP_ARRAY(COMP_EMPTY())); 101 102SND_SOC_DAILINK_DEFS(capture1, 103 DAILINK_COMP_ARRAY(COMP_CPU("UL1")), 104 DAILINK_COMP_ARRAY(COMP_DUMMY()), 105 DAILINK_COMP_ARRAY(COMP_EMPTY())); 106 107SND_SOC_DAILINK_DEFS(capture2, 108 DAILINK_COMP_ARRAY(COMP_CPU("UL2")), 109 DAILINK_COMP_ARRAY(COMP_DUMMY()), 110 DAILINK_COMP_ARRAY(COMP_EMPTY())); 111 112SND_SOC_DAILINK_DEFS(capture3, 113 DAILINK_COMP_ARRAY(COMP_CPU("UL3")), 114 DAILINK_COMP_ARRAY(COMP_DUMMY()), 115 DAILINK_COMP_ARRAY(COMP_EMPTY())); 116 117SND_SOC_DAILINK_DEFS(capture4, 118 DAILINK_COMP_ARRAY(COMP_CPU("UL4")), 119 DAILINK_COMP_ARRAY(COMP_DUMMY()), 120 DAILINK_COMP_ARRAY(COMP_EMPTY())); 121 122SND_SOC_DAILINK_DEFS(capture5, 123 DAILINK_COMP_ARRAY(COMP_CPU("UL5")), 124 DAILINK_COMP_ARRAY(COMP_DUMMY()), 125 DAILINK_COMP_ARRAY(COMP_EMPTY())); 126 127SND_SOC_DAILINK_DEFS(capture6, 128 DAILINK_COMP_ARRAY(COMP_CPU("UL6")), 129 DAILINK_COMP_ARRAY(COMP_DUMMY()), 130 DAILINK_COMP_ARRAY(COMP_EMPTY())); 131 132SND_SOC_DAILINK_DEFS(capture8, 133 DAILINK_COMP_ARRAY(COMP_CPU("UL8")), 134 DAILINK_COMP_ARRAY(COMP_DUMMY()), 135 DAILINK_COMP_ARRAY(COMP_EMPTY())); 136 137SND_SOC_DAILINK_DEFS(capture9, 138 DAILINK_COMP_ARRAY(COMP_CPU("UL9")), 139 DAILINK_COMP_ARRAY(COMP_DUMMY()), 140 DAILINK_COMP_ARRAY(COMP_EMPTY())); 141 142SND_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 */ 148SND_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 154SND_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 159SND_SOC_DAILINK_DEFS(dptx, 160 DAILINK_COMP_ARRAY(COMP_CPU("DPTX")), 161 DAILINK_COMP_ARRAY(COMP_DUMMY()), 162 DAILINK_COMP_ARRAY(COMP_EMPTY())); 163 164SND_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 169SND_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 174SND_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 179SND_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 184SND_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 189SND_SOC_DAILINK_DEFS(pcm1, 190 DAILINK_COMP_ARRAY(COMP_CPU("PCM1")), 191 DAILINK_COMP_ARRAY(COMP_DUMMY()), 192 DAILINK_COMP_ARRAY(COMP_EMPTY())); 193 194SND_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 200SND_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 205SND_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 210SND_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 215SND_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 220static 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 243enum mt8188_jacks { 244 MT8188_JACK_HEADSET, 245 MT8188_JACK_DP, 246 MT8188_JACK_HDMI, 247 MT8188_JACK_MAX, 248}; 249 250static struct snd_soc_jack_pin mt8188_hdmi_jack_pins[] = { 251 { 252 .pin = "HDMI", 253 .mask = SND_JACK_AVOUT, 254 }, 255}; 256 257static struct snd_soc_jack_pin mt8188_dp_jack_pins[] = { 258 { 259 .pin = "DP", 260 .mask = SND_JACK_AVOUT, 261 }, 262}; 263 264static 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 275static 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 286static const struct snd_kcontrol_new mt8188_dumb_spk_controls[] = { 287 SOC_DAPM_PIN_SWITCH("Ext Spk"), 288}; 289 290static const struct snd_soc_dapm_widget mt8188_dumb_spk_widgets[] = { 291 SND_SOC_DAPM_SPK("Ext Spk", NULL), 292}; 293 294static 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 299static 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 304static 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 309static 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 314static 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 331static const struct snd_kcontrol_new mt8188_mt6359_controls[] = { 332 SOC_DAPM_PIN_SWITCH("Headphone"), 333 SOC_DAPM_PIN_SWITCH("Headset Mic"), 334}; 335 336static const struct snd_soc_dapm_widget mt8188_nau8825_widgets[] = { 337 SND_SOC_DAPM_HP("Headphone Jack", NULL), 338}; 339 340static const struct snd_kcontrol_new mt8188_nau8825_controls[] = { 341 SOC_DAPM_PIN_SWITCH("Headphone Jack"), 342}; 343 344static 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 357static 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 521static 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 550static 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 567enum { 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 605static 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 617static const struct snd_soc_ops mt8188_dptx_ops = { 618 .hw_params = mt8188_dptx_hw_params, 619}; 620 621static 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 633static 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 659static 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 684static int mt8188_dumb_amp_init(struct snd_soc_pcm_runtime *rtd) 685{ 686 struct snd_soc_card *card = rtd->card; 687 struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card); 688 int ret = 0; 689 690 ret = snd_soc_dapm_new_controls(dapm, mt8188_dumb_spk_widgets, 691 ARRAY_SIZE(mt8188_dumb_spk_widgets)); 692 if (ret) { 693 dev_err(rtd->dev, "unable to add Dumb Speaker dapm, ret %d\n", ret); 694 return ret; 695 } 696 697 ret = snd_soc_add_card_controls(card, mt8188_dumb_spk_controls, 698 ARRAY_SIZE(mt8188_dumb_spk_controls)); 699 if (ret) { 700 dev_err(rtd->dev, "unable to add Dumb card controls, ret %d\n", ret); 701 return ret; 702 } 703 704 return 0; 705} 706 707static int mt8188_max98390_hw_params(struct snd_pcm_substream *substream, 708 struct snd_pcm_hw_params *params) 709{ 710 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 711 unsigned int bit_width = params_width(params); 712 struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); 713 struct snd_soc_dai *codec_dai; 714 int i; 715 716 snd_soc_dai_set_tdm_slot(cpu_dai, 0xf, 0xf, 4, bit_width); 717 718 for_each_rtd_codec_dais(rtd, i, codec_dai) { 719 if (!strcmp(codec_dai->component->name, MAX98390_DEV0_NAME)) 720 snd_soc_dai_set_tdm_slot(codec_dai, 0x8, 0x3, 4, bit_width); 721 722 if (!strcmp(codec_dai->component->name, MAX98390_DEV1_NAME)) 723 snd_soc_dai_set_tdm_slot(codec_dai, 0x4, 0x3, 4, bit_width); 724 725 if (!strcmp(codec_dai->component->name, MAX98390_DEV2_NAME)) 726 snd_soc_dai_set_tdm_slot(codec_dai, 0x2, 0x3, 4, bit_width); 727 728 if (!strcmp(codec_dai->component->name, MAX98390_DEV3_NAME)) 729 snd_soc_dai_set_tdm_slot(codec_dai, 0x1, 0x3, 4, bit_width); 730 } 731 return 0; 732} 733 734static const struct snd_soc_ops mt8188_max98390_ops = { 735 .hw_params = mt8188_max98390_hw_params, 736}; 737 738static int mt8188_max98390_codec_init(struct snd_soc_pcm_runtime *rtd) 739{ 740 struct snd_soc_card *card = rtd->card; 741 struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card); 742 int ret; 743 744 /* add regular speakers dapm route */ 745 ret = snd_soc_dapm_new_controls(dapm, mt8188_dual_spk_widgets, 746 ARRAY_SIZE(mt8188_dual_spk_widgets)); 747 if (ret) { 748 dev_err(rtd->dev, "unable to add Left/Right Speaker widget, ret %d\n", ret); 749 return ret; 750 } 751 752 ret = snd_soc_add_card_controls(card, mt8188_dual_spk_controls, 753 ARRAY_SIZE(mt8188_dual_spk_controls)); 754 if (ret) { 755 dev_err(rtd->dev, "unable to add Left/Right card controls, ret %d\n", ret); 756 return ret; 757 } 758 759 if (rtd->dai_link->num_codecs <= 2) 760 return 0; 761 762 /* add widgets/controls/dapm for rear speakers */ 763 ret = snd_soc_dapm_new_controls(dapm, mt8188_rear_spk_widgets, 764 ARRAY_SIZE(mt8188_rear_spk_widgets)); 765 if (ret) { 766 dev_err(rtd->dev, "unable to add Rear Speaker widget, ret %d\n", ret); 767 /* Don't need to add routes if widget addition failed */ 768 return ret; 769 } 770 771 ret = snd_soc_add_card_controls(card, mt8188_rear_spk_controls, 772 ARRAY_SIZE(mt8188_rear_spk_controls)); 773 if (ret) { 774 dev_err(rtd->dev, "unable to add Rear card controls, ret %d\n", ret); 775 return ret; 776 } 777 778 return 0; 779} 780 781static int mt8188_headset_codec_init(struct snd_soc_pcm_runtime *rtd) 782{ 783 struct snd_soc_card *card = rtd->card; 784 struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card); 785 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card); 786 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_HEADSET]; 787 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component; 788 struct mtk_platform_card_data *card_data = soc_card_data->card_data; 789 int ret; 790 791 ret = snd_soc_dapm_new_controls(dapm, mt8188_nau8825_widgets, 792 ARRAY_SIZE(mt8188_nau8825_widgets)); 793 if (ret) { 794 dev_err(rtd->dev, "unable to add nau8825 card widget, ret %d\n", ret); 795 return ret; 796 } 797 798 ret = snd_soc_add_card_controls(card, mt8188_nau8825_controls, 799 ARRAY_SIZE(mt8188_nau8825_controls)); 800 if (ret) { 801 dev_err(rtd->dev, "unable to add nau8825 card controls, ret %d\n", ret); 802 return ret; 803 } 804 805 ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack", 806 SND_JACK_HEADSET | SND_JACK_BTN_0 | 807 SND_JACK_BTN_1 | SND_JACK_BTN_2 | 808 SND_JACK_BTN_3, 809 jack, 810 nau8825_jack_pins, 811 ARRAY_SIZE(nau8825_jack_pins)); 812 if (ret) { 813 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret); 814 return ret; 815 } 816 817 if (card_data->flags & ES8326_HS_PRESENT) { 818 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); 819 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOLUMEUP); 820 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEDOWN); 821 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOICECOMMAND); 822 } else { 823 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); 824 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND); 825 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP); 826 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN); 827 } 828 829 ret = snd_soc_component_set_jack(component, jack, NULL); 830 831 if (ret) { 832 dev_err(rtd->dev, "Headset Jack call-back failed: %d\n", ret); 833 return ret; 834 } 835 836 return 0; 837}; 838 839static void mt8188_headset_codec_exit(struct snd_soc_pcm_runtime *rtd) 840{ 841 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component; 842 843 snd_soc_component_set_jack(component, NULL, NULL); 844} 845 846 847static int mt8188_nau8825_hw_params(struct snd_pcm_substream *substream, 848 struct snd_pcm_hw_params *params) 849{ 850 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 851 struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0); 852 unsigned int rate = params_rate(params); 853 unsigned int bit_width = params_width(params); 854 int clk_freq, ret; 855 856 clk_freq = rate * 2 * bit_width; 857 858 /* Configure clock for codec */ 859 ret = snd_soc_dai_set_sysclk(codec_dai, NAU8825_CLK_FLL_BLK, 0, 860 SND_SOC_CLOCK_IN); 861 if (ret < 0) { 862 dev_err(codec_dai->dev, "can't set BCLK clock %d\n", ret); 863 return ret; 864 } 865 866 /* Configure pll for codec */ 867 ret = snd_soc_dai_set_pll(codec_dai, 0, 0, clk_freq, 868 params_rate(params) * 256); 869 if (ret < 0) { 870 dev_err(codec_dai->dev, "can't set BCLK: %d\n", ret); 871 return ret; 872 } 873 874 return 0; 875} 876 877static const struct snd_soc_ops mt8188_nau8825_ops = { 878 .hw_params = mt8188_nau8825_hw_params, 879}; 880 881static int mt8188_rt5682s_i2s_hw_params(struct snd_pcm_substream *substream, 882 struct snd_pcm_hw_params *params) 883{ 884 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 885 struct snd_soc_card *card = rtd->card; 886 struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); 887 struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0); 888 unsigned int rate = params_rate(params); 889 int bitwidth; 890 int ret; 891 892 bitwidth = snd_pcm_format_width(params_format(params)); 893 if (bitwidth < 0) { 894 dev_err(card->dev, "invalid bit width: %d\n", bitwidth); 895 return bitwidth; 896 } 897 898 ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth); 899 if (ret) { 900 dev_err(card->dev, "failed to set tdm slot\n"); 901 return ret; 902 } 903 904 ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1, RT5682_PLL1_S_BCLK1, 905 rate * 32, rate * 512); 906 if (ret) { 907 dev_err(card->dev, "failed to set pll\n"); 908 return ret; 909 } 910 911 ret = snd_soc_dai_set_sysclk(codec_dai, RT5682_SCLK_S_PLL1, 912 rate * 512, SND_SOC_CLOCK_IN); 913 if (ret) { 914 dev_err(card->dev, "failed to set sysclk\n"); 915 return ret; 916 } 917 918 return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 128, 919 SND_SOC_CLOCK_OUT); 920} 921 922static const struct snd_soc_ops mt8188_rt5682s_i2s_ops = { 923 .hw_params = mt8188_rt5682s_i2s_hw_params, 924}; 925 926static int mt8188_sof_be_hw_params(struct snd_pcm_substream *substream, 927 struct snd_pcm_hw_params *params) 928{ 929 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 930 struct snd_soc_component *cmpnt_afe = NULL; 931 struct snd_soc_pcm_runtime *runtime; 932 933 /* find afe component */ 934 for_each_card_rtds(rtd->card, runtime) { 935 cmpnt_afe = snd_soc_rtdcom_lookup(runtime, AFE_PCM_NAME); 936 if (cmpnt_afe) 937 break; 938 } 939 940 if (cmpnt_afe && !pm_runtime_active(cmpnt_afe->dev)) { 941 dev_err(rtd->dev, "afe pm runtime is not active!!\n"); 942 return -EINVAL; 943 } 944 945 return 0; 946} 947 948static const struct snd_soc_ops mt8188_sof_be_ops = { 949 .hw_params = mt8188_sof_be_hw_params, 950}; 951 952static int mt8188_es8326_hw_params(struct snd_pcm_substream *substream, 953 struct snd_pcm_hw_params *params) 954{ 955 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 956 struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); 957 struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0); 958 unsigned int rate = params_rate(params); 959 int ret; 960 961 /* Configure MCLK for codec */ 962 ret = snd_soc_dai_set_sysclk(codec_dai, 0, rate * 256, SND_SOC_CLOCK_IN); 963 if (ret < 0) { 964 dev_err(codec_dai->dev, "can't set MCLK %d\n", ret); 965 return ret; 966 } 967 968 /* Configure MCLK for cpu */ 969 return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 256, SND_SOC_CLOCK_OUT); 970} 971 972static const struct snd_soc_ops mt8188_es8326_ops = { 973 .hw_params = mt8188_es8326_hw_params, 974}; 975 976static struct snd_soc_dai_link mt8188_mt6359_dai_links[] = { 977 /* FE */ 978 [DAI_LINK_DL2_FE] = { 979 .name = "DL2_FE", 980 .stream_name = "DL2 Playback", 981 .trigger = { 982 SND_SOC_DPCM_TRIGGER_POST, 983 SND_SOC_DPCM_TRIGGER_POST, 984 }, 985 .dynamic = 1, 986 .playback_only = 1, 987 .dpcm_merged_chan = 1, 988 .dpcm_merged_rate = 1, 989 .dpcm_merged_format = 1, 990 SND_SOC_DAILINK_REG(playback2), 991 }, 992 [DAI_LINK_DL3_FE] = { 993 .name = "DL3_FE", 994 .stream_name = "DL3 Playback", 995 .trigger = { 996 SND_SOC_DPCM_TRIGGER_POST, 997 SND_SOC_DPCM_TRIGGER_POST, 998 }, 999 .dynamic = 1, 1000 .playback_only = 1, 1001 .dpcm_merged_chan = 1, 1002 .dpcm_merged_rate = 1, 1003 .dpcm_merged_format = 1, 1004 SND_SOC_DAILINK_REG(playback3), 1005 }, 1006 [DAI_LINK_DL6_FE] = { 1007 .name = "DL6_FE", 1008 .stream_name = "DL6 Playback", 1009 .trigger = { 1010 SND_SOC_DPCM_TRIGGER_POST, 1011 SND_SOC_DPCM_TRIGGER_POST, 1012 }, 1013 .dynamic = 1, 1014 .playback_only = 1, 1015 .dpcm_merged_chan = 1, 1016 .dpcm_merged_rate = 1, 1017 .dpcm_merged_format = 1, 1018 SND_SOC_DAILINK_REG(playback6), 1019 }, 1020 [DAI_LINK_DL7_FE] = { 1021 .name = "DL7_FE", 1022 .stream_name = "DL7 Playback", 1023 .trigger = { 1024 SND_SOC_DPCM_TRIGGER_PRE, 1025 SND_SOC_DPCM_TRIGGER_PRE, 1026 }, 1027 .dynamic = 1, 1028 .playback_only = 1, 1029 SND_SOC_DAILINK_REG(playback7), 1030 }, 1031 [DAI_LINK_DL8_FE] = { 1032 .name = "DL8_FE", 1033 .stream_name = "DL8 Playback", 1034 .trigger = { 1035 SND_SOC_DPCM_TRIGGER_POST, 1036 SND_SOC_DPCM_TRIGGER_POST, 1037 }, 1038 .dynamic = 1, 1039 .playback_only = 1, 1040 SND_SOC_DAILINK_REG(playback8), 1041 }, 1042 [DAI_LINK_DL10_FE] = { 1043 .name = "DL10_FE", 1044 .stream_name = "DL10 Playback", 1045 .trigger = { 1046 SND_SOC_DPCM_TRIGGER_POST, 1047 SND_SOC_DPCM_TRIGGER_POST, 1048 }, 1049 .dynamic = 1, 1050 .playback_only = 1, 1051 SND_SOC_DAILINK_REG(playback10), 1052 }, 1053 [DAI_LINK_DL11_FE] = { 1054 .name = "DL11_FE", 1055 .stream_name = "DL11 Playback", 1056 .trigger = { 1057 SND_SOC_DPCM_TRIGGER_POST, 1058 SND_SOC_DPCM_TRIGGER_POST, 1059 }, 1060 .dynamic = 1, 1061 .playback_only = 1, 1062 SND_SOC_DAILINK_REG(playback11), 1063 }, 1064 [DAI_LINK_UL1_FE] = { 1065 .name = "UL1_FE", 1066 .stream_name = "UL1 Capture", 1067 .trigger = { 1068 SND_SOC_DPCM_TRIGGER_PRE, 1069 SND_SOC_DPCM_TRIGGER_PRE, 1070 }, 1071 .dynamic = 1, 1072 .capture_only = 1, 1073 SND_SOC_DAILINK_REG(capture1), 1074 }, 1075 [DAI_LINK_UL2_FE] = { 1076 .name = "UL2_FE", 1077 .stream_name = "UL2 Capture", 1078 .trigger = { 1079 SND_SOC_DPCM_TRIGGER_POST, 1080 SND_SOC_DPCM_TRIGGER_POST, 1081 }, 1082 .dynamic = 1, 1083 .capture_only = 1, 1084 SND_SOC_DAILINK_REG(capture2), 1085 }, 1086 [DAI_LINK_UL3_FE] = { 1087 .name = "UL3_FE", 1088 .stream_name = "UL3 Capture", 1089 .trigger = { 1090 SND_SOC_DPCM_TRIGGER_POST, 1091 SND_SOC_DPCM_TRIGGER_POST, 1092 }, 1093 .dynamic = 1, 1094 .capture_only = 1, 1095 SND_SOC_DAILINK_REG(capture3), 1096 }, 1097 [DAI_LINK_UL4_FE] = { 1098 .name = "UL4_FE", 1099 .stream_name = "UL4 Capture", 1100 .trigger = { 1101 SND_SOC_DPCM_TRIGGER_POST, 1102 SND_SOC_DPCM_TRIGGER_POST, 1103 }, 1104 .dynamic = 1, 1105 .capture_only = 1, 1106 .dpcm_merged_chan = 1, 1107 .dpcm_merged_rate = 1, 1108 .dpcm_merged_format = 1, 1109 SND_SOC_DAILINK_REG(capture4), 1110 }, 1111 [DAI_LINK_UL5_FE] = { 1112 .name = "UL5_FE", 1113 .stream_name = "UL5 Capture", 1114 .trigger = { 1115 SND_SOC_DPCM_TRIGGER_POST, 1116 SND_SOC_DPCM_TRIGGER_POST, 1117 }, 1118 .dynamic = 1, 1119 .capture_only = 1, 1120 .dpcm_merged_chan = 1, 1121 .dpcm_merged_rate = 1, 1122 .dpcm_merged_format = 1, 1123 SND_SOC_DAILINK_REG(capture5), 1124 }, 1125 [DAI_LINK_UL6_FE] = { 1126 .name = "UL6_FE", 1127 .stream_name = "UL6 Capture", 1128 .trigger = { 1129 SND_SOC_DPCM_TRIGGER_PRE, 1130 SND_SOC_DPCM_TRIGGER_PRE, 1131 }, 1132 .dynamic = 1, 1133 .capture_only = 1, 1134 SND_SOC_DAILINK_REG(capture6), 1135 }, 1136 [DAI_LINK_UL8_FE] = { 1137 .name = "UL8_FE", 1138 .stream_name = "UL8 Capture", 1139 .trigger = { 1140 SND_SOC_DPCM_TRIGGER_POST, 1141 SND_SOC_DPCM_TRIGGER_POST, 1142 }, 1143 .dynamic = 1, 1144 .capture_only = 1, 1145 SND_SOC_DAILINK_REG(capture8), 1146 }, 1147 [DAI_LINK_UL9_FE] = { 1148 .name = "UL9_FE", 1149 .stream_name = "UL9 Capture", 1150 .trigger = { 1151 SND_SOC_DPCM_TRIGGER_POST, 1152 SND_SOC_DPCM_TRIGGER_POST, 1153 }, 1154 .dynamic = 1, 1155 .capture_only = 1, 1156 SND_SOC_DAILINK_REG(capture9), 1157 }, 1158 [DAI_LINK_UL10_FE] = { 1159 .name = "UL10_FE", 1160 .stream_name = "UL10 Capture", 1161 .trigger = { 1162 SND_SOC_DPCM_TRIGGER_POST, 1163 SND_SOC_DPCM_TRIGGER_POST, 1164 }, 1165 .dynamic = 1, 1166 .capture_only = 1, 1167 SND_SOC_DAILINK_REG(capture10), 1168 }, 1169 /* BE */ 1170 [DAI_LINK_DL_SRC_BE] = { 1171 .name = "DL_SRC_BE", 1172 .no_pcm = 1, 1173 .playback_only = 1, 1174 SND_SOC_DAILINK_REG(dl_src), 1175 }, 1176 [DAI_LINK_DMIC_BE] = { 1177 .name = "DMIC_BE", 1178 .no_pcm = 1, 1179 .capture_only = 1, 1180 .ignore_suspend = 1, 1181 SND_SOC_DAILINK_REG(DMIC_BE), 1182 }, 1183 [DAI_LINK_DPTX_BE] = { 1184 .name = "DPTX_BE", 1185 .ops = &mt8188_dptx_ops, 1186 .be_hw_params_fixup = mt8188_dptx_hw_params_fixup, 1187 .no_pcm = 1, 1188 .playback_only = 1, 1189 SND_SOC_DAILINK_REG(dptx), 1190 }, 1191 [DAI_LINK_ETDM1_IN_BE] = { 1192 .name = "ETDM1_IN_BE", 1193 .no_pcm = 1, 1194 .dai_fmt = SND_SOC_DAIFMT_I2S | 1195 SND_SOC_DAIFMT_NB_NF | 1196 SND_SOC_DAIFMT_CBP_CFP, 1197 .capture_only = 1, 1198 .ignore_suspend = 1, 1199 SND_SOC_DAILINK_REG(etdm1_in), 1200 }, 1201 [DAI_LINK_ETDM2_IN_BE] = { 1202 .name = "ETDM2_IN_BE", 1203 .no_pcm = 1, 1204 .dai_fmt = SND_SOC_DAIFMT_I2S | 1205 SND_SOC_DAIFMT_NB_NF | 1206 SND_SOC_DAIFMT_CBP_CFP, 1207 .capture_only = 1, 1208 SND_SOC_DAILINK_REG(etdm2_in), 1209 }, 1210 [DAI_LINK_ETDM1_OUT_BE] = { 1211 .name = "ETDM1_OUT_BE", 1212 .no_pcm = 1, 1213 .dai_fmt = SND_SOC_DAIFMT_I2S | 1214 SND_SOC_DAIFMT_NB_NF | 1215 SND_SOC_DAIFMT_CBC_CFC, 1216 .playback_only = 1, 1217 SND_SOC_DAILINK_REG(etdm1_out), 1218 }, 1219 [DAI_LINK_ETDM2_OUT_BE] = { 1220 .name = "ETDM2_OUT_BE", 1221 .no_pcm = 1, 1222 .dai_fmt = SND_SOC_DAIFMT_I2S | 1223 SND_SOC_DAIFMT_NB_NF | 1224 SND_SOC_DAIFMT_CBC_CFC, 1225 .playback_only = 1, 1226 SND_SOC_DAILINK_REG(etdm2_out), 1227 }, 1228 [DAI_LINK_ETDM3_OUT_BE] = { 1229 .name = "ETDM3_OUT_BE", 1230 .no_pcm = 1, 1231 .dai_fmt = SND_SOC_DAIFMT_I2S | 1232 SND_SOC_DAIFMT_NB_NF | 1233 SND_SOC_DAIFMT_CBC_CFC, 1234 .playback_only = 1, 1235 SND_SOC_DAILINK_REG(etdm3_out), 1236 }, 1237 [DAI_LINK_PCM1_BE] = { 1238 .name = "PCM1_BE", 1239 .no_pcm = 1, 1240 .dai_fmt = SND_SOC_DAIFMT_I2S | 1241 SND_SOC_DAIFMT_NB_NF | 1242 SND_SOC_DAIFMT_CBC_CFC, 1243 SND_SOC_DAILINK_REG(pcm1), 1244 }, 1245 [DAI_LINK_UL_SRC_BE] = { 1246 .name = "UL_SRC_BE", 1247 .no_pcm = 1, 1248 .capture_only = 1, 1249 SND_SOC_DAILINK_REG(ul_src), 1250 }, 1251 1252 /* SOF BE */ 1253 [DAI_LINK_SOF_DL2_BE] = { 1254 .name = "AFE_SOF_DL2", 1255 .no_pcm = 1, 1256 .playback_only = 1, 1257 .ops = &mt8188_sof_be_ops, 1258 SND_SOC_DAILINK_REG(AFE_SOF_DL2), 1259 }, 1260 [DAI_LINK_SOF_DL3_BE] = { 1261 .name = "AFE_SOF_DL3", 1262 .no_pcm = 1, 1263 .playback_only = 1, 1264 .ops = &mt8188_sof_be_ops, 1265 SND_SOC_DAILINK_REG(AFE_SOF_DL3), 1266 }, 1267 [DAI_LINK_SOF_UL4_BE] = { 1268 .name = "AFE_SOF_UL4", 1269 .no_pcm = 1, 1270 .capture_only = 1, 1271 .ops = &mt8188_sof_be_ops, 1272 SND_SOC_DAILINK_REG(AFE_SOF_UL4), 1273 }, 1274 [DAI_LINK_SOF_UL5_BE] = { 1275 .name = "AFE_SOF_UL5", 1276 .no_pcm = 1, 1277 .capture_only = 1, 1278 .ops = &mt8188_sof_be_ops, 1279 SND_SOC_DAILINK_REG(AFE_SOF_UL5), 1280 }, 1281}; 1282 1283static void mt8188_fixup_controls(struct snd_soc_card *card) 1284{ 1285 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card); 1286 struct mtk_platform_card_data *card_data = soc_card_data->card_data; 1287 struct snd_kcontrol *kctl; 1288 1289 if (card_data->flags & (NAU8825_HS_PRESENT | RT5682S_HS_PRESENT | ES8326_HS_PRESENT)) { 1290 struct snd_soc_dapm_widget *w, *next_w; 1291 1292 for_each_card_widgets_safe(card, w, next_w) { 1293 if (strcmp(w->name, "Headphone")) 1294 continue; 1295 1296 snd_soc_dapm_free_widget(w); 1297 } 1298 1299 kctl = snd_ctl_find_id_mixer(card->snd_card, "Headphone Switch"); 1300 if (kctl) 1301 snd_ctl_remove(card->snd_card, kctl); 1302 else 1303 dev_warn(card->dev, "Cannot find ctl : Headphone Switch\n"); 1304 } 1305} 1306 1307static struct snd_soc_card mt8188_mt6359_soc_card = { 1308 .owner = THIS_MODULE, 1309 .dai_link = mt8188_mt6359_dai_links, 1310 .num_links = ARRAY_SIZE(mt8188_mt6359_dai_links), 1311 .dapm_widgets = mt8188_mt6359_widgets, 1312 .num_dapm_widgets = ARRAY_SIZE(mt8188_mt6359_widgets), 1313 .dapm_routes = mt8188_mt6359_routes, 1314 .num_dapm_routes = ARRAY_SIZE(mt8188_mt6359_routes), 1315 .controls = mt8188_mt6359_controls, 1316 .num_controls = ARRAY_SIZE(mt8188_mt6359_controls), 1317 .fixup_controls = mt8188_fixup_controls, 1318}; 1319 1320static int mt8188_mt6359_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy) 1321{ 1322 struct mtk_platform_card_data *card_data = soc_card_data->card_data; 1323 struct snd_soc_card *card = soc_card_data->card_data->card; 1324 struct snd_soc_dai_link *dai_link; 1325 bool init_mt6359 = false; 1326 bool init_es8326 = false; 1327 bool init_nau8825 = false; 1328 bool init_rt5682s = false; 1329 bool init_max98390 = false; 1330 bool init_dumb = false; 1331 int i; 1332 1333 if (legacy) 1334 return -EINVAL; 1335 1336 for_each_card_prelinks(card, i, dai_link) { 1337 if (strcmp(dai_link->name, "DPTX_BE") == 0) { 1338 if (dai_link->num_codecs && 1339 !snd_soc_dlc_is_dummy(dai_link->codecs)) 1340 dai_link->init = mt8188_dptx_codec_init; 1341 } else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) { 1342 if (dai_link->num_codecs && 1343 !snd_soc_dlc_is_dummy(dai_link->codecs)) 1344 dai_link->init = mt8188_hdmi_codec_init; 1345 } else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 || 1346 strcmp(dai_link->name, "UL_SRC_BE") == 0) { 1347 if (!init_mt6359) { 1348 dai_link->init = mt8188_mt6359_init; 1349 init_mt6359 = true; 1350 } 1351 } else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0 || 1352 strcmp(dai_link->name, "ETDM2_OUT_BE") == 0 || 1353 strcmp(dai_link->name, "ETDM1_IN_BE") == 0 || 1354 strcmp(dai_link->name, "ETDM2_IN_BE") == 0) { 1355 if (!dai_link->num_codecs) 1356 continue; 1357 1358 if (!strcmp(dai_link->codecs->dai_name, MAX98390_CODEC_DAI)) { 1359 /* 1360 * The TDM protocol settings with fixed 4 slots are defined in 1361 * mt8188_max98390_ops. Two amps is I2S mode, 1362 * SOC and codec don't require TDM settings. 1363 */ 1364 if (!(card_data->flags & MAX98390_TWO_AMP)) { 1365 dai_link->ops = &mt8188_max98390_ops; 1366 } 1367 if (!init_max98390) { 1368 dai_link->init = mt8188_max98390_codec_init; 1369 init_max98390 = true; 1370 } 1371 } else if (!strcmp(dai_link->codecs->dai_name, NAU8825_CODEC_DAI)) { 1372 dai_link->ops = &mt8188_nau8825_ops; 1373 if (!init_nau8825) { 1374 dai_link->init = mt8188_headset_codec_init; 1375 dai_link->exit = mt8188_headset_codec_exit; 1376 init_nau8825 = true; 1377 } 1378 } else if (!strcmp(dai_link->codecs->dai_name, RT5682S_CODEC_DAI)) { 1379 dai_link->ops = &mt8188_rt5682s_i2s_ops; 1380 if (!init_rt5682s) { 1381 dai_link->init = mt8188_headset_codec_init; 1382 dai_link->exit = mt8188_headset_codec_exit; 1383 init_rt5682s = true; 1384 } 1385 } else if (!strcmp(dai_link->codecs->dai_name, ES8326_CODEC_DAI)) { 1386 dai_link->ops = &mt8188_es8326_ops; 1387 if (!init_es8326) { 1388 dai_link->init = mt8188_headset_codec_init; 1389 dai_link->exit = mt8188_headset_codec_exit; 1390 init_es8326 = true; 1391 } 1392 } else { 1393 if (!snd_soc_dlc_is_dummy(dai_link->codecs)) { 1394 if (!init_dumb) { 1395 dai_link->init = mt8188_dumb_amp_init; 1396 init_dumb = true; 1397 } 1398 } 1399 } 1400 } 1401 } 1402 1403 return 0; 1404} 1405 1406static const struct mtk_sof_priv mt8188_sof_priv = { 1407 .conn_streams = g_sof_conn_streams, 1408 .num_streams = ARRAY_SIZE(g_sof_conn_streams), 1409}; 1410 1411static const struct mtk_soundcard_pdata mt8188_evb_card = { 1412 .card_name = "mt8188_mt6359", 1413 .card_data = &(struct mtk_platform_card_data) { 1414 .card = &mt8188_mt6359_soc_card, 1415 .num_jacks = MT8188_JACK_MAX, 1416 }, 1417 .sof_priv = &mt8188_sof_priv, 1418 .soc_probe = mt8188_mt6359_soc_card_probe, 1419}; 1420 1421static const struct mtk_soundcard_pdata mt8188_nau8825_card = { 1422 .card_name = "mt8188_nau8825", 1423 .card_data = &(struct mtk_platform_card_data) { 1424 .card = &mt8188_mt6359_soc_card, 1425 .num_jacks = MT8188_JACK_MAX, 1426 .flags = NAU8825_HS_PRESENT 1427 }, 1428 .sof_priv = &mt8188_sof_priv, 1429 .soc_probe = mt8188_mt6359_soc_card_probe, 1430}; 1431 1432static const struct mtk_soundcard_pdata mt8188_rt5682s_card = { 1433 .card_name = "mt8188_rt5682s", 1434 .card_data = &(struct mtk_platform_card_data) { 1435 .card = &mt8188_mt6359_soc_card, 1436 .num_jacks = MT8188_JACK_MAX, 1437 .flags = RT5682S_HS_PRESENT | MAX98390_TWO_AMP 1438 }, 1439 .sof_priv = &mt8188_sof_priv, 1440 .soc_probe = mt8188_mt6359_soc_card_probe, 1441}; 1442 1443static const struct mtk_soundcard_pdata mt8188_es8326_card = { 1444 .card_name = "mt8188_es8326", 1445 .card_data = &(struct mtk_platform_card_data) { 1446 .card = &mt8188_mt6359_soc_card, 1447 .num_jacks = MT8188_JACK_MAX, 1448 .flags = ES8326_HS_PRESENT | MAX98390_TWO_AMP 1449 }, 1450 .sof_priv = &mt8188_sof_priv, 1451 .soc_probe = mt8188_mt6359_soc_card_probe, 1452}; 1453 1454static const struct of_device_id mt8188_mt6359_dt_match[] = { 1455 { .compatible = "mediatek,mt8188-mt6359-evb", .data = &mt8188_evb_card, }, 1456 { .compatible = "mediatek,mt8188-nau8825", .data = &mt8188_nau8825_card, }, 1457 { .compatible = "mediatek,mt8188-rt5682s", .data = &mt8188_rt5682s_card, }, 1458 { .compatible = "mediatek,mt8188-es8326", .data = &mt8188_es8326_card, }, 1459 { /* sentinel */ }, 1460}; 1461MODULE_DEVICE_TABLE(of, mt8188_mt6359_dt_match); 1462 1463static struct platform_driver mt8188_mt6359_driver = { 1464 .driver = { 1465 .name = "mt8188_mt6359", 1466 .of_match_table = mt8188_mt6359_dt_match, 1467 .pm = &snd_soc_pm_ops, 1468 }, 1469 .probe = mtk_soundcard_common_probe, 1470}; 1471 1472module_platform_driver(mt8188_mt6359_driver); 1473 1474/* Module information */ 1475MODULE_DESCRIPTION("MT8188-MT6359 ALSA SoC machine driver"); 1476MODULE_AUTHOR("Trevor Wu <trevor.wu@mediatek.com>"); 1477MODULE_LICENSE("GPL"); 1478MODULE_ALIAS("mt8188 mt6359 soc card");
~/
Read-only file preview.