FILE
mt8195-mt6359.c
File preview with syntax highlighting.
linux-6.19.14/sound/soc/mediatek/mt8195/mt8195-mt6359.c
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * mt8195-mt6359.c -- 4 * MT8195-MT6359 ALSA SoC machine driver code 5 * 6 * Copyright (c) 2022 MediaTek Inc. 7 * Author: Trevor Wu <trevor.wu@mediatek.com> 8 * YC Hung <yc.hung@mediatek.com> 9 */ 10 11#include <linux/input.h> 12#include <linux/module.h> 13#include <linux/of.h> 14#include <linux/pm_runtime.h> 15#include <sound/jack.h> 16#include <sound/pcm_params.h> 17#include <sound/rt5682.h> 18#include <sound/soc.h> 19#include "../../codecs/mt6359.h" 20#include "../../codecs/rt1011.h" 21#include "../../codecs/rt5682.h" 22#include "../common/mtk-afe-platform-driver.h" 23#include "../common/mtk-dsp-sof-common.h" 24#include "../common/mtk-soc-card.h" 25#include "../common/mtk-soundcard-driver.h" 26#include "mt8195-afe-clk.h" 27#include "mt8195-afe-common.h" 28 29#define RT1011_SPEAKER_AMP_PRESENT BIT(0) 30#define RT1019_SPEAKER_AMP_PRESENT BIT(1) 31#define MAX98390_SPEAKER_AMP_PRESENT BIT(2) 32 33#define DUMB_CODEC_INIT BIT(0) 34#define MT6359_CODEC_INIT BIT(1) 35#define RT1011_CODEC_INIT BIT(2) 36#define RT1019_CODEC_INIT BIT(3) 37#define MAX98390_CODEC_INIT BIT(4) 38#define RT5682_CODEC_INIT BIT(5) 39 40#define RT1011_CODEC_DAI "rt1011-aif" 41#define RT1011_DEV0_NAME "rt1011.2-0038" 42#define RT1011_DEV1_NAME "rt1011.2-0039" 43 44#define RT1019_CODEC_DAI "HiFi" 45#define RT1019_DEV0_NAME "rt1019p" 46 47#define MAX98390_CODEC_DAI "max98390-aif1" 48#define MAX98390_DEV0_NAME "max98390.2-0038" /* right */ 49#define MAX98390_DEV1_NAME "max98390.2-0039" /* left */ 50 51#define RT5682_CODEC_DAI "rt5682-aif1" 52#define RT5682_DEV0_NAME "rt5682.2-001a" 53 54#define RT5682S_CODEC_DAI "rt5682s-aif1" 55#define RT5682S_DEV0_NAME "rt5682s.2-001a" 56 57#define SOF_DMA_DL2 "SOF_DMA_DL2" 58#define SOF_DMA_DL3 "SOF_DMA_DL3" 59#define SOF_DMA_UL4 "SOF_DMA_UL4" 60#define SOF_DMA_UL5 "SOF_DMA_UL5" 61 62struct mt8195_mt6359_priv { 63 struct clk *i2so1_mclk; 64}; 65 66enum mt8195_jacks { 67 MT8195_JACK_HEADSET, 68 MT8195_JACK_DP, 69 MT8195_JACK_HDMI, 70 MT8195_JACK_MAX, 71}; 72 73/* Headset jack detection DAPM pins */ 74static struct snd_soc_jack_pin mt8195_jack_pins[] = { 75 { 76 .pin = "Headphone", 77 .mask = SND_JACK_HEADPHONE, 78 }, 79 { 80 .pin = "Headset Mic", 81 .mask = SND_JACK_MICROPHONE, 82 }, 83}; 84 85static const struct snd_soc_dapm_widget mt8195_mt6359_widgets[] = { 86 SND_SOC_DAPM_HP("Headphone", NULL), 87 SND_SOC_DAPM_MIC("Headset Mic", NULL), 88 SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0), 89 SND_SOC_DAPM_MIXER(SOF_DMA_DL3, SND_SOC_NOPM, 0, 0, NULL, 0), 90 SND_SOC_DAPM_MIXER(SOF_DMA_UL4, SND_SOC_NOPM, 0, 0, NULL, 0), 91 SND_SOC_DAPM_MIXER(SOF_DMA_UL5, SND_SOC_NOPM, 0, 0, NULL, 0), 92}; 93 94static const struct snd_soc_dapm_route mt8195_mt6359_routes[] = { 95 /* SOF Uplink */ 96 {SOF_DMA_UL4, NULL, "O034"}, 97 {SOF_DMA_UL4, NULL, "O035"}, 98 {SOF_DMA_UL5, NULL, "O036"}, 99 {SOF_DMA_UL5, NULL, "O037"}, 100 /* SOF Downlink */ 101 {"I070", NULL, SOF_DMA_DL2}, 102 {"I071", NULL, SOF_DMA_DL2}, 103 {"I020", NULL, SOF_DMA_DL3}, 104 {"I021", NULL, SOF_DMA_DL3}, 105}; 106 107static const struct snd_kcontrol_new mt8195_mt6359_controls[] = { 108 SOC_DAPM_PIN_SWITCH("Headphone"), 109 SOC_DAPM_PIN_SWITCH("Headset Mic"), 110}; 111 112static const struct snd_soc_dapm_widget mt8195_dual_speaker_widgets[] = { 113 SND_SOC_DAPM_SPK("Left Spk", NULL), 114 SND_SOC_DAPM_SPK("Right Spk", NULL), 115}; 116 117static const struct snd_kcontrol_new mt8195_dual_speaker_controls[] = { 118 SOC_DAPM_PIN_SWITCH("Left Spk"), 119 SOC_DAPM_PIN_SWITCH("Right Spk"), 120}; 121 122static const struct snd_soc_dapm_widget mt8195_speaker_widgets[] = { 123 SND_SOC_DAPM_SPK("Ext Spk", NULL), 124}; 125 126static const struct snd_kcontrol_new mt8195_speaker_controls[] = { 127 SOC_DAPM_PIN_SWITCH("Ext Spk"), 128}; 129 130static const struct snd_soc_dapm_route mt8195_rt5682_routes[] = { 131 /* headset */ 132 { "Headphone", NULL, "HPOL" }, 133 { "Headphone", NULL, "HPOR" }, 134 { "IN1P", NULL, "Headset Mic" }, 135}; 136 137static const struct snd_soc_dapm_route mt8195_rt1011_routes[] = { 138 { "Left Spk", NULL, "Left SPO" }, 139 { "Right Spk", NULL, "Right SPO" }, 140}; 141 142static const struct snd_soc_dapm_route mt8195_rt1019_routes[] = { 143 { "Ext Spk", NULL, "Speaker" }, 144}; 145 146static const struct snd_soc_dapm_route mt8195_max98390_routes[] = { 147 { "Left Spk", NULL, "Left BE_OUT" }, 148 { "Right Spk", NULL, "Right BE_OUT" }, 149}; 150 151#define CKSYS_AUD_TOP_CFG 0x032c 152#define CKSYS_AUD_TOP_MON 0x0330 153 154static int mt8195_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd) 155{ 156 struct snd_soc_component *cmpnt_afe = 157 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); 158 struct snd_soc_component *cmpnt_codec = 159 snd_soc_rtd_to_codec(rtd, 0)->component; 160 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe); 161 struct mt8195_afe_private *afe_priv = afe->platform_priv; 162 struct mtkaif_param *param = &afe_priv->mtkaif_params; 163 int chosen_phase_1, chosen_phase_2, chosen_phase_3; 164 int prev_cycle_1, prev_cycle_2, prev_cycle_3; 165 int test_done_1, test_done_2, test_done_3; 166 int cycle_1, cycle_2, cycle_3; 167 int mtkaif_chosen_phase[MT8195_MTKAIF_MISO_NUM]; 168 int mtkaif_phase_cycle[MT8195_MTKAIF_MISO_NUM]; 169 int mtkaif_calibration_num_phase; 170 bool mtkaif_calibration_ok; 171 unsigned int monitor = 0; 172 int counter; 173 int phase; 174 int i; 175 176 dev_dbg(afe->dev, "%s(), start\n", __func__); 177 178 param->mtkaif_calibration_ok = false; 179 for (i = 0; i < MT8195_MTKAIF_MISO_NUM; i++) { 180 param->mtkaif_chosen_phase[i] = -1; 181 param->mtkaif_phase_cycle[i] = 0; 182 mtkaif_chosen_phase[i] = -1; 183 mtkaif_phase_cycle[i] = 0; 184 } 185 186 if (IS_ERR(afe_priv->topckgen)) { 187 dev_info(afe->dev, "%s() Cannot find topckgen controller\n", 188 __func__); 189 return 0; 190 } 191 192 pm_runtime_get_sync(afe->dev); 193 mt6359_mtkaif_calibration_enable(cmpnt_codec); 194 195 /* set test type to synchronizer pulse */ 196 regmap_update_bits(afe_priv->topckgen, 197 CKSYS_AUD_TOP_CFG, 0xffff, 0x4); 198 mtkaif_calibration_num_phase = 42; /* mt6359: 0 ~ 42 */ 199 mtkaif_calibration_ok = true; 200 201 for (phase = 0; 202 phase <= mtkaif_calibration_num_phase && mtkaif_calibration_ok; 203 phase++) { 204 mt6359_set_mtkaif_calibration_phase(cmpnt_codec, 205 phase, phase, phase); 206 207 regmap_update_bits(afe_priv->topckgen, 208 CKSYS_AUD_TOP_CFG, 0x1, 0x1); 209 210 test_done_1 = 0; 211 test_done_2 = 0; 212 test_done_3 = 0; 213 cycle_1 = -1; 214 cycle_2 = -1; 215 cycle_3 = -1; 216 counter = 0; 217 while (!(test_done_1 & test_done_2 & test_done_3)) { 218 regmap_read(afe_priv->topckgen, 219 CKSYS_AUD_TOP_MON, &monitor); 220 test_done_1 = (monitor >> 28) & 0x1; 221 test_done_2 = (monitor >> 29) & 0x1; 222 test_done_3 = (monitor >> 30) & 0x1; 223 if (test_done_1 == 1) 224 cycle_1 = monitor & 0xf; 225 226 if (test_done_2 == 1) 227 cycle_2 = (monitor >> 4) & 0xf; 228 229 if (test_done_3 == 1) 230 cycle_3 = (monitor >> 8) & 0xf; 231 232 /* handle if never test done */ 233 if (++counter > 10000) { 234 dev_info(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, cycle_3 %d, monitor 0x%x\n", 235 __func__, 236 cycle_1, cycle_2, cycle_3, monitor); 237 mtkaif_calibration_ok = false; 238 break; 239 } 240 } 241 242 if (phase == 0) { 243 prev_cycle_1 = cycle_1; 244 prev_cycle_2 = cycle_2; 245 prev_cycle_3 = cycle_3; 246 } 247 248 if (cycle_1 != prev_cycle_1 && 249 mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] < 0) { 250 mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] = phase - 1; 251 mtkaif_phase_cycle[MT8195_MTKAIF_MISO_0] = prev_cycle_1; 252 } 253 254 if (cycle_2 != prev_cycle_2 && 255 mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] < 0) { 256 mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] = phase - 1; 257 mtkaif_phase_cycle[MT8195_MTKAIF_MISO_1] = prev_cycle_2; 258 } 259 260 if (cycle_3 != prev_cycle_3 && 261 mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] < 0) { 262 mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] = phase - 1; 263 mtkaif_phase_cycle[MT8195_MTKAIF_MISO_2] = prev_cycle_3; 264 } 265 266 regmap_update_bits(afe_priv->topckgen, 267 CKSYS_AUD_TOP_CFG, 0x1, 0x0); 268 269 if (mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] >= 0 && 270 mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] >= 0 && 271 mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] >= 0) 272 break; 273 } 274 275 if (mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] < 0) { 276 mtkaif_calibration_ok = false; 277 chosen_phase_1 = 0; 278 } else { 279 chosen_phase_1 = mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0]; 280 } 281 282 if (mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] < 0) { 283 mtkaif_calibration_ok = false; 284 chosen_phase_2 = 0; 285 } else { 286 chosen_phase_2 = mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1]; 287 } 288 289 if (mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] < 0) { 290 mtkaif_calibration_ok = false; 291 chosen_phase_3 = 0; 292 } else { 293 chosen_phase_3 = mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2]; 294 } 295 296 mt6359_set_mtkaif_calibration_phase(cmpnt_codec, 297 chosen_phase_1, 298 chosen_phase_2, 299 chosen_phase_3); 300 301 mt6359_mtkaif_calibration_disable(cmpnt_codec); 302 pm_runtime_put(afe->dev); 303 304 param->mtkaif_calibration_ok = mtkaif_calibration_ok; 305 param->mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] = chosen_phase_1; 306 param->mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] = chosen_phase_2; 307 param->mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] = chosen_phase_3; 308 for (i = 0; i < MT8195_MTKAIF_MISO_NUM; i++) 309 param->mtkaif_phase_cycle[i] = mtkaif_phase_cycle[i]; 310 311 dev_info(afe->dev, "%s(), end, calibration ok %d\n", 312 __func__, param->mtkaif_calibration_ok); 313 314 return 0; 315} 316 317static int mt8195_mt6359_init(struct snd_soc_pcm_runtime *rtd) 318{ 319 struct snd_soc_component *cmpnt_codec = 320 snd_soc_rtd_to_codec(rtd, 0)->component; 321 322 /* set mtkaif protocol */ 323 mt6359_set_mtkaif_protocol(cmpnt_codec, 324 MT6359_MTKAIF_PROTOCOL_2_CLK_P2); 325 326 /* mtkaif calibration */ 327 mt8195_mt6359_mtkaif_calibration(rtd); 328 329 return 0; 330} 331 332static int mt8195_hdmitx_dptx_startup(struct snd_pcm_substream *substream) 333{ 334 return mtk_soundcard_startup(substream, MTK_CONSTRAINT_HDMIDP); 335} 336 337static const struct snd_soc_ops mt8195_hdmitx_dptx_playback_ops = { 338 .startup = mt8195_hdmitx_dptx_startup, 339}; 340 341static int mt8195_dptx_hw_params(struct snd_pcm_substream *substream, 342 struct snd_pcm_hw_params *params) 343{ 344 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 345 struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); 346 347 return snd_soc_dai_set_sysclk(cpu_dai, 0, params_rate(params) * 256, 348 SND_SOC_CLOCK_OUT); 349} 350 351static const struct snd_soc_ops mt8195_dptx_ops = { 352 .hw_params = mt8195_dptx_hw_params, 353}; 354 355static int mt8195_dptx_codec_init(struct snd_soc_pcm_runtime *rtd) 356{ 357 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card); 358 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8195_JACK_DP]; 359 struct snd_soc_component *cmpnt_codec = 360 snd_soc_rtd_to_codec(rtd, 0)->component; 361 int ret; 362 363 ret = snd_soc_card_jack_new(rtd->card, "DP Jack", SND_JACK_AVOUT, jack); 364 if (ret) 365 return ret; 366 367 return snd_soc_component_set_jack(cmpnt_codec, jack, NULL); 368} 369 370static int mt8195_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd) 371{ 372 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card); 373 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8195_JACK_HDMI]; 374 struct snd_soc_component *cmpnt_codec = 375 snd_soc_rtd_to_codec(rtd, 0)->component; 376 int ret; 377 378 ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_AVOUT, jack); 379 if (ret) 380 return ret; 381 382 return snd_soc_component_set_jack(cmpnt_codec, jack, NULL); 383} 384 385static int mt8195_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, 386 struct snd_pcm_hw_params *params) 387{ 388 /* fix BE i2s format to S24_LE, clean param mask first */ 389 snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT), 390 0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST); 391 392 params_set_format(params, SNDRV_PCM_FORMAT_S24_LE); 393 394 return 0; 395} 396 397static int mt8195_rt5682_etdm_hw_params(struct snd_pcm_substream *substream, 398 struct snd_pcm_hw_params *params) 399{ 400 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 401 struct snd_soc_card *card = rtd->card; 402 struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); 403 struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0); 404 unsigned int rate = params_rate(params); 405 int bitwidth; 406 int ret; 407 408 bitwidth = snd_pcm_format_width(params_format(params)); 409 if (bitwidth < 0) { 410 dev_err(card->dev, "invalid bit width: %d\n", bitwidth); 411 return bitwidth; 412 } 413 414 ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth); 415 if (ret) { 416 dev_err(card->dev, "failed to set tdm slot\n"); 417 return ret; 418 } 419 420 ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1, RT5682_PLL1_S_MCLK, 421 rate * 256, rate * 512); 422 if (ret) { 423 dev_err(card->dev, "failed to set pll\n"); 424 return ret; 425 } 426 427 ret = snd_soc_dai_set_sysclk(codec_dai, RT5682_SCLK_S_PLL1, 428 rate * 512, SND_SOC_CLOCK_IN); 429 if (ret) { 430 dev_err(card->dev, "failed to set sysclk\n"); 431 return ret; 432 } 433 434 return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 256, 435 SND_SOC_CLOCK_OUT); 436} 437 438static const struct snd_soc_ops mt8195_rt5682_etdm_ops = { 439 .hw_params = mt8195_rt5682_etdm_hw_params, 440}; 441 442static int mt8195_rt5682_init(struct snd_soc_pcm_runtime *rtd) 443{ 444 struct snd_soc_component *cmpnt_codec = 445 snd_soc_rtd_to_codec(rtd, 0)->component; 446 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card); 447 struct mt8195_mt6359_priv *priv = soc_card_data->mach_priv; 448 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8195_JACK_HEADSET]; 449 struct snd_soc_component *cmpnt_afe = 450 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); 451 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe); 452 struct mt8195_afe_private *afe_priv = afe->platform_priv; 453 struct snd_soc_card *card = rtd->card; 454 struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card); 455 int ret; 456 457 priv->i2so1_mclk = afe_priv->clk[MT8195_CLK_TOP_APLL12_DIV2]; 458 459 ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack", 460 SND_JACK_HEADSET | SND_JACK_BTN_0 | 461 SND_JACK_BTN_1 | SND_JACK_BTN_2 | 462 SND_JACK_BTN_3, 463 jack, mt8195_jack_pins, 464 ARRAY_SIZE(mt8195_jack_pins)); 465 if (ret) { 466 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret); 467 return ret; 468 } 469 470 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); 471 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND); 472 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP); 473 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN); 474 475 ret = snd_soc_component_set_jack(cmpnt_codec, jack, NULL); 476 if (ret) { 477 dev_err(rtd->dev, "Headset Jack set failed: %d\n", ret); 478 return ret; 479 } 480 481 ret = snd_soc_dapm_add_routes(dapm, mt8195_rt5682_routes, 482 ARRAY_SIZE(mt8195_rt5682_routes)); 483 if (ret) 484 dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret); 485 486 return ret; 487}; 488 489static int mt8195_rt1011_etdm_hw_params(struct snd_pcm_substream *substream, 490 struct snd_pcm_hw_params *params) 491{ 492 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 493 struct snd_soc_dai *codec_dai; 494 struct snd_soc_card *card = rtd->card; 495 int srate, i, ret; 496 497 srate = params_rate(params); 498 499 for_each_rtd_codec_dais(rtd, i, codec_dai) { 500 ret = snd_soc_dai_set_pll(codec_dai, 0, RT1011_PLL1_S_BCLK, 501 64 * srate, 256 * srate); 502 if (ret < 0) { 503 dev_err(card->dev, "codec_dai clock not set\n"); 504 return ret; 505 } 506 507 ret = snd_soc_dai_set_sysclk(codec_dai, 508 RT1011_FS_SYS_PRE_S_PLL1, 509 256 * srate, SND_SOC_CLOCK_IN); 510 if (ret < 0) { 511 dev_err(card->dev, "codec_dai clock not set\n"); 512 return ret; 513 } 514 } 515 return 0; 516} 517 518static const struct snd_soc_ops mt8195_rt1011_etdm_ops = { 519 .hw_params = mt8195_rt1011_etdm_hw_params, 520}; 521 522static int mt8195_sof_be_hw_params(struct snd_pcm_substream *substream, 523 struct snd_pcm_hw_params *params) 524{ 525 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 526 struct snd_soc_component *cmpnt_afe = NULL; 527 struct snd_soc_pcm_runtime *runtime; 528 529 /* find afe component */ 530 for_each_card_rtds(rtd->card, runtime) { 531 cmpnt_afe = snd_soc_rtdcom_lookup(runtime, AFE_PCM_NAME); 532 if (cmpnt_afe) 533 break; 534 } 535 536 if (cmpnt_afe && !pm_runtime_active(cmpnt_afe->dev)) { 537 dev_err(rtd->dev, "afe pm runtime is not active!!\n"); 538 return -EINVAL; 539 } 540 541 return 0; 542} 543 544static const struct snd_soc_ops mt8195_sof_be_ops = { 545 .hw_params = mt8195_sof_be_hw_params, 546}; 547 548static int mt8195_rt1011_init(struct snd_soc_pcm_runtime *rtd) 549{ 550 struct snd_soc_card *card = rtd->card; 551 struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card); 552 int ret; 553 554 ret = snd_soc_dapm_new_controls(dapm, mt8195_dual_speaker_widgets, 555 ARRAY_SIZE(mt8195_dual_speaker_widgets)); 556 if (ret) { 557 dev_err(rtd->dev, "unable to add dapm controls, ret %d\n", ret); 558 /* Don't need to add routes if widget addition failed */ 559 return ret; 560 } 561 562 ret = snd_soc_add_card_controls(card, mt8195_dual_speaker_controls, 563 ARRAY_SIZE(mt8195_dual_speaker_controls)); 564 if (ret) { 565 dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret); 566 return ret; 567 } 568 569 ret = snd_soc_dapm_add_routes(dapm, mt8195_rt1011_routes, 570 ARRAY_SIZE(mt8195_rt1011_routes)); 571 if (ret) 572 dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret); 573 574 return ret; 575} 576 577static int mt8195_dumb_amp_init(struct snd_soc_pcm_runtime *rtd) 578{ 579 struct snd_soc_card *card = rtd->card; 580 struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card); 581 int ret; 582 583 ret = snd_soc_dapm_new_controls(dapm, mt8195_speaker_widgets, 584 ARRAY_SIZE(mt8195_speaker_widgets)); 585 if (ret) { 586 dev_err(rtd->dev, "unable to add dapm controls, ret %d\n", ret); 587 /* Don't need to add routes if widget addition failed */ 588 return ret; 589 } 590 591 ret = snd_soc_add_card_controls(card, mt8195_speaker_controls, 592 ARRAY_SIZE(mt8195_speaker_controls)); 593 if (ret) { 594 dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret); 595 return ret; 596 } 597 598 return 0; 599} 600 601static int mt8195_rt1019_init(struct snd_soc_pcm_runtime *rtd) 602{ 603 struct snd_soc_card *card = rtd->card; 604 struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card); 605 int ret; 606 607 ret = mt8195_dumb_amp_init(rtd); 608 if (ret) 609 return ret; 610 611 ret = snd_soc_dapm_add_routes(dapm, mt8195_rt1019_routes, 612 ARRAY_SIZE(mt8195_rt1019_routes)); 613 if (ret) 614 dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret); 615 616 return ret; 617} 618 619static int mt8195_max98390_init(struct snd_soc_pcm_runtime *rtd) 620{ 621 struct snd_soc_card *card = rtd->card; 622 struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card); 623 int ret; 624 625 ret = snd_soc_dapm_new_controls(dapm, mt8195_dual_speaker_widgets, 626 ARRAY_SIZE(mt8195_dual_speaker_widgets)); 627 if (ret) { 628 dev_err(rtd->dev, "unable to add dapm controls, ret %d\n", ret); 629 /* Don't need to add routes if widget addition failed */ 630 return ret; 631 } 632 633 ret = snd_soc_add_card_controls(card, mt8195_dual_speaker_controls, 634 ARRAY_SIZE(mt8195_dual_speaker_controls)); 635 if (ret) { 636 dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret); 637 return ret; 638 } 639 640 ret = snd_soc_dapm_add_routes(dapm, mt8195_max98390_routes, 641 ARRAY_SIZE(mt8195_max98390_routes)); 642 if (ret) 643 dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret); 644 645 return ret; 646} 647 648static int mt8195_etdm_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, 649 struct snd_pcm_hw_params *params) 650{ 651 /* fix BE i2s format to S24_LE, clean param mask first */ 652 snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT), 653 0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST); 654 655 params_set_format(params, SNDRV_PCM_FORMAT_S24_LE); 656 657 return 0; 658} 659 660static int mt8195_set_bias_level_post(struct snd_soc_card *card, 661 struct snd_soc_dapm_context *dapm, enum snd_soc_bias_level level) 662{ 663 struct snd_soc_component *component = snd_soc_dapm_to_component(dapm); 664 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card); 665 struct mt8195_mt6359_priv *priv = soc_card_data->mach_priv; 666 int ret; 667 668 /* 669 * It's required to control mclk directly in the set_bias_level_post 670 * function for rt5682 and rt5682s codec, or the unexpected pop happens 671 * at the end of playback. 672 */ 673 if (!component || 674 (strcmp(component->name, RT5682_DEV0_NAME) && 675 strcmp(component->name, RT5682S_DEV0_NAME))) 676 return 0; 677 678 switch (level) { 679 case SND_SOC_BIAS_OFF: 680 if (!__clk_is_enabled(priv->i2so1_mclk)) 681 return 0; 682 683 clk_disable_unprepare(priv->i2so1_mclk); 684 dev_dbg(card->dev, "Disable i2so1 mclk\n"); 685 break; 686 case SND_SOC_BIAS_ON: 687 ret = clk_prepare_enable(priv->i2so1_mclk); 688 if (ret) { 689 dev_err(card->dev, "Can't enable i2so1 mclk: %d\n", ret); 690 return ret; 691 } 692 dev_dbg(card->dev, "Enable i2so1 mclk\n"); 693 break; 694 default: 695 break; 696 } 697 698 return 0; 699} 700 701enum { 702 DAI_LINK_DL2_FE, 703 DAI_LINK_DL3_FE, 704 DAI_LINK_DL6_FE, 705 DAI_LINK_DL7_FE, 706 DAI_LINK_DL8_FE, 707 DAI_LINK_DL10_FE, 708 DAI_LINK_DL11_FE, 709 DAI_LINK_UL1_FE, 710 DAI_LINK_UL2_FE, 711 DAI_LINK_UL3_FE, 712 DAI_LINK_UL4_FE, 713 DAI_LINK_UL5_FE, 714 DAI_LINK_UL6_FE, 715 DAI_LINK_UL8_FE, 716 DAI_LINK_UL9_FE, 717 DAI_LINK_UL10_FE, 718 DAI_LINK_DL_SRC_BE, 719 DAI_LINK_DPTX_BE, 720 DAI_LINK_ETDM1_IN_BE, 721 DAI_LINK_ETDM2_IN_BE, 722 DAI_LINK_ETDM1_OUT_BE, 723 DAI_LINK_ETDM2_OUT_BE, 724 DAI_LINK_ETDM3_OUT_BE, 725 DAI_LINK_PCM1_BE, 726 DAI_LINK_UL_SRC1_BE, 727 DAI_LINK_UL_SRC2_BE, 728 DAI_LINK_REGULAR_LAST = DAI_LINK_UL_SRC2_BE, 729 DAI_LINK_SOF_START, 730 DAI_LINK_SOF_DL2_BE = DAI_LINK_SOF_START, 731 DAI_LINK_SOF_DL3_BE, 732 DAI_LINK_SOF_UL4_BE, 733 DAI_LINK_SOF_UL5_BE, 734 DAI_LINK_SOF_END = DAI_LINK_SOF_UL5_BE, 735}; 736 737#define DAI_LINK_REGULAR_NUM (DAI_LINK_REGULAR_LAST + 1) 738 739/* FE */ 740SND_SOC_DAILINK_DEFS(DL2_FE, 741 DAILINK_COMP_ARRAY(COMP_CPU("DL2")), 742 DAILINK_COMP_ARRAY(COMP_DUMMY()), 743 DAILINK_COMP_ARRAY(COMP_EMPTY())); 744 745SND_SOC_DAILINK_DEFS(DL3_FE, 746 DAILINK_COMP_ARRAY(COMP_CPU("DL3")), 747 DAILINK_COMP_ARRAY(COMP_DUMMY()), 748 DAILINK_COMP_ARRAY(COMP_EMPTY())); 749 750SND_SOC_DAILINK_DEFS(DL6_FE, 751 DAILINK_COMP_ARRAY(COMP_CPU("DL6")), 752 DAILINK_COMP_ARRAY(COMP_DUMMY()), 753 DAILINK_COMP_ARRAY(COMP_EMPTY())); 754 755SND_SOC_DAILINK_DEFS(DL7_FE, 756 DAILINK_COMP_ARRAY(COMP_CPU("DL7")), 757 DAILINK_COMP_ARRAY(COMP_DUMMY()), 758 DAILINK_COMP_ARRAY(COMP_EMPTY())); 759 760SND_SOC_DAILINK_DEFS(DL8_FE, 761 DAILINK_COMP_ARRAY(COMP_CPU("DL8")), 762 DAILINK_COMP_ARRAY(COMP_DUMMY()), 763 DAILINK_COMP_ARRAY(COMP_EMPTY())); 764 765SND_SOC_DAILINK_DEFS(DL10_FE, 766 DAILINK_COMP_ARRAY(COMP_CPU("DL10")), 767 DAILINK_COMP_ARRAY(COMP_DUMMY()), 768 DAILINK_COMP_ARRAY(COMP_EMPTY())); 769 770SND_SOC_DAILINK_DEFS(DL11_FE, 771 DAILINK_COMP_ARRAY(COMP_CPU("DL11")), 772 DAILINK_COMP_ARRAY(COMP_DUMMY()), 773 DAILINK_COMP_ARRAY(COMP_EMPTY())); 774 775SND_SOC_DAILINK_DEFS(UL1_FE, 776 DAILINK_COMP_ARRAY(COMP_CPU("UL1")), 777 DAILINK_COMP_ARRAY(COMP_DUMMY()), 778 DAILINK_COMP_ARRAY(COMP_EMPTY())); 779 780SND_SOC_DAILINK_DEFS(UL2_FE, 781 DAILINK_COMP_ARRAY(COMP_CPU("UL2")), 782 DAILINK_COMP_ARRAY(COMP_DUMMY()), 783 DAILINK_COMP_ARRAY(COMP_EMPTY())); 784 785SND_SOC_DAILINK_DEFS(UL3_FE, 786 DAILINK_COMP_ARRAY(COMP_CPU("UL3")), 787 DAILINK_COMP_ARRAY(COMP_DUMMY()), 788 DAILINK_COMP_ARRAY(COMP_EMPTY())); 789 790SND_SOC_DAILINK_DEFS(UL4_FE, 791 DAILINK_COMP_ARRAY(COMP_CPU("UL4")), 792 DAILINK_COMP_ARRAY(COMP_DUMMY()), 793 DAILINK_COMP_ARRAY(COMP_EMPTY())); 794 795SND_SOC_DAILINK_DEFS(UL5_FE, 796 DAILINK_COMP_ARRAY(COMP_CPU("UL5")), 797 DAILINK_COMP_ARRAY(COMP_DUMMY()), 798 DAILINK_COMP_ARRAY(COMP_EMPTY())); 799 800SND_SOC_DAILINK_DEFS(UL6_FE, 801 DAILINK_COMP_ARRAY(COMP_CPU("UL6")), 802 DAILINK_COMP_ARRAY(COMP_DUMMY()), 803 DAILINK_COMP_ARRAY(COMP_EMPTY())); 804 805SND_SOC_DAILINK_DEFS(UL8_FE, 806 DAILINK_COMP_ARRAY(COMP_CPU("UL8")), 807 DAILINK_COMP_ARRAY(COMP_DUMMY()), 808 DAILINK_COMP_ARRAY(COMP_EMPTY())); 809 810SND_SOC_DAILINK_DEFS(UL9_FE, 811 DAILINK_COMP_ARRAY(COMP_CPU("UL9")), 812 DAILINK_COMP_ARRAY(COMP_DUMMY()), 813 DAILINK_COMP_ARRAY(COMP_EMPTY())); 814 815SND_SOC_DAILINK_DEFS(UL10_FE, 816 DAILINK_COMP_ARRAY(COMP_CPU("UL10")), 817 DAILINK_COMP_ARRAY(COMP_DUMMY()), 818 DAILINK_COMP_ARRAY(COMP_EMPTY())); 819 820/* BE */ 821SND_SOC_DAILINK_DEFS(DL_SRC_BE, 822 DAILINK_COMP_ARRAY(COMP_CPU("DL_SRC")), 823 DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound", 824 "mt6359-snd-codec-aif1")), 825 DAILINK_COMP_ARRAY(COMP_EMPTY())); 826 827SND_SOC_DAILINK_DEFS(DPTX_BE, 828 DAILINK_COMP_ARRAY(COMP_CPU("DPTX")), 829 DAILINK_COMP_ARRAY(COMP_DUMMY()), 830 DAILINK_COMP_ARRAY(COMP_EMPTY())); 831 832SND_SOC_DAILINK_DEFS(ETDM1_IN_BE, 833 DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_IN")), 834 DAILINK_COMP_ARRAY(COMP_DUMMY()), 835 DAILINK_COMP_ARRAY(COMP_EMPTY())); 836 837SND_SOC_DAILINK_DEFS(ETDM2_IN_BE, 838 DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_IN")), 839 DAILINK_COMP_ARRAY(COMP_DUMMY()), 840 DAILINK_COMP_ARRAY(COMP_EMPTY())); 841 842SND_SOC_DAILINK_DEFS(ETDM1_OUT_BE, 843 DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_OUT")), 844 DAILINK_COMP_ARRAY(COMP_DUMMY()), 845 DAILINK_COMP_ARRAY(COMP_EMPTY())); 846 847SND_SOC_DAILINK_DEFS(ETDM2_OUT_BE, 848 DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_OUT")), 849 DAILINK_COMP_ARRAY(COMP_DUMMY()), 850 DAILINK_COMP_ARRAY(COMP_EMPTY())); 851 852SND_SOC_DAILINK_DEFS(ETDM3_OUT_BE, 853 DAILINK_COMP_ARRAY(COMP_CPU("ETDM3_OUT")), 854 DAILINK_COMP_ARRAY(COMP_DUMMY()), 855 DAILINK_COMP_ARRAY(COMP_EMPTY())); 856 857SND_SOC_DAILINK_DEFS(PCM1_BE, 858 DAILINK_COMP_ARRAY(COMP_CPU("PCM1")), 859 DAILINK_COMP_ARRAY(COMP_DUMMY()), 860 DAILINK_COMP_ARRAY(COMP_EMPTY())); 861 862SND_SOC_DAILINK_DEFS(UL_SRC1_BE, 863 DAILINK_COMP_ARRAY(COMP_CPU("UL_SRC1")), 864 DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound", 865 "mt6359-snd-codec-aif1"), 866 COMP_CODEC("dmic-codec", 867 "dmic-hifi")), 868 DAILINK_COMP_ARRAY(COMP_EMPTY())); 869 870SND_SOC_DAILINK_DEFS(UL_SRC2_BE, 871 DAILINK_COMP_ARRAY(COMP_CPU("UL_SRC2")), 872 DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound", 873 "mt6359-snd-codec-aif2")), 874 DAILINK_COMP_ARRAY(COMP_EMPTY())); 875 876SND_SOC_DAILINK_DEFS(AFE_SOF_DL2, 877 DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")), 878 DAILINK_COMP_ARRAY(COMP_DUMMY()), 879 DAILINK_COMP_ARRAY(COMP_EMPTY())); 880 881SND_SOC_DAILINK_DEFS(AFE_SOF_DL3, 882 DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL3")), 883 DAILINK_COMP_ARRAY(COMP_DUMMY()), 884 DAILINK_COMP_ARRAY(COMP_EMPTY())); 885 886SND_SOC_DAILINK_DEFS(AFE_SOF_UL4, 887 DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL4")), 888 DAILINK_COMP_ARRAY(COMP_DUMMY()), 889 DAILINK_COMP_ARRAY(COMP_EMPTY())); 890 891SND_SOC_DAILINK_DEFS(AFE_SOF_UL5, 892 DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL5")), 893 DAILINK_COMP_ARRAY(COMP_DUMMY()), 894 DAILINK_COMP_ARRAY(COMP_EMPTY())); 895 896/* codec */ 897SND_SOC_DAILINK_DEF(rt1019_comps, 898 DAILINK_COMP_ARRAY(COMP_CODEC(RT1019_DEV0_NAME, 899 RT1019_CODEC_DAI))); 900 901SND_SOC_DAILINK_DEF(rt1011_comps, 902 DAILINK_COMP_ARRAY(COMP_CODEC(RT1011_DEV0_NAME, 903 RT1011_CODEC_DAI), 904 COMP_CODEC(RT1011_DEV1_NAME, 905 RT1011_CODEC_DAI))); 906 907SND_SOC_DAILINK_DEF(max98390_comps, 908 DAILINK_COMP_ARRAY(COMP_CODEC(MAX98390_DEV0_NAME, 909 MAX98390_CODEC_DAI), 910 COMP_CODEC(MAX98390_DEV1_NAME, 911 MAX98390_CODEC_DAI))); 912 913static const struct sof_conn_stream g_sof_conn_streams[] = { 914 { "ETDM2_OUT_BE", "AFE_SOF_DL2", SOF_DMA_DL2, SNDRV_PCM_STREAM_PLAYBACK}, 915 { "ETDM1_OUT_BE", "AFE_SOF_DL3", SOF_DMA_DL3, SNDRV_PCM_STREAM_PLAYBACK}, 916 { "UL_SRC1_BE", "AFE_SOF_UL4", SOF_DMA_UL4, SNDRV_PCM_STREAM_CAPTURE}, 917 { "ETDM2_IN_BE", "AFE_SOF_UL5", SOF_DMA_UL5, SNDRV_PCM_STREAM_CAPTURE}, 918}; 919 920static struct snd_soc_dai_link mt8195_mt6359_dai_links[] = { 921 /* FE */ 922 [DAI_LINK_DL2_FE] = { 923 .name = "DL2_FE", 924 .stream_name = "DL2 Playback", 925 .trigger = { 926 SND_SOC_DPCM_TRIGGER_POST, 927 SND_SOC_DPCM_TRIGGER_POST, 928 }, 929 .dynamic = 1, 930 .playback_only = 1, 931 .ops = &mtk_soundcard_common_playback_ops, 932 SND_SOC_DAILINK_REG(DL2_FE), 933 }, 934 [DAI_LINK_DL3_FE] = { 935 .name = "DL3_FE", 936 .stream_name = "DL3 Playback", 937 .trigger = { 938 SND_SOC_DPCM_TRIGGER_POST, 939 SND_SOC_DPCM_TRIGGER_POST, 940 }, 941 .dynamic = 1, 942 .playback_only = 1, 943 .ops = &mtk_soundcard_common_playback_ops, 944 SND_SOC_DAILINK_REG(DL3_FE), 945 }, 946 [DAI_LINK_DL6_FE] = { 947 .name = "DL6_FE", 948 .stream_name = "DL6 Playback", 949 .trigger = { 950 SND_SOC_DPCM_TRIGGER_POST, 951 SND_SOC_DPCM_TRIGGER_POST, 952 }, 953 .dynamic = 1, 954 .playback_only = 1, 955 .ops = &mtk_soundcard_common_playback_ops, 956 SND_SOC_DAILINK_REG(DL6_FE), 957 }, 958 [DAI_LINK_DL7_FE] = { 959 .name = "DL7_FE", 960 .stream_name = "DL7 Playback", 961 .trigger = { 962 SND_SOC_DPCM_TRIGGER_PRE, 963 SND_SOC_DPCM_TRIGGER_PRE, 964 }, 965 .dynamic = 1, 966 .playback_only = 1, 967 SND_SOC_DAILINK_REG(DL7_FE), 968 }, 969 [DAI_LINK_DL8_FE] = { 970 .name = "DL8_FE", 971 .stream_name = "DL8 Playback", 972 .trigger = { 973 SND_SOC_DPCM_TRIGGER_POST, 974 SND_SOC_DPCM_TRIGGER_POST, 975 }, 976 .dynamic = 1, 977 .playback_only = 1, 978 .ops = &mtk_soundcard_common_playback_ops, 979 SND_SOC_DAILINK_REG(DL8_FE), 980 }, 981 [DAI_LINK_DL10_FE] = { 982 .name = "DL10_FE", 983 .stream_name = "DL10 Playback", 984 .trigger = { 985 SND_SOC_DPCM_TRIGGER_POST, 986 SND_SOC_DPCM_TRIGGER_POST, 987 }, 988 .dynamic = 1, 989 .playback_only = 1, 990 .ops = &mt8195_hdmitx_dptx_playback_ops, 991 SND_SOC_DAILINK_REG(DL10_FE), 992 }, 993 [DAI_LINK_DL11_FE] = { 994 .name = "DL11_FE", 995 .stream_name = "DL11 Playback", 996 .trigger = { 997 SND_SOC_DPCM_TRIGGER_POST, 998 SND_SOC_DPCM_TRIGGER_POST, 999 }, 1000 .dynamic = 1, 1001 .playback_only = 1, 1002 .ops = &mtk_soundcard_common_playback_ops, 1003 SND_SOC_DAILINK_REG(DL11_FE), 1004 }, 1005 [DAI_LINK_UL1_FE] = { 1006 .name = "UL1_FE", 1007 .stream_name = "UL1 Capture", 1008 .trigger = { 1009 SND_SOC_DPCM_TRIGGER_PRE, 1010 SND_SOC_DPCM_TRIGGER_PRE, 1011 }, 1012 .dynamic = 1, 1013 .capture_only = 1, 1014 SND_SOC_DAILINK_REG(UL1_FE), 1015 }, 1016 [DAI_LINK_UL2_FE] = { 1017 .name = "UL2_FE", 1018 .stream_name = "UL2 Capture", 1019 .trigger = { 1020 SND_SOC_DPCM_TRIGGER_POST, 1021 SND_SOC_DPCM_TRIGGER_POST, 1022 }, 1023 .dynamic = 1, 1024 .capture_only = 1, 1025 .ops = &mtk_soundcard_common_capture_ops, 1026 SND_SOC_DAILINK_REG(UL2_FE), 1027 }, 1028 [DAI_LINK_UL3_FE] = { 1029 .name = "UL3_FE", 1030 .stream_name = "UL3 Capture", 1031 .trigger = { 1032 SND_SOC_DPCM_TRIGGER_POST, 1033 SND_SOC_DPCM_TRIGGER_POST, 1034 }, 1035 .dynamic = 1, 1036 .capture_only = 1, 1037 .ops = &mtk_soundcard_common_capture_ops, 1038 SND_SOC_DAILINK_REG(UL3_FE), 1039 }, 1040 [DAI_LINK_UL4_FE] = { 1041 .name = "UL4_FE", 1042 .stream_name = "UL4 Capture", 1043 .trigger = { 1044 SND_SOC_DPCM_TRIGGER_POST, 1045 SND_SOC_DPCM_TRIGGER_POST, 1046 }, 1047 .dynamic = 1, 1048 .capture_only = 1, 1049 .ops = &mtk_soundcard_common_capture_ops, 1050 SND_SOC_DAILINK_REG(UL4_FE), 1051 }, 1052 [DAI_LINK_UL5_FE] = { 1053 .name = "UL5_FE", 1054 .stream_name = "UL5 Capture", 1055 .trigger = { 1056 SND_SOC_DPCM_TRIGGER_POST, 1057 SND_SOC_DPCM_TRIGGER_POST, 1058 }, 1059 .dynamic = 1, 1060 .capture_only = 1, 1061 .ops = &mtk_soundcard_common_capture_ops, 1062 SND_SOC_DAILINK_REG(UL5_FE), 1063 }, 1064 [DAI_LINK_UL6_FE] = { 1065 .name = "UL6_FE", 1066 .stream_name = "UL6 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(UL6_FE), 1074 }, 1075 [DAI_LINK_UL8_FE] = { 1076 .name = "UL8_FE", 1077 .stream_name = "UL8 Capture", 1078 .trigger = { 1079 SND_SOC_DPCM_TRIGGER_POST, 1080 SND_SOC_DPCM_TRIGGER_POST, 1081 }, 1082 .dynamic = 1, 1083 .capture_only = 1, 1084 .ops = &mtk_soundcard_common_capture_ops, 1085 SND_SOC_DAILINK_REG(UL8_FE), 1086 }, 1087 [DAI_LINK_UL9_FE] = { 1088 .name = "UL9_FE", 1089 .stream_name = "UL9 Capture", 1090 .trigger = { 1091 SND_SOC_DPCM_TRIGGER_POST, 1092 SND_SOC_DPCM_TRIGGER_POST, 1093 }, 1094 .dynamic = 1, 1095 .capture_only = 1, 1096 .ops = &mtk_soundcard_common_capture_ops, 1097 SND_SOC_DAILINK_REG(UL9_FE), 1098 }, 1099 [DAI_LINK_UL10_FE] = { 1100 .name = "UL10_FE", 1101 .stream_name = "UL10 Capture", 1102 .trigger = { 1103 SND_SOC_DPCM_TRIGGER_POST, 1104 SND_SOC_DPCM_TRIGGER_POST, 1105 }, 1106 .dynamic = 1, 1107 .capture_only = 1, 1108 .ops = &mtk_soundcard_common_capture_ops, 1109 SND_SOC_DAILINK_REG(UL10_FE), 1110 }, 1111 /* BE */ 1112 [DAI_LINK_DL_SRC_BE] = { 1113 .name = "DL_SRC_BE", 1114 .no_pcm = 1, 1115 .playback_only = 1, 1116 SND_SOC_DAILINK_REG(DL_SRC_BE), 1117 }, 1118 [DAI_LINK_DPTX_BE] = { 1119 .name = "DPTX_BE", 1120 .no_pcm = 1, 1121 .playback_only = 1, 1122 .ops = &mt8195_dptx_ops, 1123 .be_hw_params_fixup = mt8195_dptx_hw_params_fixup, 1124 SND_SOC_DAILINK_REG(DPTX_BE), 1125 }, 1126 [DAI_LINK_ETDM1_IN_BE] = { 1127 .name = "ETDM1_IN_BE", 1128 .no_pcm = 1, 1129 .dai_fmt = SND_SOC_DAIFMT_I2S | 1130 SND_SOC_DAIFMT_NB_NF | 1131 SND_SOC_DAIFMT_CBC_CFC, 1132 .capture_only = 1, 1133 SND_SOC_DAILINK_REG(ETDM1_IN_BE), 1134 }, 1135 [DAI_LINK_ETDM2_IN_BE] = { 1136 .name = "ETDM2_IN_BE", 1137 .no_pcm = 1, 1138 .dai_fmt = SND_SOC_DAIFMT_I2S | 1139 SND_SOC_DAIFMT_NB_NF | 1140 SND_SOC_DAIFMT_CBC_CFC, 1141 .capture_only = 1, 1142 .be_hw_params_fixup = mt8195_etdm_hw_params_fixup, 1143 SND_SOC_DAILINK_REG(ETDM2_IN_BE), 1144 }, 1145 [DAI_LINK_ETDM1_OUT_BE] = { 1146 .name = "ETDM1_OUT_BE", 1147 .no_pcm = 1, 1148 .dai_fmt = SND_SOC_DAIFMT_I2S | 1149 SND_SOC_DAIFMT_NB_NF | 1150 SND_SOC_DAIFMT_CBC_CFC, 1151 .playback_only = 1, 1152 .be_hw_params_fixup = mt8195_etdm_hw_params_fixup, 1153 SND_SOC_DAILINK_REG(ETDM1_OUT_BE), 1154 }, 1155 [DAI_LINK_ETDM2_OUT_BE] = { 1156 .name = "ETDM2_OUT_BE", 1157 .no_pcm = 1, 1158 .dai_fmt = SND_SOC_DAIFMT_I2S | 1159 SND_SOC_DAIFMT_NB_NF | 1160 SND_SOC_DAIFMT_CBC_CFC, 1161 .playback_only = 1, 1162 SND_SOC_DAILINK_REG(ETDM2_OUT_BE), 1163 }, 1164 [DAI_LINK_ETDM3_OUT_BE] = { 1165 .name = "ETDM3_OUT_BE", 1166 .no_pcm = 1, 1167 .dai_fmt = SND_SOC_DAIFMT_I2S | 1168 SND_SOC_DAIFMT_NB_NF | 1169 SND_SOC_DAIFMT_CBC_CFC, 1170 .playback_only = 1, 1171 SND_SOC_DAILINK_REG(ETDM3_OUT_BE), 1172 }, 1173 [DAI_LINK_PCM1_BE] = { 1174 .name = "PCM1_BE", 1175 .no_pcm = 1, 1176 .dai_fmt = SND_SOC_DAIFMT_I2S | 1177 SND_SOC_DAIFMT_NB_NF | 1178 SND_SOC_DAIFMT_CBC_CFC, 1179 SND_SOC_DAILINK_REG(PCM1_BE), 1180 }, 1181 [DAI_LINK_UL_SRC1_BE] = { 1182 .name = "UL_SRC1_BE", 1183 .no_pcm = 1, 1184 .capture_only = 1, 1185 SND_SOC_DAILINK_REG(UL_SRC1_BE), 1186 }, 1187 [DAI_LINK_UL_SRC2_BE] = { 1188 .name = "UL_SRC2_BE", 1189 .no_pcm = 1, 1190 .capture_only = 1, 1191 SND_SOC_DAILINK_REG(UL_SRC2_BE), 1192 }, 1193 /* SOF BE */ 1194 [DAI_LINK_SOF_DL2_BE] = { 1195 .name = "AFE_SOF_DL2", 1196 .no_pcm = 1, 1197 .playback_only = 1, 1198 .ops = &mt8195_sof_be_ops, 1199 SND_SOC_DAILINK_REG(AFE_SOF_DL2), 1200 }, 1201 [DAI_LINK_SOF_DL3_BE] = { 1202 .name = "AFE_SOF_DL3", 1203 .no_pcm = 1, 1204 .playback_only = 1, 1205 .ops = &mt8195_sof_be_ops, 1206 SND_SOC_DAILINK_REG(AFE_SOF_DL3), 1207 }, 1208 [DAI_LINK_SOF_UL4_BE] = { 1209 .name = "AFE_SOF_UL4", 1210 .no_pcm = 1, 1211 .capture_only = 1, 1212 .ops = &mt8195_sof_be_ops, 1213 SND_SOC_DAILINK_REG(AFE_SOF_UL4), 1214 }, 1215 [DAI_LINK_SOF_UL5_BE] = { 1216 .name = "AFE_SOF_UL5", 1217 .no_pcm = 1, 1218 .capture_only = 1, 1219 .ops = &mt8195_sof_be_ops, 1220 SND_SOC_DAILINK_REG(AFE_SOF_UL5), 1221 }, 1222}; 1223 1224static struct snd_soc_codec_conf rt1011_codec_conf[] = { 1225 { 1226 .dlc = COMP_CODEC_CONF(RT1011_DEV0_NAME), 1227 .name_prefix = "Left", 1228 }, 1229 { 1230 .dlc = COMP_CODEC_CONF(RT1011_DEV1_NAME), 1231 .name_prefix = "Right", 1232 }, 1233}; 1234 1235static struct snd_soc_codec_conf max98390_codec_conf[] = { 1236 { 1237 .dlc = COMP_CODEC_CONF(MAX98390_DEV0_NAME), 1238 .name_prefix = "Right", 1239 }, 1240 { 1241 .dlc = COMP_CODEC_CONF(MAX98390_DEV1_NAME), 1242 .name_prefix = "Left", 1243 }, 1244}; 1245 1246static struct snd_soc_card mt8195_mt6359_soc_card = { 1247 .owner = THIS_MODULE, 1248 .dai_link = mt8195_mt6359_dai_links, 1249 .num_links = ARRAY_SIZE(mt8195_mt6359_dai_links), 1250 .controls = mt8195_mt6359_controls, 1251 .num_controls = ARRAY_SIZE(mt8195_mt6359_controls), 1252 .dapm_widgets = mt8195_mt6359_widgets, 1253 .num_dapm_widgets = ARRAY_SIZE(mt8195_mt6359_widgets), 1254 .dapm_routes = mt8195_mt6359_routes, 1255 .num_dapm_routes = ARRAY_SIZE(mt8195_mt6359_routes), 1256 .set_bias_level_post = mt8195_set_bias_level_post, 1257}; 1258 1259/* fixup the BE DAI link to match any values from topology */ 1260static int mt8195_dai_link_fixup(struct snd_soc_pcm_runtime *rtd, 1261 struct snd_pcm_hw_params *params) 1262{ 1263 int ret; 1264 1265 ret = mtk_sof_dai_link_fixup(rtd, params); 1266 1267 if (!strcmp(rtd->dai_link->name, "ETDM2_IN_BE") || 1268 !strcmp(rtd->dai_link->name, "ETDM1_OUT_BE")) { 1269 mt8195_etdm_hw_params_fixup(rtd, params); 1270 } 1271 1272 return ret; 1273} 1274 1275static int mt8195_mt6359_legacy_probe(struct mtk_soc_card_data *soc_card_data) 1276{ 1277 struct mtk_platform_card_data *card_data = soc_card_data->card_data; 1278 struct snd_soc_card *card = card_data->card; 1279 struct device_node *codec_node, *dp_node, *hdmi_node; 1280 struct snd_soc_dai_link *dai_link; 1281 struct device *dev = card->dev; 1282 bool is5682s, init6359 = false; 1283 int i; 1284 1285 if (strstr(card->name, "_5682s")) { 1286 codec_node = of_find_compatible_node(NULL, NULL, "realtek,rt5682s"); 1287 is5682s = true; 1288 } else { 1289 codec_node = of_find_compatible_node(NULL, NULL, "realtek,rt5682i"); 1290 is5682s = false; 1291 } 1292 1293 dp_node = of_parse_phandle(dev->of_node, "mediatek,dptx-codec", 0); 1294 hdmi_node = of_parse_phandle(dev->of_node, "mediatek,hdmi-codec", 0); 1295 1296 for_each_card_prelinks(card, i, dai_link) { 1297 if (strcmp(dai_link->name, "DPTX_BE") == 0) { 1298 if (!dp_node) { 1299 dev_dbg(dev, "No property 'dptx-codec'\n"); 1300 } else { 1301 dai_link->codecs->of_node = dp_node; 1302 dai_link->codecs->name = NULL; 1303 dai_link->codecs->dai_name = "i2s-hifi"; 1304 dai_link->init = mt8195_dptx_codec_init; 1305 } 1306 } else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) { 1307 if (!hdmi_node) { 1308 dev_dbg(dev, "No property 'hdmi-codec'\n"); 1309 } else { 1310 dai_link->codecs->of_node = hdmi_node; 1311 dai_link->codecs->name = NULL; 1312 dai_link->codecs->dai_name = "i2s-hifi"; 1313 dai_link->init = mt8195_hdmi_codec_init; 1314 } 1315 } else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0) { 1316 if (!codec_node) { 1317 dev_err(dev, "Codec not found!\n"); 1318 } else { 1319 dai_link->codecs->of_node = codec_node; 1320 dai_link->codecs->name = NULL; 1321 dai_link->codecs->dai_name = 1322 is5682s ? RT5682S_CODEC_DAI : RT5682_CODEC_DAI; 1323 dai_link->init = mt8195_rt5682_init; 1324 dai_link->ops = &mt8195_rt5682_etdm_ops; 1325 } 1326 } else if (strcmp(dai_link->name, "ETDM2_IN_BE") == 0) { 1327 if (!codec_node) { 1328 dev_err(dev, "Codec not found!\n"); 1329 } else { 1330 dai_link->codecs->of_node = codec_node; 1331 dai_link->codecs->name = NULL; 1332 dai_link->codecs->dai_name = 1333 is5682s ? RT5682S_CODEC_DAI : RT5682_CODEC_DAI; 1334 dai_link->ops = &mt8195_rt5682_etdm_ops; 1335 } 1336 } else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 || 1337 strcmp(dai_link->name, "UL_SRC1_BE") == 0 || 1338 strcmp(dai_link->name, "UL_SRC2_BE") == 0) { 1339 if (!init6359) { 1340 dai_link->init = mt8195_mt6359_init; 1341 init6359 = true; 1342 } 1343 } else if (strcmp(dai_link->name, "ETDM2_OUT_BE") == 0) { 1344 switch (card_data->flags) { 1345 case RT1011_SPEAKER_AMP_PRESENT: 1346 dai_link->codecs = rt1011_comps; 1347 dai_link->num_codecs = ARRAY_SIZE(rt1011_comps); 1348 dai_link->init = mt8195_rt1011_init; 1349 dai_link->ops = &mt8195_rt1011_etdm_ops; 1350 dai_link->be_hw_params_fixup = mt8195_etdm_hw_params_fixup; 1351 card->codec_conf = rt1011_codec_conf; 1352 card->num_configs = ARRAY_SIZE(rt1011_codec_conf); 1353 break; 1354 case RT1019_SPEAKER_AMP_PRESENT: 1355 dai_link->codecs = rt1019_comps; 1356 dai_link->num_codecs = ARRAY_SIZE(rt1019_comps); 1357 dai_link->init = mt8195_rt1019_init; 1358 break; 1359 case MAX98390_SPEAKER_AMP_PRESENT: 1360 dai_link->codecs = max98390_comps; 1361 dai_link->num_codecs = ARRAY_SIZE(max98390_comps); 1362 dai_link->init = mt8195_max98390_init; 1363 card->codec_conf = max98390_codec_conf; 1364 card->num_configs = ARRAY_SIZE(max98390_codec_conf); 1365 break; 1366 default: 1367 break; 1368 } 1369 } 1370 } 1371 1372 return 0; 1373} 1374 1375static int mt8195_mt6359_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy) 1376{ 1377 struct mtk_platform_card_data *card_data = soc_card_data->card_data; 1378 struct snd_soc_card *card = card_data->card; 1379 struct mt8195_mt6359_priv *mach_priv; 1380 struct snd_soc_dai_link *dai_link; 1381 u8 codec_init = 0; 1382 int i; 1383 1384 mach_priv = devm_kzalloc(card->dev, sizeof(*mach_priv), GFP_KERNEL); 1385 if (!mach_priv) 1386 return -ENOMEM; 1387 1388 soc_card_data->mach_priv = mach_priv; 1389 1390 if (legacy) 1391 return mt8195_mt6359_legacy_probe(soc_card_data); 1392 1393 for_each_card_prelinks(card, i, dai_link) { 1394 if (strcmp(dai_link->name, "DPTX_BE") == 0) { 1395 if (dai_link->num_codecs && 1396 !snd_soc_dlc_is_dummy(dai_link->codecs)) 1397 dai_link->init = mt8195_dptx_codec_init; 1398 } else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) { 1399 if (dai_link->num_codecs && 1400 !snd_soc_dlc_is_dummy(dai_link->codecs)) 1401 dai_link->init = mt8195_hdmi_codec_init; 1402 } else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 || 1403 strcmp(dai_link->name, "UL_SRC1_BE") == 0 || 1404 strcmp(dai_link->name, "UL_SRC2_BE") == 0) { 1405 if (!(codec_init & MT6359_CODEC_INIT)) { 1406 dai_link->init = mt8195_mt6359_init; 1407 codec_init |= MT6359_CODEC_INIT; 1408 } 1409 } else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0 || 1410 strcmp(dai_link->name, "ETDM2_OUT_BE") == 0 || 1411 strcmp(dai_link->name, "ETDM1_IN_BE") == 0 || 1412 strcmp(dai_link->name, "ETDM2_IN_BE") == 0) { 1413 if (!dai_link->num_codecs) 1414 continue; 1415 1416 if (!strcmp(dai_link->codecs->dai_name, MAX98390_CODEC_DAI)) { 1417 if (!(codec_init & MAX98390_CODEC_INIT)) { 1418 dai_link->init = mt8195_max98390_init; 1419 codec_init |= MAX98390_CODEC_INIT; 1420 } 1421 } else if (!strcmp(dai_link->codecs->dai_name, RT1011_CODEC_DAI)) { 1422 dai_link->ops = &mt8195_rt1011_etdm_ops; 1423 if (!(codec_init & RT1011_CODEC_INIT)) { 1424 dai_link->init = mt8195_rt1011_init; 1425 codec_init |= RT1011_CODEC_INIT; 1426 } 1427 } else if (!strcmp(dai_link->codecs->dai_name, RT1019_CODEC_DAI)) { 1428 if (!(codec_init & RT1019_CODEC_INIT)) { 1429 dai_link->init = mt8195_rt1019_init; 1430 codec_init |= RT1019_CODEC_INIT; 1431 } 1432 } else if (!strcmp(dai_link->codecs->dai_name, RT5682_CODEC_DAI) || 1433 !strcmp(dai_link->codecs->dai_name, RT5682S_CODEC_DAI)) { 1434 dai_link->ops = &mt8195_rt5682_etdm_ops; 1435 if (!(codec_init & RT5682_CODEC_INIT)) { 1436 dai_link->init = mt8195_rt5682_init; 1437 codec_init |= RT5682_CODEC_INIT; 1438 } 1439 } else { 1440 if (!snd_soc_dlc_is_dummy(dai_link->codecs)) { 1441 if (!(codec_init & DUMB_CODEC_INIT)) { 1442 dai_link->init = mt8195_dumb_amp_init; 1443 codec_init |= DUMB_CODEC_INIT; 1444 } 1445 } 1446 } 1447 } 1448 } 1449 1450 return 0; 1451} 1452 1453static const unsigned int mt8195_pcm_playback_channels[] = { 2 }; 1454static const unsigned int mt8195_pcm_capture_channels[] = { 1, 2 }; 1455static const unsigned int mt8195_pcm_hdmidp_channels[] = { 2, 4, 6, 8 }; 1456static const unsigned int mt8195_pcm_rates[] = { 48000 }; 1457 1458static const struct snd_pcm_hw_constraint_list mt8195_rate_constraint = { 1459 .list = mt8195_pcm_rates, 1460 .count = ARRAY_SIZE(mt8195_pcm_rates) 1461}; 1462 1463static const struct mtk_pcm_constraints_data mt8195_pcm_constraints[MTK_CONSTRAINT_HDMIDP + 1] = { 1464 [MTK_CONSTRAINT_PLAYBACK] = { 1465 .channels = &(const struct snd_pcm_hw_constraint_list) { 1466 .list = mt8195_pcm_playback_channels, 1467 .count = ARRAY_SIZE(mt8195_pcm_playback_channels) 1468 }, 1469 .rates = &mt8195_rate_constraint, 1470 }, 1471 [MTK_CONSTRAINT_CAPTURE] = { 1472 .channels = &(const struct snd_pcm_hw_constraint_list) { 1473 .list = mt8195_pcm_capture_channels, 1474 .count = ARRAY_SIZE(mt8195_pcm_capture_channels) 1475 }, 1476 .rates = &mt8195_rate_constraint, 1477 }, 1478 [MTK_CONSTRAINT_HDMIDP] = { 1479 .channels = &(const struct snd_pcm_hw_constraint_list) { 1480 .list = mt8195_pcm_hdmidp_channels, 1481 .count = ARRAY_SIZE(mt8195_pcm_hdmidp_channels) 1482 }, 1483 .rates = &mt8195_rate_constraint, 1484 }, 1485}; 1486 1487static const struct mtk_sof_priv mt8195_sof_priv = { 1488 .conn_streams = g_sof_conn_streams, 1489 .num_streams = ARRAY_SIZE(g_sof_conn_streams), 1490 .sof_dai_link_fixup = mt8195_dai_link_fixup 1491}; 1492 1493static const struct mtk_soundcard_pdata mt8195_mt6359_rt1019_rt5682_card = { 1494 .card_name = "mt8195_r1019_5682", 1495 .card_data = &(struct mtk_platform_card_data) { 1496 .card = &mt8195_mt6359_soc_card, 1497 .num_jacks = MT8195_JACK_MAX, 1498 .pcm_constraints = mt8195_pcm_constraints, 1499 .num_pcm_constraints = ARRAY_SIZE(mt8195_pcm_constraints), 1500 .flags = RT1019_SPEAKER_AMP_PRESENT 1501 }, 1502 .sof_priv = &mt8195_sof_priv, 1503 .soc_probe = mt8195_mt6359_soc_card_probe 1504}; 1505 1506static const struct mtk_soundcard_pdata mt8195_mt6359_rt1011_rt5682_card = { 1507 .card_name = "mt8195_r1011_5682", 1508 .card_data = &(struct mtk_platform_card_data) { 1509 .card = &mt8195_mt6359_soc_card, 1510 .num_jacks = MT8195_JACK_MAX, 1511 .pcm_constraints = mt8195_pcm_constraints, 1512 .num_pcm_constraints = ARRAY_SIZE(mt8195_pcm_constraints), 1513 .flags = RT1011_SPEAKER_AMP_PRESENT 1514 }, 1515 .sof_priv = &mt8195_sof_priv, 1516 .soc_probe = mt8195_mt6359_soc_card_probe 1517}; 1518 1519static const struct mtk_soundcard_pdata mt8195_mt6359_max98390_rt5682_card = { 1520 .card_name = "mt8195_m98390_r5682", 1521 .card_data = &(struct mtk_platform_card_data) { 1522 .card = &mt8195_mt6359_soc_card, 1523 .num_jacks = MT8195_JACK_MAX, 1524 .pcm_constraints = mt8195_pcm_constraints, 1525 .num_pcm_constraints = ARRAY_SIZE(mt8195_pcm_constraints), 1526 .flags = MAX98390_SPEAKER_AMP_PRESENT 1527 }, 1528 .sof_priv = &mt8195_sof_priv, 1529 .soc_probe = mt8195_mt6359_soc_card_probe 1530}; 1531 1532static const struct mtk_soundcard_pdata mt8195_mt6359_card = { 1533 .card_name = "mt8195_mt6359", 1534 .card_data = &(struct mtk_platform_card_data) { 1535 .card = &mt8195_mt6359_soc_card, 1536 .num_jacks = MT8195_JACK_MAX, 1537 .pcm_constraints = mt8195_pcm_constraints, 1538 .num_pcm_constraints = ARRAY_SIZE(mt8195_pcm_constraints), 1539 }, 1540 .sof_priv = &mt8195_sof_priv, 1541 .soc_probe = mt8195_mt6359_soc_card_probe 1542}; 1543 1544static const struct of_device_id mt8195_mt6359_dt_match[] = { 1545 { 1546 .compatible = "mediatek,mt8195_mt6359_rt1019_rt5682", 1547 .data = &mt8195_mt6359_rt1019_rt5682_card, 1548 }, 1549 { 1550 .compatible = "mediatek,mt8195_mt6359_rt1011_rt5682", 1551 .data = &mt8195_mt6359_rt1011_rt5682_card, 1552 }, 1553 { 1554 .compatible = "mediatek,mt8195_mt6359_max98390_rt5682", 1555 .data = &mt8195_mt6359_max98390_rt5682_card, 1556 }, 1557 { 1558 .compatible = "mediatek,mt8195_mt6359", 1559 .data = &mt8195_mt6359_card, 1560 }, 1561 {}, 1562}; 1563MODULE_DEVICE_TABLE(of, mt8195_mt6359_dt_match); 1564 1565static struct platform_driver mt8195_mt6359_driver = { 1566 .driver = { 1567 .name = "mt8195_mt6359", 1568 .of_match_table = mt8195_mt6359_dt_match, 1569 .pm = &snd_soc_pm_ops, 1570 }, 1571 .probe = mtk_soundcard_common_probe, 1572}; 1573 1574module_platform_driver(mt8195_mt6359_driver); 1575 1576/* Module information */ 1577MODULE_DESCRIPTION("MT8195-MT6359 ALSA SoC machine driver"); 1578MODULE_AUTHOR("Trevor Wu <trevor.wu@mediatek.com>"); 1579MODULE_AUTHOR("YC Hung <yc.hung@mediatek.com>"); 1580MODULE_LICENSE("GPL"); 1581MODULE_ALIAS("mt8195_mt6359 soc card");
~/
Read-only file preview.