1 // SPDX-License-Identifier: GPL-2.0 2 // 3 // mt8192-mt6359-rt1015-rt5682.c -- 4 // MT8192-MT6359-RT1015-RT6358 ALSA SoC machine driver 5 // 6 // Copyright (c) 2020 MediaTek Inc. 7 // Author: Jiaxin Yu <jiaxin.yu@mediatek.com> 8 // 9 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/rt5682.h> 17 #include <sound/soc.h> 18 19 #include "../../codecs/mt6359.h" 20 #include "../../codecs/rt1015.h" 21 #include "../../codecs/rt5682.h" 22 #include "../common/mtk-afe-platform-driver.h" 23 #include "../common/mtk-soc-card.h" 24 #include "../common/mtk-soundcard-driver.h" 25 #include "mt8192-afe-common.h" 26 #include "mt8192-afe-clk.h" 27 #include "mt8192-afe-gpio.h" 28 29 #define DRIVER_NAME "mt8192_mt6359" 30 31 #define RT1015_CODEC_DAI "rt1015-aif" 32 #define RT1015_DEV0_NAME "rt1015.1-0028" 33 #define RT1015_DEV1_NAME "rt1015.1-0029" 34 35 #define RT1015_RT5682_CARD_NAME "mt8192_mt6359_rt1015_rt5682" 36 #define RT1015P_RT5682_CARD_NAME "mt8192_mt6359_rt1015p_rt5682" 37 #define RT1015P_RT5682S_CARD_NAME "mt8192_mt6359_rt1015p_rt5682s" 38 39 #define RT1015_RT5682_OF_NAME "mediatek,mt8192_mt6359_rt1015_rt5682" 40 #define RT1015P_RT5682_OF_NAME "mediatek,mt8192_mt6359_rt1015p_rt5682" 41 #define RT1015P_RT5682S_OF_NAME "mediatek,mt8192_mt6359_rt1015p_rt5682s" 42 43 enum mt8192_jacks { 44 MT8192_JACK_HEADSET, 45 MT8192_JACK_HDMI, 46 MT8192_JACK_MAX, 47 }; 48 49 /* Headset jack detection DAPM pins */ 50 static struct snd_soc_jack_pin mt8192_jack_pins[] = { 51 { 52 .pin = "Headphone Jack", 53 .mask = SND_JACK_HEADPHONE, 54 }, 55 { 56 .pin = "Headset Mic", 57 .mask = SND_JACK_MICROPHONE, 58 }, 59 }; 60 61 static int mt8192_rt1015_i2s_hw_params(struct snd_pcm_substream *substream, 62 struct snd_pcm_hw_params *params) 63 { 64 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 65 struct snd_soc_card *card = rtd->card; 66 struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); 67 struct snd_soc_dai *codec_dai; 68 unsigned int rate = params_rate(params); 69 unsigned int mclk_fs_ratio = 128; 70 unsigned int mclk_fs = rate * mclk_fs_ratio; 71 int ret, i; 72 73 for_each_rtd_codec_dais(rtd, i, codec_dai) { 74 ret = snd_soc_dai_set_pll(codec_dai, 0, 75 RT1015_PLL_S_BCLK, 76 params_rate(params) * 64, 77 params_rate(params) * 256); 78 if (ret) { 79 dev_err(card->dev, "failed to set pll\n"); 80 return ret; 81 } 82 83 ret = snd_soc_dai_set_sysclk(codec_dai, 84 RT1015_SCLK_S_PLL, 85 params_rate(params) * 256, 86 SND_SOC_CLOCK_IN); 87 if (ret) { 88 dev_err(card->dev, "failed to set sysclk\n"); 89 return ret; 90 } 91 } 92 93 return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT); 94 } 95 96 static int mt8192_rt5682x_i2s_hw_params(struct snd_pcm_substream *substream, 97 struct snd_pcm_hw_params *params) 98 { 99 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 100 struct snd_soc_card *card = rtd->card; 101 struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); 102 struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0); 103 unsigned int rate = params_rate(params); 104 unsigned int mclk_fs_ratio = 128; 105 unsigned int mclk_fs = rate * mclk_fs_ratio; 106 int bitwidth; 107 int ret; 108 109 bitwidth = snd_pcm_format_width(params_format(params)); 110 if (bitwidth < 0) { 111 dev_err(card->dev, "invalid bit width: %d\n", bitwidth); 112 return bitwidth; 113 } 114 115 ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth); 116 if (ret) { 117 dev_err(card->dev, "failed to set tdm slot\n"); 118 return ret; 119 } 120 121 ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1, 122 RT5682_PLL1_S_BCLK1, 123 params_rate(params) * 64, 124 params_rate(params) * 512); 125 if (ret) { 126 dev_err(card->dev, "failed to set pll\n"); 127 return ret; 128 } 129 130 ret = snd_soc_dai_set_sysclk(codec_dai, 131 RT5682_SCLK_S_PLL1, 132 params_rate(params) * 512, 133 SND_SOC_CLOCK_IN); 134 if (ret) { 135 dev_err(card->dev, "failed to set sysclk\n"); 136 return ret; 137 } 138 139 return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT); 140 } 141 142 static const struct snd_soc_ops mt8192_rt1015_i2s_ops = { 143 .hw_params = mt8192_rt1015_i2s_hw_params, 144 }; 145 146 static const struct snd_soc_ops mt8192_rt5682x_i2s_ops = { 147 .hw_params = mt8192_rt5682x_i2s_hw_params, 148 }; 149 150 static int mt8192_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd) 151 { 152 struct snd_soc_component *cmpnt_afe = 153 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); 154 struct snd_soc_component *cmpnt_codec = 155 snd_soc_rtd_to_codec(rtd, 0)->component; 156 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe); 157 struct mt8192_afe_private *afe_priv = afe->platform_priv; 158 int phase; 159 unsigned int monitor; 160 int test_done_1, test_done_2, test_done_3; 161 int cycle_1, cycle_2, cycle_3; 162 int prev_cycle_1, prev_cycle_2, prev_cycle_3; 163 int chosen_phase_1, chosen_phase_2, chosen_phase_3; 164 int counter; 165 int mtkaif_calib_ok; 166 167 pm_runtime_get_sync(afe->dev); 168 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 1); 169 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 0); 170 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34, 1); 171 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34, 0); 172 173 mt6359_mtkaif_calibration_enable(cmpnt_codec); 174 175 /* set clock protocol 2 */ 176 regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x38); 177 regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x39); 178 179 /* set test type to synchronizer pulse */ 180 regmap_update_bits(afe_priv->topckgen, 181 CKSYS_AUD_TOP_CFG, 0xffff, 0x4); 182 183 mtkaif_calib_ok = true; 184 afe_priv->mtkaif_calibration_num_phase = 42; /* mt6359: 0 ~ 42 */ 185 afe_priv->mtkaif_chosen_phase[0] = -1; 186 afe_priv->mtkaif_chosen_phase[1] = -1; 187 afe_priv->mtkaif_chosen_phase[2] = -1; 188 189 for (phase = 0; 190 phase <= afe_priv->mtkaif_calibration_num_phase && 191 mtkaif_calib_ok; 192 phase++) { 193 mt6359_set_mtkaif_calibration_phase(cmpnt_codec, 194 phase, phase, phase); 195 196 regmap_update_bits(afe_priv->topckgen, 197 CKSYS_AUD_TOP_CFG, 0x1, 0x1); 198 199 test_done_1 = 0; 200 test_done_2 = 0; 201 test_done_3 = 0; 202 cycle_1 = -1; 203 cycle_2 = -1; 204 cycle_3 = -1; 205 counter = 0; 206 while (test_done_1 == 0 || 207 test_done_2 == 0 || 208 test_done_3 == 0) { 209 regmap_read(afe_priv->topckgen, 210 CKSYS_AUD_TOP_MON, &monitor); 211 212 test_done_1 = (monitor >> 28) & 0x1; 213 test_done_2 = (monitor >> 29) & 0x1; 214 test_done_3 = (monitor >> 30) & 0x1; 215 if (test_done_1 == 1) 216 cycle_1 = monitor & 0xf; 217 218 if (test_done_2 == 1) 219 cycle_2 = (monitor >> 4) & 0xf; 220 221 if (test_done_3 == 1) 222 cycle_3 = (monitor >> 8) & 0xf; 223 224 /* handle if never test done */ 225 if (++counter > 10000) { 226 dev_err(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, cycle_3 %d, monitor 0x%x\n", 227 __func__, 228 cycle_1, cycle_2, cycle_3, monitor); 229 mtkaif_calib_ok = false; 230 break; 231 } 232 } 233 234 if (phase == 0) { 235 prev_cycle_1 = cycle_1; 236 prev_cycle_2 = cycle_2; 237 prev_cycle_3 = cycle_3; 238 } 239 240 if (cycle_1 != prev_cycle_1 && 241 afe_priv->mtkaif_chosen_phase[0] < 0) { 242 afe_priv->mtkaif_chosen_phase[0] = phase - 1; 243 afe_priv->mtkaif_phase_cycle[0] = prev_cycle_1; 244 } 245 246 if (cycle_2 != prev_cycle_2 && 247 afe_priv->mtkaif_chosen_phase[1] < 0) { 248 afe_priv->mtkaif_chosen_phase[1] = phase - 1; 249 afe_priv->mtkaif_phase_cycle[1] = prev_cycle_2; 250 } 251 252 if (cycle_3 != prev_cycle_3 && 253 afe_priv->mtkaif_chosen_phase[2] < 0) { 254 afe_priv->mtkaif_chosen_phase[2] = phase - 1; 255 afe_priv->mtkaif_phase_cycle[2] = prev_cycle_3; 256 } 257 258 regmap_update_bits(afe_priv->topckgen, 259 CKSYS_AUD_TOP_CFG, 0x1, 0x0); 260 261 if (afe_priv->mtkaif_chosen_phase[0] >= 0 && 262 afe_priv->mtkaif_chosen_phase[1] >= 0 && 263 afe_priv->mtkaif_chosen_phase[2] >= 0) 264 break; 265 } 266 267 if (afe_priv->mtkaif_chosen_phase[0] < 0) 268 chosen_phase_1 = 0; 269 else 270 chosen_phase_1 = afe_priv->mtkaif_chosen_phase[0]; 271 272 if (afe_priv->mtkaif_chosen_phase[1] < 0) 273 chosen_phase_2 = 0; 274 else 275 chosen_phase_2 = afe_priv->mtkaif_chosen_phase[1]; 276 277 if (afe_priv->mtkaif_chosen_phase[2] < 0) 278 chosen_phase_3 = 0; 279 else 280 chosen_phase_3 = afe_priv->mtkaif_chosen_phase[2]; 281 282 mt6359_set_mtkaif_calibration_phase(cmpnt_codec, 283 chosen_phase_1, 284 chosen_phase_2, 285 chosen_phase_3); 286 287 /* disable rx fifo */ 288 regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x38); 289 290 mt6359_mtkaif_calibration_disable(cmpnt_codec); 291 292 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 1); 293 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 0); 294 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34, 1); 295 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34, 0); 296 pm_runtime_put(afe->dev); 297 298 dev_dbg(afe->dev, "%s(), mtkaif_chosen_phase[0/1/2]:%d/%d/%d\n", 299 __func__, 300 afe_priv->mtkaif_chosen_phase[0], 301 afe_priv->mtkaif_chosen_phase[1], 302 afe_priv->mtkaif_chosen_phase[2]); 303 304 return 0; 305 } 306 307 static int mt8192_mt6359_init(struct snd_soc_pcm_runtime *rtd) 308 { 309 struct snd_soc_component *cmpnt_afe = 310 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); 311 struct snd_soc_component *cmpnt_codec = 312 snd_soc_rtd_to_codec(rtd, 0)->component; 313 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe); 314 struct mt8192_afe_private *afe_priv = afe->platform_priv; 315 316 /* set mtkaif protocol */ 317 mt6359_set_mtkaif_protocol(cmpnt_codec, 318 MT6359_MTKAIF_PROTOCOL_2_CLK_P2); 319 afe_priv->mtkaif_protocol = MTKAIF_PROTOCOL_2_CLK_P2; 320 321 /* mtkaif calibration */ 322 mt8192_mt6359_mtkaif_calibration(rtd); 323 324 return 0; 325 } 326 327 static int mt8192_rt5682_init(struct snd_soc_pcm_runtime *rtd) 328 { 329 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card); 330 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8192_JACK_HEADSET]; 331 struct snd_soc_component *cmpnt_afe = 332 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); 333 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe); 334 struct snd_soc_component *cmpnt_codec = 335 snd_soc_rtd_to_codec(rtd, 0)->component; 336 int ret; 337 338 ret = mt8192_dai_i2s_set_share(afe, "I2S8", "I2S9"); 339 if (ret) { 340 dev_err(rtd->dev, "Failed to set up shared clocks\n"); 341 return ret; 342 } 343 344 ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack", 345 SND_JACK_HEADSET | SND_JACK_BTN_0 | 346 SND_JACK_BTN_1 | SND_JACK_BTN_2 | 347 SND_JACK_BTN_3, 348 jack, mt8192_jack_pins, 349 ARRAY_SIZE(mt8192_jack_pins)); 350 if (ret) { 351 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret); 352 return ret; 353 } 354 355 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); 356 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND); 357 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP); 358 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN); 359 360 return snd_soc_component_set_jack(cmpnt_codec, jack, NULL); 361 }; 362 363 static int mt8192_mt6359_hdmi_init(struct snd_soc_pcm_runtime *rtd) 364 { 365 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card); 366 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8192_JACK_HDMI]; 367 struct snd_soc_component *cmpnt_codec = 368 snd_soc_rtd_to_codec(rtd, 0)->component; 369 int ret; 370 371 ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, jack); 372 if (ret) { 373 dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret); 374 return ret; 375 } 376 377 return snd_soc_component_set_jack(cmpnt_codec, jack, NULL); 378 } 379 380 static int mt8192_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, 381 struct snd_pcm_hw_params *params) 382 { 383 /* fix BE i2s format to S24_LE, clean param mask first */ 384 snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT), 385 0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST); 386 387 params_set_format(params, SNDRV_PCM_FORMAT_S24_LE); 388 389 return 0; 390 } 391 392 /* FE */ 393 SND_SOC_DAILINK_DEFS(playback1, 394 DAILINK_COMP_ARRAY(COMP_CPU("DL1")), 395 DAILINK_COMP_ARRAY(COMP_DUMMY()), 396 DAILINK_COMP_ARRAY(COMP_EMPTY())); 397 398 SND_SOC_DAILINK_DEFS(playback12, 399 DAILINK_COMP_ARRAY(COMP_CPU("DL12")), 400 DAILINK_COMP_ARRAY(COMP_DUMMY()), 401 DAILINK_COMP_ARRAY(COMP_EMPTY())); 402 403 SND_SOC_DAILINK_DEFS(playback2, 404 DAILINK_COMP_ARRAY(COMP_CPU("DL2")), 405 DAILINK_COMP_ARRAY(COMP_DUMMY()), 406 DAILINK_COMP_ARRAY(COMP_EMPTY())); 407 408 SND_SOC_DAILINK_DEFS(playback3, 409 DAILINK_COMP_ARRAY(COMP_CPU("DL3")), 410 DAILINK_COMP_ARRAY(COMP_DUMMY()), 411 DAILINK_COMP_ARRAY(COMP_EMPTY())); 412 413 SND_SOC_DAILINK_DEFS(playback4, 414 DAILINK_COMP_ARRAY(COMP_CPU("DL4")), 415 DAILINK_COMP_ARRAY(COMP_DUMMY()), 416 DAILINK_COMP_ARRAY(COMP_EMPTY())); 417 418 SND_SOC_DAILINK_DEFS(playback5, 419 DAILINK_COMP_ARRAY(COMP_CPU("DL5")), 420 DAILINK_COMP_ARRAY(COMP_DUMMY()), 421 DAILINK_COMP_ARRAY(COMP_EMPTY())); 422 423 SND_SOC_DAILINK_DEFS(playback6, 424 DAILINK_COMP_ARRAY(COMP_CPU("DL6")), 425 DAILINK_COMP_ARRAY(COMP_DUMMY()), 426 DAILINK_COMP_ARRAY(COMP_EMPTY())); 427 428 SND_SOC_DAILINK_DEFS(playback7, 429 DAILINK_COMP_ARRAY(COMP_CPU("DL7")), 430 DAILINK_COMP_ARRAY(COMP_DUMMY()), 431 DAILINK_COMP_ARRAY(COMP_EMPTY())); 432 433 SND_SOC_DAILINK_DEFS(playback8, 434 DAILINK_COMP_ARRAY(COMP_CPU("DL8")), 435 DAILINK_COMP_ARRAY(COMP_DUMMY()), 436 DAILINK_COMP_ARRAY(COMP_EMPTY())); 437 438 SND_SOC_DAILINK_DEFS(playback9, 439 DAILINK_COMP_ARRAY(COMP_CPU("DL9")), 440 DAILINK_COMP_ARRAY(COMP_DUMMY()), 441 DAILINK_COMP_ARRAY(COMP_EMPTY())); 442 443 SND_SOC_DAILINK_DEFS(capture1, 444 DAILINK_COMP_ARRAY(COMP_CPU("UL1")), 445 DAILINK_COMP_ARRAY(COMP_DUMMY()), 446 DAILINK_COMP_ARRAY(COMP_EMPTY())); 447 448 SND_SOC_DAILINK_DEFS(capture2, 449 DAILINK_COMP_ARRAY(COMP_CPU("UL2")), 450 DAILINK_COMP_ARRAY(COMP_DUMMY()), 451 DAILINK_COMP_ARRAY(COMP_EMPTY())); 452 453 SND_SOC_DAILINK_DEFS(capture3, 454 DAILINK_COMP_ARRAY(COMP_CPU("UL3")), 455 DAILINK_COMP_ARRAY(COMP_DUMMY()), 456 DAILINK_COMP_ARRAY(COMP_EMPTY())); 457 458 SND_SOC_DAILINK_DEFS(capture4, 459 DAILINK_COMP_ARRAY(COMP_CPU("UL4")), 460 DAILINK_COMP_ARRAY(COMP_DUMMY()), 461 DAILINK_COMP_ARRAY(COMP_EMPTY())); 462 463 SND_SOC_DAILINK_DEFS(capture5, 464 DAILINK_COMP_ARRAY(COMP_CPU("UL5")), 465 DAILINK_COMP_ARRAY(COMP_DUMMY()), 466 DAILINK_COMP_ARRAY(COMP_EMPTY())); 467 468 SND_SOC_DAILINK_DEFS(capture6, 469 DAILINK_COMP_ARRAY(COMP_CPU("UL6")), 470 DAILINK_COMP_ARRAY(COMP_DUMMY()), 471 DAILINK_COMP_ARRAY(COMP_EMPTY())); 472 473 SND_SOC_DAILINK_DEFS(capture7, 474 DAILINK_COMP_ARRAY(COMP_CPU("UL7")), 475 DAILINK_COMP_ARRAY(COMP_DUMMY()), 476 DAILINK_COMP_ARRAY(COMP_EMPTY())); 477 478 SND_SOC_DAILINK_DEFS(capture8, 479 DAILINK_COMP_ARRAY(COMP_CPU("UL8")), 480 DAILINK_COMP_ARRAY(COMP_DUMMY()), 481 DAILINK_COMP_ARRAY(COMP_EMPTY())); 482 483 SND_SOC_DAILINK_DEFS(capture_mono1, 484 DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_1")), 485 DAILINK_COMP_ARRAY(COMP_DUMMY()), 486 DAILINK_COMP_ARRAY(COMP_EMPTY())); 487 488 SND_SOC_DAILINK_DEFS(capture_mono2, 489 DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_2")), 490 DAILINK_COMP_ARRAY(COMP_DUMMY()), 491 DAILINK_COMP_ARRAY(COMP_EMPTY())); 492 493 SND_SOC_DAILINK_DEFS(capture_mono3, 494 DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_3")), 495 DAILINK_COMP_ARRAY(COMP_DUMMY()), 496 DAILINK_COMP_ARRAY(COMP_EMPTY())); 497 498 SND_SOC_DAILINK_DEFS(playback_hdmi, 499 DAILINK_COMP_ARRAY(COMP_CPU("HDMI")), 500 DAILINK_COMP_ARRAY(COMP_DUMMY()), 501 DAILINK_COMP_ARRAY(COMP_EMPTY())); 502 503 /* BE */ 504 SND_SOC_DAILINK_DEFS(primary_codec, 505 DAILINK_COMP_ARRAY(COMP_CPU("ADDA")), 506 DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound", 507 "mt6359-snd-codec-aif1"), 508 COMP_CODEC("dmic-codec", 509 "dmic-hifi")), 510 DAILINK_COMP_ARRAY(COMP_EMPTY())); 511 512 SND_SOC_DAILINK_DEFS(primary_codec_ch34, 513 DAILINK_COMP_ARRAY(COMP_CPU("ADDA_CH34")), 514 DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound", 515 "mt6359-snd-codec-aif2")), 516 DAILINK_COMP_ARRAY(COMP_EMPTY())); 517 518 SND_SOC_DAILINK_DEFS(ap_dmic, 519 DAILINK_COMP_ARRAY(COMP_CPU("AP_DMIC")), 520 DAILINK_COMP_ARRAY(COMP_DUMMY()), 521 DAILINK_COMP_ARRAY(COMP_EMPTY())); 522 523 SND_SOC_DAILINK_DEFS(ap_dmic_ch34, 524 DAILINK_COMP_ARRAY(COMP_CPU("AP_DMIC_CH34")), 525 DAILINK_COMP_ARRAY(COMP_DUMMY()), 526 DAILINK_COMP_ARRAY(COMP_EMPTY())); 527 528 SND_SOC_DAILINK_DEFS(i2s0, 529 DAILINK_COMP_ARRAY(COMP_CPU("I2S0")), 530 DAILINK_COMP_ARRAY(COMP_DUMMY()), 531 DAILINK_COMP_ARRAY(COMP_EMPTY())); 532 533 SND_SOC_DAILINK_DEFS(i2s1, 534 DAILINK_COMP_ARRAY(COMP_CPU("I2S1")), 535 DAILINK_COMP_ARRAY(COMP_DUMMY()), 536 DAILINK_COMP_ARRAY(COMP_EMPTY())); 537 538 SND_SOC_DAILINK_DEFS(i2s2, 539 DAILINK_COMP_ARRAY(COMP_CPU("I2S2")), 540 DAILINK_COMP_ARRAY(COMP_DUMMY()), 541 DAILINK_COMP_ARRAY(COMP_EMPTY())); 542 543 SND_SOC_DAILINK_DEFS(i2s3, 544 DAILINK_COMP_ARRAY(COMP_CPU("I2S3")), 545 DAILINK_COMP_ARRAY(COMP_EMPTY()), 546 DAILINK_COMP_ARRAY(COMP_EMPTY())); 547 548 SND_SOC_DAILINK_DEFS(i2s5, 549 DAILINK_COMP_ARRAY(COMP_CPU("I2S5")), 550 DAILINK_COMP_ARRAY(COMP_DUMMY()), 551 DAILINK_COMP_ARRAY(COMP_EMPTY())); 552 553 SND_SOC_DAILINK_DEFS(i2s6, 554 DAILINK_COMP_ARRAY(COMP_CPU("I2S6")), 555 DAILINK_COMP_ARRAY(COMP_DUMMY()), 556 DAILINK_COMP_ARRAY(COMP_EMPTY())); 557 558 SND_SOC_DAILINK_DEFS(i2s7, 559 DAILINK_COMP_ARRAY(COMP_CPU("I2S7")), 560 DAILINK_COMP_ARRAY(COMP_DUMMY()), 561 DAILINK_COMP_ARRAY(COMP_EMPTY())); 562 563 SND_SOC_DAILINK_DEFS(i2s8, 564 DAILINK_COMP_ARRAY(COMP_CPU("I2S8")), 565 DAILINK_COMP_ARRAY(COMP_EMPTY()), 566 DAILINK_COMP_ARRAY(COMP_EMPTY())); 567 568 SND_SOC_DAILINK_DEFS(i2s9, 569 DAILINK_COMP_ARRAY(COMP_CPU("I2S9")), 570 DAILINK_COMP_ARRAY(COMP_EMPTY()), 571 DAILINK_COMP_ARRAY(COMP_EMPTY())); 572 573 SND_SOC_DAILINK_DEFS(connsys_i2s, 574 DAILINK_COMP_ARRAY(COMP_CPU("CONNSYS_I2S")), 575 DAILINK_COMP_ARRAY(COMP_DUMMY()), 576 DAILINK_COMP_ARRAY(COMP_EMPTY())); 577 578 SND_SOC_DAILINK_DEFS(pcm1, 579 DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")), 580 DAILINK_COMP_ARRAY(COMP_DUMMY()), 581 DAILINK_COMP_ARRAY(COMP_EMPTY())); 582 583 SND_SOC_DAILINK_DEFS(pcm2, 584 DAILINK_COMP_ARRAY(COMP_CPU("PCM 2")), 585 DAILINK_COMP_ARRAY(COMP_DUMMY()), 586 DAILINK_COMP_ARRAY(COMP_EMPTY())); 587 588 SND_SOC_DAILINK_DEFS(tdm, 589 DAILINK_COMP_ARRAY(COMP_CPU("TDM")), 590 DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "i2s-hifi")), 591 DAILINK_COMP_ARRAY(COMP_EMPTY())); 592 593 static struct snd_soc_dai_link mt8192_mt6359_dai_links[] = { 594 /* Front End DAI links */ 595 { 596 .name = "Playback_1", 597 .stream_name = "Playback_1", 598 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 599 SND_SOC_DPCM_TRIGGER_PRE}, 600 .dynamic = 1, 601 .dpcm_playback = 1, 602 SND_SOC_DAILINK_REG(playback1), 603 }, 604 { 605 .name = "Playback_12", 606 .stream_name = "Playback_12", 607 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 608 SND_SOC_DPCM_TRIGGER_PRE}, 609 .dynamic = 1, 610 .dpcm_playback = 1, 611 SND_SOC_DAILINK_REG(playback12), 612 }, 613 { 614 .name = "Playback_2", 615 .stream_name = "Playback_2", 616 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 617 SND_SOC_DPCM_TRIGGER_PRE}, 618 .dynamic = 1, 619 .dpcm_playback = 1, 620 SND_SOC_DAILINK_REG(playback2), 621 }, 622 { 623 .name = "Playback_3", 624 .stream_name = "Playback_3", 625 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 626 SND_SOC_DPCM_TRIGGER_PRE}, 627 .dynamic = 1, 628 .dpcm_playback = 1, 629 .ops = &mtk_soundcard_common_playback_ops, 630 SND_SOC_DAILINK_REG(playback3), 631 }, 632 { 633 .name = "Playback_4", 634 .stream_name = "Playback_4", 635 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 636 SND_SOC_DPCM_TRIGGER_PRE}, 637 .dynamic = 1, 638 .dpcm_playback = 1, 639 SND_SOC_DAILINK_REG(playback4), 640 }, 641 { 642 .name = "Playback_5", 643 .stream_name = "Playback_5", 644 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 645 SND_SOC_DPCM_TRIGGER_PRE}, 646 .dynamic = 1, 647 .dpcm_playback = 1, 648 SND_SOC_DAILINK_REG(playback5), 649 }, 650 { 651 .name = "Playback_6", 652 .stream_name = "Playback_6", 653 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 654 SND_SOC_DPCM_TRIGGER_PRE}, 655 .dynamic = 1, 656 .dpcm_playback = 1, 657 SND_SOC_DAILINK_REG(playback6), 658 }, 659 { 660 .name = "Playback_7", 661 .stream_name = "Playback_7", 662 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 663 SND_SOC_DPCM_TRIGGER_PRE}, 664 .dynamic = 1, 665 .dpcm_playback = 1, 666 SND_SOC_DAILINK_REG(playback7), 667 }, 668 { 669 .name = "Playback_8", 670 .stream_name = "Playback_8", 671 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 672 SND_SOC_DPCM_TRIGGER_PRE}, 673 .dynamic = 1, 674 .dpcm_playback = 1, 675 SND_SOC_DAILINK_REG(playback8), 676 }, 677 { 678 .name = "Playback_9", 679 .stream_name = "Playback_9", 680 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 681 SND_SOC_DPCM_TRIGGER_PRE}, 682 .dynamic = 1, 683 .dpcm_playback = 1, 684 SND_SOC_DAILINK_REG(playback9), 685 }, 686 { 687 .name = "Capture_1", 688 .stream_name = "Capture_1", 689 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 690 SND_SOC_DPCM_TRIGGER_PRE}, 691 .dynamic = 1, 692 .dpcm_capture = 1, 693 .ops = &mtk_soundcard_common_capture_ops, 694 SND_SOC_DAILINK_REG(capture1), 695 }, 696 { 697 .name = "Capture_2", 698 .stream_name = "Capture_2", 699 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 700 SND_SOC_DPCM_TRIGGER_PRE}, 701 .dynamic = 1, 702 .dpcm_capture = 1, 703 .ops = &mtk_soundcard_common_playback_ops, 704 SND_SOC_DAILINK_REG(capture2), 705 }, 706 { 707 .name = "Capture_3", 708 .stream_name = "Capture_3", 709 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 710 SND_SOC_DPCM_TRIGGER_PRE}, 711 .dynamic = 1, 712 .dpcm_capture = 1, 713 SND_SOC_DAILINK_REG(capture3), 714 }, 715 { 716 .name = "Capture_4", 717 .stream_name = "Capture_4", 718 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 719 SND_SOC_DPCM_TRIGGER_PRE}, 720 .dynamic = 1, 721 .dpcm_capture = 1, 722 SND_SOC_DAILINK_REG(capture4), 723 }, 724 { 725 .name = "Capture_5", 726 .stream_name = "Capture_5", 727 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 728 SND_SOC_DPCM_TRIGGER_PRE}, 729 .dynamic = 1, 730 .dpcm_capture = 1, 731 SND_SOC_DAILINK_REG(capture5), 732 }, 733 { 734 .name = "Capture_6", 735 .stream_name = "Capture_6", 736 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 737 SND_SOC_DPCM_TRIGGER_PRE}, 738 .dynamic = 1, 739 .dpcm_capture = 1, 740 SND_SOC_DAILINK_REG(capture6), 741 }, 742 { 743 .name = "Capture_7", 744 .stream_name = "Capture_7", 745 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 746 SND_SOC_DPCM_TRIGGER_PRE}, 747 .dynamic = 1, 748 .dpcm_capture = 1, 749 SND_SOC_DAILINK_REG(capture7), 750 }, 751 { 752 .name = "Capture_8", 753 .stream_name = "Capture_8", 754 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 755 SND_SOC_DPCM_TRIGGER_PRE}, 756 .dynamic = 1, 757 .dpcm_capture = 1, 758 SND_SOC_DAILINK_REG(capture8), 759 }, 760 { 761 .name = "Capture_Mono_1", 762 .stream_name = "Capture_Mono_1", 763 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 764 SND_SOC_DPCM_TRIGGER_PRE}, 765 .dynamic = 1, 766 .dpcm_capture = 1, 767 SND_SOC_DAILINK_REG(capture_mono1), 768 }, 769 { 770 .name = "Capture_Mono_2", 771 .stream_name = "Capture_Mono_2", 772 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 773 SND_SOC_DPCM_TRIGGER_PRE}, 774 .dynamic = 1, 775 .dpcm_capture = 1, 776 SND_SOC_DAILINK_REG(capture_mono2), 777 }, 778 { 779 .name = "Capture_Mono_3", 780 .stream_name = "Capture_Mono_3", 781 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 782 SND_SOC_DPCM_TRIGGER_PRE}, 783 .dynamic = 1, 784 .dpcm_capture = 1, 785 SND_SOC_DAILINK_REG(capture_mono3), 786 }, 787 { 788 .name = "playback_hdmi", 789 .stream_name = "Playback_HDMI", 790 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 791 SND_SOC_DPCM_TRIGGER_PRE}, 792 .dynamic = 1, 793 .dpcm_playback = 1, 794 SND_SOC_DAILINK_REG(playback_hdmi), 795 }, 796 /* Back End DAI links */ 797 { 798 .name = "Primary Codec", 799 .no_pcm = 1, 800 .dpcm_playback = 1, 801 .dpcm_capture = 1, 802 .ignore_suspend = 1, 803 .init = mt8192_mt6359_init, 804 SND_SOC_DAILINK_REG(primary_codec), 805 }, 806 { 807 .name = "Primary Codec CH34", 808 .no_pcm = 1, 809 .dpcm_playback = 1, 810 .dpcm_capture = 1, 811 .ignore_suspend = 1, 812 SND_SOC_DAILINK_REG(primary_codec_ch34), 813 }, 814 { 815 .name = "AP_DMIC", 816 .no_pcm = 1, 817 .dpcm_capture = 1, 818 .ignore_suspend = 1, 819 SND_SOC_DAILINK_REG(ap_dmic), 820 }, 821 { 822 .name = "AP_DMIC_CH34", 823 .no_pcm = 1, 824 .dpcm_capture = 1, 825 .ignore_suspend = 1, 826 SND_SOC_DAILINK_REG(ap_dmic_ch34), 827 }, 828 { 829 .name = "I2S0", 830 .no_pcm = 1, 831 .dpcm_capture = 1, 832 .ignore_suspend = 1, 833 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup, 834 SND_SOC_DAILINK_REG(i2s0), 835 }, 836 { 837 .name = "I2S1", 838 .no_pcm = 1, 839 .dpcm_playback = 1, 840 .ignore_suspend = 1, 841 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup, 842 SND_SOC_DAILINK_REG(i2s1), 843 }, 844 { 845 .name = "I2S2", 846 .no_pcm = 1, 847 .dpcm_capture = 1, 848 .ignore_suspend = 1, 849 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup, 850 SND_SOC_DAILINK_REG(i2s2), 851 }, 852 { 853 .name = "I2S3", 854 .no_pcm = 1, 855 .dpcm_playback = 1, 856 .ignore_suspend = 1, 857 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup, 858 SND_SOC_DAILINK_REG(i2s3), 859 }, 860 { 861 .name = "I2S5", 862 .no_pcm = 1, 863 .dpcm_playback = 1, 864 .ignore_suspend = 1, 865 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup, 866 SND_SOC_DAILINK_REG(i2s5), 867 }, 868 { 869 .name = "I2S6", 870 .no_pcm = 1, 871 .dpcm_capture = 1, 872 .ignore_suspend = 1, 873 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup, 874 SND_SOC_DAILINK_REG(i2s6), 875 }, 876 { 877 .name = "I2S7", 878 .no_pcm = 1, 879 .dpcm_playback = 1, 880 .ignore_suspend = 1, 881 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup, 882 SND_SOC_DAILINK_REG(i2s7), 883 }, 884 { 885 .name = "I2S8", 886 .no_pcm = 1, 887 .dpcm_capture = 1, 888 .ignore_suspend = 1, 889 .init = mt8192_rt5682_init, 890 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup, 891 SND_SOC_DAILINK_REG(i2s8), 892 .ops = &mt8192_rt5682x_i2s_ops, 893 }, 894 { 895 .name = "I2S9", 896 .no_pcm = 1, 897 .dpcm_playback = 1, 898 .ignore_suspend = 1, 899 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup, 900 SND_SOC_DAILINK_REG(i2s9), 901 .ops = &mt8192_rt5682x_i2s_ops, 902 }, 903 { 904 .name = "CONNSYS_I2S", 905 .no_pcm = 1, 906 .dpcm_capture = 1, 907 .ignore_suspend = 1, 908 SND_SOC_DAILINK_REG(connsys_i2s), 909 }, 910 { 911 .name = "PCM 1", 912 .no_pcm = 1, 913 .dpcm_playback = 1, 914 .dpcm_capture = 1, 915 .ignore_suspend = 1, 916 SND_SOC_DAILINK_REG(pcm1), 917 }, 918 { 919 .name = "PCM 2", 920 .no_pcm = 1, 921 .dpcm_playback = 1, 922 .dpcm_capture = 1, 923 .ignore_suspend = 1, 924 SND_SOC_DAILINK_REG(pcm2), 925 }, 926 { 927 .name = "TDM", 928 .no_pcm = 1, 929 .dai_fmt = SND_SOC_DAIFMT_DSP_A | 930 SND_SOC_DAIFMT_IB_NF | 931 SND_SOC_DAIFMT_CBM_CFM, 932 .dpcm_playback = 1, 933 .ignore_suspend = 1, 934 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup, 935 .ignore = 1, 936 .init = mt8192_mt6359_hdmi_init, 937 SND_SOC_DAILINK_REG(tdm), 938 }, 939 }; 940 941 static const struct snd_soc_dapm_widget 942 mt8192_mt6359_rt1015_rt5682_widgets[] = { 943 SND_SOC_DAPM_SPK("Left Spk", NULL), 944 SND_SOC_DAPM_SPK("Right Spk", NULL), 945 SND_SOC_DAPM_HP("Headphone Jack", NULL), 946 SND_SOC_DAPM_MIC("Headset Mic", NULL), 947 SND_SOC_DAPM_OUTPUT("TDM Out"), 948 }; 949 950 static const struct snd_soc_dapm_route mt8192_mt6359_rt1015_rt5682_routes[] = { 951 /* speaker */ 952 { "Left Spk", NULL, "Left SPO" }, 953 { "Right Spk", NULL, "Right SPO" }, 954 /* headset */ 955 { "Headphone Jack", NULL, "HPOL" }, 956 { "Headphone Jack", NULL, "HPOR" }, 957 { "IN1P", NULL, "Headset Mic" }, 958 /* TDM */ 959 { "TDM Out", NULL, "TDM" }, 960 }; 961 962 static const struct snd_kcontrol_new mt8192_mt6359_rt1015_rt5682_controls[] = { 963 SOC_DAPM_PIN_SWITCH("Left Spk"), 964 SOC_DAPM_PIN_SWITCH("Right Spk"), 965 SOC_DAPM_PIN_SWITCH("Headphone Jack"), 966 SOC_DAPM_PIN_SWITCH("Headset Mic"), 967 }; 968 969 static struct snd_soc_codec_conf rt1015_amp_conf[] = { 970 { 971 .dlc = COMP_CODEC_CONF(RT1015_DEV0_NAME), 972 .name_prefix = "Left", 973 }, 974 { 975 .dlc = COMP_CODEC_CONF(RT1015_DEV1_NAME), 976 .name_prefix = "Right", 977 }, 978 }; 979 980 static struct snd_soc_card mt8192_mt6359_rt1015_rt5682_card = { 981 .name = RT1015_RT5682_CARD_NAME, 982 .driver_name = DRIVER_NAME, 983 .owner = THIS_MODULE, 984 .dai_link = mt8192_mt6359_dai_links, 985 .num_links = ARRAY_SIZE(mt8192_mt6359_dai_links), 986 .controls = mt8192_mt6359_rt1015_rt5682_controls, 987 .num_controls = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_controls), 988 .dapm_widgets = mt8192_mt6359_rt1015_rt5682_widgets, 989 .num_dapm_widgets = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_widgets), 990 .dapm_routes = mt8192_mt6359_rt1015_rt5682_routes, 991 .num_dapm_routes = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_routes), 992 .codec_conf = rt1015_amp_conf, 993 .num_configs = ARRAY_SIZE(rt1015_amp_conf), 994 }; 995 996 static const struct snd_soc_dapm_widget mt8192_mt6359_rt1015p_rt5682x_widgets[] = { 997 SND_SOC_DAPM_SPK("Speakers", NULL), 998 SND_SOC_DAPM_HP("Headphone Jack", NULL), 999 SND_SOC_DAPM_MIC("Headset Mic", NULL), 1000 }; 1001 1002 static const struct snd_soc_dapm_route mt8192_mt6359_rt1015p_rt5682x_routes[] = { 1003 /* speaker */ 1004 { "Speakers", NULL, "Speaker" }, 1005 /* headset */ 1006 { "Headphone Jack", NULL, "HPOL" }, 1007 { "Headphone Jack", NULL, "HPOR" }, 1008 { "IN1P", NULL, "Headset Mic" }, 1009 }; 1010 1011 static const struct snd_kcontrol_new mt8192_mt6359_rt1015p_rt5682x_controls[] = { 1012 SOC_DAPM_PIN_SWITCH("Speakers"), 1013 SOC_DAPM_PIN_SWITCH("Headphone Jack"), 1014 SOC_DAPM_PIN_SWITCH("Headset Mic"), 1015 }; 1016 1017 static struct snd_soc_card mt8192_mt6359_rt1015p_rt5682x_card = { 1018 .driver_name = DRIVER_NAME, 1019 .owner = THIS_MODULE, 1020 .dai_link = mt8192_mt6359_dai_links, 1021 .num_links = ARRAY_SIZE(mt8192_mt6359_dai_links), 1022 .controls = mt8192_mt6359_rt1015p_rt5682x_controls, 1023 .num_controls = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_controls), 1024 .dapm_widgets = mt8192_mt6359_rt1015p_rt5682x_widgets, 1025 .num_dapm_widgets = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_widgets), 1026 .dapm_routes = mt8192_mt6359_rt1015p_rt5682x_routes, 1027 .num_dapm_routes = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_routes), 1028 }; 1029 1030 static int mt8192_mt6359_card_set_be_link(struct snd_soc_card *card, 1031 struct snd_soc_dai_link *link, 1032 struct device_node *node, 1033 char *link_name) 1034 { 1035 int ret; 1036 1037 if (node && strcmp(link->name, link_name) == 0) { 1038 ret = snd_soc_of_get_dai_link_codecs(card->dev, node, link); 1039 if (ret < 0) { 1040 dev_err_probe(card->dev, ret, "get dai link codecs fail\n"); 1041 return ret; 1042 } 1043 } 1044 1045 return 0; 1046 } 1047 1048 static int mt8192_mt6359_legacy_probe(struct mtk_soc_card_data *soc_card_data) 1049 { 1050 struct mtk_platform_card_data *card_data = soc_card_data->card_data; 1051 struct snd_soc_card *card = card_data->card; 1052 struct device *dev = card->dev; 1053 struct device_node *hdmi_codec, *headset_codec, *speaker_codec; 1054 struct snd_soc_dai_link *dai_link; 1055 int i, ret = 0; 1056 1057 hdmi_codec = of_parse_phandle(dev->of_node, "mediatek,hdmi-codec", 0); 1058 if (!hdmi_codec) 1059 dev_dbg(dev, "The machine has no hdmi-codec\n"); 1060 1061 speaker_codec = of_get_child_by_name(dev->of_node, "speaker-codecs"); 1062 if (!speaker_codec) { 1063 ret = -EINVAL; 1064 dev_err_probe(dev, ret, "Property 'speaker-codecs' missing or invalid\n"); 1065 goto err_speaker_codec; 1066 } 1067 1068 headset_codec = of_get_child_by_name(dev->of_node, "headset-codec"); 1069 if (!headset_codec) { 1070 ret = -EINVAL; 1071 dev_err_probe(dev, ret, "Property 'headset-codec' missing or invalid\n"); 1072 goto err_headset_codec; 1073 } 1074 1075 for_each_card_prelinks(card, i, dai_link) { 1076 ret = mt8192_mt6359_card_set_be_link(card, dai_link, speaker_codec, "I2S3"); 1077 if (ret) { 1078 dev_err_probe(dev, ret, "%s set speaker_codec fail\n", 1079 dai_link->name); 1080 break; 1081 } 1082 1083 ret = mt8192_mt6359_card_set_be_link(card, dai_link, headset_codec, "I2S8"); 1084 if (ret) { 1085 dev_err_probe(dev, ret, "%s set headset_codec fail\n", 1086 dai_link->name); 1087 break; 1088 } 1089 1090 ret = mt8192_mt6359_card_set_be_link(card, dai_link, headset_codec, "I2S9"); 1091 if (ret) { 1092 dev_err_probe(dev, ret, "%s set headset_codec fail\n", 1093 dai_link->name); 1094 break; 1095 } 1096 1097 if (hdmi_codec && strcmp(dai_link->name, "TDM") == 0) { 1098 dai_link->codecs->of_node = hdmi_codec; 1099 dai_link->ignore = 0; 1100 } 1101 1102 if (dai_link->num_codecs && dai_link->codecs[0].dai_name && 1103 strcmp(dai_link->codecs[0].dai_name, RT1015_CODEC_DAI) == 0) 1104 dai_link->ops = &mt8192_rt1015_i2s_ops; 1105 } 1106 1107 of_node_put(headset_codec); 1108 err_headset_codec: 1109 of_node_put(speaker_codec); 1110 err_speaker_codec: 1111 if (hdmi_codec) 1112 of_node_put(hdmi_codec); 1113 1114 return ret; 1115 } 1116 1117 static int mt8192_mt6359_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy) 1118 { 1119 struct mtk_platform_card_data *card_data = soc_card_data->card_data; 1120 struct snd_soc_card *card = card_data->card; 1121 int ret; 1122 1123 if (legacy) { 1124 ret = mt8192_mt6359_legacy_probe(soc_card_data); 1125 if (ret) 1126 return ret; 1127 } else { 1128 struct snd_soc_dai_link *dai_link; 1129 int i; 1130 1131 for_each_card_prelinks(card, i, dai_link) 1132 if (dai_link->num_codecs && dai_link->codecs[0].dai_name && 1133 strcmp(dai_link->codecs[0].dai_name, RT1015_CODEC_DAI) == 0) 1134 dai_link->ops = &mt8192_rt1015_i2s_ops; 1135 } 1136 1137 ret = mt8192_afe_gpio_init(card->dev); 1138 if (ret) 1139 return dev_err_probe(card->dev, ret, "%s init gpio error\n", __func__); 1140 1141 return 0; 1142 } 1143 1144 static const unsigned int mt8192_pcm_playback_channels[] = { 1, 2 }; 1145 static const unsigned int mt8192_pcm_playback_rates[] = { 48000 }; 1146 1147 static const unsigned int mt8192_pcm_capture_channels[] = { 1, 2, 4 }; 1148 static const unsigned int mt8192_pcm_capture_rates[] = { 1149 8000, 16000, 32000, 48000, 96000, 192000 1150 }; 1151 1152 static const struct mtk_pcm_constraints_data mt8192_pcm_constraints[MTK_CONSTRAINT_CAPTURE + 1] = { 1153 [MTK_CONSTRAINT_PLAYBACK] = { 1154 .channels = &(const struct snd_pcm_hw_constraint_list) { 1155 .list = mt8192_pcm_playback_channels, 1156 .count = ARRAY_SIZE(mt8192_pcm_playback_channels) 1157 }, 1158 .rates = &(const struct snd_pcm_hw_constraint_list) { 1159 .list = mt8192_pcm_playback_rates, 1160 .count = ARRAY_SIZE(mt8192_pcm_playback_rates) 1161 } 1162 }, 1163 [MTK_CONSTRAINT_CAPTURE] = { 1164 .channels = &(const struct snd_pcm_hw_constraint_list) { 1165 .list = mt8192_pcm_capture_channels, 1166 .count = ARRAY_SIZE(mt8192_pcm_capture_channels) 1167 }, 1168 .rates = &(const struct snd_pcm_hw_constraint_list) { 1169 .list = mt8192_pcm_capture_rates, 1170 .count = ARRAY_SIZE(mt8192_pcm_capture_rates) 1171 } 1172 } 1173 }; 1174 1175 static const struct mtk_soundcard_pdata mt8192_mt6359_rt1015_rt5682_pdata = { 1176 .card_name = RT1015_RT5682_CARD_NAME, 1177 .card_data = &(struct mtk_platform_card_data) { 1178 .card = &mt8192_mt6359_rt1015_rt5682_card, 1179 .num_jacks = MT8192_JACK_MAX, 1180 .pcm_constraints = mt8192_pcm_constraints, 1181 .num_pcm_constraints = ARRAY_SIZE(mt8192_pcm_constraints), 1182 }, 1183 .soc_probe = mt8192_mt6359_soc_card_probe 1184 }; 1185 1186 static const struct mtk_soundcard_pdata mt8192_mt6359_rt1015p_rt5682_pdata = { 1187 .card_name = RT1015P_RT5682_CARD_NAME, 1188 .card_data = &(struct mtk_platform_card_data) { 1189 .card = &mt8192_mt6359_rt1015p_rt5682x_card, 1190 .num_jacks = MT8192_JACK_MAX, 1191 .pcm_constraints = mt8192_pcm_constraints, 1192 .num_pcm_constraints = ARRAY_SIZE(mt8192_pcm_constraints), 1193 }, 1194 .soc_probe = mt8192_mt6359_soc_card_probe 1195 }; 1196 1197 static const struct mtk_soundcard_pdata mt8192_mt6359_rt1015p_rt5682s_pdata = { 1198 .card_name = RT1015P_RT5682S_CARD_NAME, 1199 .card_data = &(struct mtk_platform_card_data) { 1200 .card = &mt8192_mt6359_rt1015p_rt5682x_card, 1201 .num_jacks = MT8192_JACK_MAX, 1202 .pcm_constraints = mt8192_pcm_constraints, 1203 .num_pcm_constraints = ARRAY_SIZE(mt8192_pcm_constraints), 1204 }, 1205 .soc_probe = mt8192_mt6359_soc_card_probe 1206 }; 1207 1208 #ifdef CONFIG_OF 1209 static const struct of_device_id mt8192_mt6359_dt_match[] = { 1210 { 1211 .compatible = RT1015_RT5682_OF_NAME, 1212 .data = &mt8192_mt6359_rt1015_rt5682_pdata, 1213 }, 1214 { 1215 .compatible = RT1015P_RT5682_OF_NAME, 1216 .data = &mt8192_mt6359_rt1015p_rt5682_pdata, 1217 }, 1218 { 1219 .compatible = RT1015P_RT5682S_OF_NAME, 1220 .data = &mt8192_mt6359_rt1015p_rt5682s_pdata, 1221 }, 1222 {} 1223 }; 1224 MODULE_DEVICE_TABLE(of, mt8192_mt6359_dt_match); 1225 #endif 1226 1227 static const struct dev_pm_ops mt8192_mt6359_pm_ops = { 1228 .poweroff = snd_soc_poweroff, 1229 .restore = snd_soc_resume, 1230 }; 1231 1232 static struct platform_driver mt8192_mt6359_driver = { 1233 .driver = { 1234 .name = DRIVER_NAME, 1235 #ifdef CONFIG_OF 1236 .of_match_table = mt8192_mt6359_dt_match, 1237 #endif 1238 .pm = &mt8192_mt6359_pm_ops, 1239 }, 1240 .probe = mtk_soundcard_common_probe, 1241 }; 1242 1243 module_platform_driver(mt8192_mt6359_driver); 1244 1245 /* Module information */ 1246 MODULE_DESCRIPTION("MT8192-MT6359 ALSA SoC machine driver"); 1247 MODULE_AUTHOR("Jiaxin Yu <jiaxin.yu@mediatek.com>"); 1248 MODULE_LICENSE("GPL v2"); 1249 MODULE_ALIAS("mt8192_mt6359 soc card"); 1250
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.