FILE
mt8189-nau8825.c
File preview with syntax highlighting.
linux-6.19.14/sound/soc/mediatek/mt8189/mt8189-nau8825.c
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * mt8189-nau8825.c -- mt8189 nau8825 ALSA SoC machine driver 4 * 5 * Copyright (c) 2025 MediaTek Inc. 6 * Author: Darren Ye <darren.ye@mediatek.com> 7 */ 8 9#include <linux/input.h> 10#include <linux/module.h> 11#include <linux/of_device.h> 12#include <linux/pm_runtime.h> 13 14#include <sound/soc.h> 15#include <sound/jack.h> 16#include <sound/pcm_params.h> 17 18#include "mt8189-afe-common.h" 19 20#include "../common/mtk-soc-card.h" 21#include "../common/mtk-soundcard-driver.h" 22#include "../common/mtk-afe-platform-driver.h" 23 24#include "../../codecs/cs35l41.h" 25#include "../../codecs/nau8825.h" 26#include "../../codecs/rt5682s.h" 27#include "../../codecs/rt5682.h" 28 29#define NAU8825_HS_PRESENT BIT(0) 30#define RT5682S_HS_PRESENT BIT(1) 31#define RT5650_HS_PRESENT BIT(2) 32#define RT5682I_HS_PRESENT BIT(3) 33#define ES8326_HS_PRESENT BIT(4) 34 35/* 36 * Nau88l25 37 */ 38#define NAU8825_CODEC_DAI "nau8825-hifi" 39 40/* 41 * Rt5682s 42 */ 43#define RT5682S_CODEC_DAI "rt5682s-aif1" 44 45/* 46 * Rt5650 47 */ 48#define RT5650_CODEC_DAI "rt5645-aif1" 49 50/* 51 * Rt5682i 52 */ 53#define RT5682I_CODEC_DAI "rt5682-aif1" 54 55/* 56 * Cs35l41 57 */ 58#define CS35L41_CODEC_DAI "cs35l41-pcm" 59#define CS35L41_DEV0_NAME "cs35l41.7-0040" 60#define CS35L41_DEV1_NAME "cs35l41.7-0042" 61 62/* 63 * ES8326 64 */ 65#define ES8326_CODEC_DAI "ES8326 HiFi" 66 67enum mt8189_jacks { 68 MT8189_JACK_HEADSET, 69 MT8189_JACK_DP, 70 MT8189_JACK_HDMI, 71 MT8189_JACK_MAX, 72}; 73 74static struct snd_soc_jack_pin mt8189_dp_jack_pins[] = { 75 { 76 .pin = "DP", 77 .mask = SND_JACK_LINEOUT, 78 }, 79}; 80 81static struct snd_soc_jack_pin mt8189_hdmi_jack_pins[] = { 82 { 83 .pin = "HDMI", 84 .mask = SND_JACK_LINEOUT, 85 }, 86}; 87 88static struct snd_soc_jack_pin mt8189_headset_jack_pins[] = { 89 { 90 .pin = "Headphone Jack", 91 .mask = SND_JACK_HEADPHONE, 92 }, 93 { 94 .pin = "Headset Mic", 95 .mask = SND_JACK_MICROPHONE, 96 }, 97}; 98 99static const struct snd_kcontrol_new mt8189_dumb_spk_controls[] = { 100 SOC_DAPM_PIN_SWITCH("Ext Spk"), 101}; 102 103static const struct snd_soc_dapm_widget mt8189_dumb_spk_widgets[] = { 104 SND_SOC_DAPM_SPK("Ext Spk", NULL), 105}; 106 107static const struct snd_soc_dapm_widget mt8189_headset_widgets[] = { 108 SND_SOC_DAPM_HP("Headphone Jack", NULL), 109 SND_SOC_DAPM_MIC("Headset Mic", NULL), 110}; 111 112static const struct snd_kcontrol_new mt8189_headset_controls[] = { 113 SOC_DAPM_PIN_SWITCH("Headphone Jack"), 114 SOC_DAPM_PIN_SWITCH("Headset Mic"), 115}; 116 117static const struct snd_soc_dapm_widget mt8189_nau8825_card_widgets[] = { 118 SND_SOC_DAPM_SINK("DP"), 119}; 120 121static int mt8189_common_i2s_startup(struct snd_pcm_substream *substream) 122{ 123 static const unsigned int rates[] = { 124 48000, 125 }; 126 static const struct snd_pcm_hw_constraint_list constraints_rates = { 127 .count = ARRAY_SIZE(rates), 128 .list = rates, 129 }; 130 131 return snd_pcm_hw_constraint_list(substream->runtime, 0, 132 SNDRV_PCM_HW_PARAM_RATE, 133 &constraints_rates); 134} 135 136static int mt8189_common_i2s_hw_params(struct snd_pcm_substream *substream, 137 struct snd_pcm_hw_params *params) 138{ 139 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 140 unsigned int rate = params_rate(params); 141 unsigned int mclk_fs_ratio = 128; 142 unsigned int mclk_fs = rate * mclk_fs_ratio; 143 struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); 144 145 return snd_soc_dai_set_sysclk(cpu_dai, 146 0, mclk_fs, SND_SOC_CLOCK_OUT); 147} 148 149static const struct snd_soc_ops mt8189_common_i2s_ops = { 150 .startup = mt8189_common_i2s_startup, 151 .hw_params = mt8189_common_i2s_hw_params, 152}; 153 154static int mt8189_dptx_hw_params(struct snd_pcm_substream *substream, 155 struct snd_pcm_hw_params *params) 156{ 157 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 158 unsigned int rate = params_rate(params); 159 unsigned int mclk_fs_ratio = 256; 160 unsigned int mclk_fs = rate * mclk_fs_ratio; 161 struct snd_soc_dai *dai = snd_soc_rtd_to_cpu(rtd, 0); 162 163 return snd_soc_dai_set_sysclk(dai, 0, mclk_fs, SND_SOC_CLOCK_OUT); 164} 165 166static const struct snd_soc_ops mt8189_dptx_ops = { 167 .hw_params = mt8189_dptx_hw_params, 168}; 169 170static int mt8189_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, 171 struct snd_pcm_hw_params *params) 172{ 173 dev_dbg(rtd->dev, "%s(), fix format to 32bit\n", __func__); 174 175 /* fix BE i2s format to 32bit, clean param mask first */ 176 snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT), 177 0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST); 178 179 params_set_format(params, SNDRV_PCM_FORMAT_S32_LE); 180 181 return 0; 182} 183 184static const struct snd_soc_ops mt8189_pcm_ops = { 185 .startup = mt8189_common_i2s_startup, 186}; 187 188static int mt8189_nau8825_hw_params(struct snd_pcm_substream *substream, 189 struct snd_pcm_hw_params *params) 190{ 191 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 192 struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0); 193 unsigned int rate = params_rate(params); 194 unsigned int bit_width = params_width(params); 195 int clk_freq, ret; 196 197 clk_freq = rate * 2 * bit_width; 198 dev_dbg(codec_dai->dev, "clk_freq %d, rate: %d, bit_width: %d\n", 199 clk_freq, rate, bit_width); 200 201 /* Configure clock for codec */ 202 ret = snd_soc_dai_set_sysclk(codec_dai, NAU8825_CLK_FLL_BLK, 0, 203 SND_SOC_CLOCK_IN); 204 if (ret < 0) { 205 dev_err(codec_dai->dev, "can't set BCLK clock %d\n", ret); 206 return ret; 207 } 208 209 /* Configure pll for codec */ 210 ret = snd_soc_dai_set_pll(codec_dai, 0, 0, clk_freq, 211 rate * 256); 212 if (ret < 0) { 213 dev_err(codec_dai->dev, "can't set BCLK: %d\n", ret); 214 return ret; 215 } 216 217 return 0; 218} 219 220static const struct snd_soc_ops mt8189_nau8825_ops = { 221 .startup = mt8189_common_i2s_startup, 222 .hw_params = mt8189_nau8825_hw_params, 223}; 224 225static int mt8189_rtxxxx_i2s_hw_params(struct snd_pcm_substream *substream, 226 struct snd_pcm_hw_params *params) 227{ 228 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 229 struct snd_soc_card *card = rtd->card; 230 struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); 231 struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0); 232 unsigned int rate = params_rate(params); 233 int bitwidth; 234 int ret; 235 236 bitwidth = snd_pcm_format_width(params_format(params)); 237 if (bitwidth < 0) { 238 dev_err(card->dev, "invalid bit width: %d\n", bitwidth); 239 return bitwidth; 240 } 241 242 ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth); 243 if (ret) { 244 dev_err(card->dev, "failed to set tdm slot\n"); 245 return ret; 246 } 247 248 ret = snd_soc_dai_set_pll(codec_dai, 0, 1, rate * 32, rate * 512); 249 if (ret) { 250 dev_err(card->dev, "failed to set pll\n"); 251 return ret; 252 } 253 254 ret = snd_soc_dai_set_sysclk(codec_dai, 1, rate * 512, SND_SOC_CLOCK_IN); 255 if (ret) { 256 dev_err(card->dev, "failed to set sysclk\n"); 257 return ret; 258 } 259 260 return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 512, 261 SND_SOC_CLOCK_OUT); 262} 263 264static const struct snd_soc_ops mt8189_rtxxxx_i2s_ops = { 265 .startup = mt8189_common_i2s_startup, 266 .hw_params = mt8189_rtxxxx_i2s_hw_params, 267}; 268 269static int mt8189_cs35l41_i2s_hw_params(struct snd_pcm_substream *substream, 270 struct snd_pcm_hw_params *params) 271{ 272 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 273 unsigned int rate = params_rate(params); 274 unsigned int mclk_fs = rate * 128; 275 struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); 276 struct snd_soc_dai *codec_dai; 277 int clk_freq = rate * 32; 278 int rx_slot[] = {0, 1}; 279 int i, ret; 280 281 for_each_rtd_codec_dais(rtd, i, codec_dai) { 282 ret = snd_soc_component_set_sysclk(codec_dai->component, 283 CS35L41_CLKID_SCLK, 0, 284 clk_freq, SND_SOC_CLOCK_IN); 285 if (ret < 0) { 286 dev_err(codec_dai->dev, "set component sysclk fail: %d\n", 287 ret); 288 return ret; 289 } 290 291 ret = snd_soc_dai_set_sysclk(codec_dai, CS35L41_CLKID_SCLK, 292 clk_freq, SND_SOC_CLOCK_IN); 293 if (ret < 0) { 294 dev_err(codec_dai->dev, "set sysclk fail: %d\n", 295 ret); 296 return ret; 297 } 298 299 ret = snd_soc_dai_set_channel_map(codec_dai, 0, NULL, 300 1, &rx_slot[i]); 301 if (ret < 0) { 302 dev_err(codec_dai->dev, "set channel map fail: %d\n", 303 ret); 304 return ret; 305 } 306 } 307 308 return snd_soc_dai_set_sysclk(cpu_dai, 309 0, mclk_fs, SND_SOC_CLOCK_OUT); 310} 311 312static const struct snd_soc_ops mt8189_cs35l41_i2s_ops = { 313 .startup = mt8189_common_i2s_startup, 314 .hw_params = mt8189_cs35l41_i2s_hw_params, 315}; 316 317static int mt8189_es8326_hw_params(struct snd_pcm_substream *substream, 318 struct snd_pcm_hw_params *params) 319{ 320 struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); 321 struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); 322 struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0); 323 unsigned int rate = params_rate(params); 324 int ret; 325 326 /* Configure MCLK for codec */ 327 ret = snd_soc_dai_set_sysclk(codec_dai, 0, rate * 256, SND_SOC_CLOCK_IN); 328 if (ret < 0) { 329 dev_err(codec_dai->dev, "can't set MCLK %d\n", ret); 330 return ret; 331 } 332 333 /* Configure MCLK for cpu */ 334 return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 256, SND_SOC_CLOCK_OUT); 335} 336 337static const struct snd_soc_ops mt8189_es8326_ops = { 338 .startup = mt8189_common_i2s_startup, 339 .hw_params = mt8189_es8326_hw_params, 340}; 341 342static int mt8189_dumb_amp_init(struct snd_soc_pcm_runtime *rtd) 343{ 344 struct snd_soc_card *card = rtd->card; 345 int ret; 346 347 ret = snd_soc_dapm_new_controls(&card->dapm, mt8189_dumb_spk_widgets, 348 ARRAY_SIZE(mt8189_dumb_spk_widgets)); 349 if (ret) { 350 dev_err(rtd->dev, "unable to add Dumb Speaker dapm, ret %d\n", ret); 351 return ret; 352 } 353 354 ret = snd_soc_add_card_controls(card, mt8189_dumb_spk_controls, 355 ARRAY_SIZE(mt8189_dumb_spk_controls)); 356 if (ret) { 357 dev_err(rtd->dev, "unable to add Dumb card controls, ret %d\n", ret); 358 return ret; 359 } 360 361 return 0; 362} 363 364static int mt8189_dptx_codec_init(struct snd_soc_pcm_runtime *rtd) 365{ 366 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card); 367 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8189_JACK_DP]; 368 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component; 369 int ret; 370 371 ret = snd_soc_card_jack_new_pins(rtd->card, "DP Jack", SND_JACK_LINEOUT, 372 jack, mt8189_dp_jack_pins, 373 ARRAY_SIZE(mt8189_dp_jack_pins)); 374 if (ret) { 375 dev_err(rtd->dev, "%s, new jack failed: %d\n", __func__, ret); 376 return ret; 377 } 378 379 ret = snd_soc_component_set_jack(component, jack, NULL); 380 if (ret) { 381 dev_err(rtd->dev, "%s, set jack failed on %s (ret=%d)\n", 382 __func__, component->name, ret); 383 return ret; 384 } 385 386 return 0; 387} 388 389static int mt8189_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd) 390{ 391 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card); 392 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8189_JACK_HDMI]; 393 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component; 394 int ret; 395 396 ret = snd_soc_card_jack_new_pins(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, 397 jack, mt8189_hdmi_jack_pins, 398 ARRAY_SIZE(mt8189_hdmi_jack_pins)); 399 if (ret) { 400 dev_err(rtd->dev, "%s, new jack failed: %d\n", __func__, ret); 401 return ret; 402 } 403 404 ret = snd_soc_component_set_jack(component, jack, NULL); 405 if (ret) { 406 dev_err(rtd->dev, "%s, set jack failed on %s (ret=%d)\n", 407 __func__, component->name, ret); 408 return ret; 409 } 410 411 return 0; 412} 413 414static int mt8189_headset_codec_init(struct snd_soc_pcm_runtime *rtd) 415{ 416 struct snd_soc_card *card = rtd->card; 417 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card); 418 struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8189_JACK_HEADSET]; 419 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component; 420 struct mtk_platform_card_data *card_data = soc_card_data->card_data; 421 int ret; 422 int type; 423 424 ret = snd_soc_dapm_new_controls(&card->dapm, mt8189_headset_widgets, 425 ARRAY_SIZE(mt8189_headset_widgets)); 426 if (ret) { 427 dev_err(rtd->dev, "unable to add nau8825 card widget, ret %d\n", ret); 428 return ret; 429 } 430 431 ret = snd_soc_add_card_controls(card, mt8189_headset_controls, 432 ARRAY_SIZE(mt8189_headset_controls)); 433 if (ret) { 434 dev_err(rtd->dev, "unable to add nau8825 card controls, ret %d\n", ret); 435 return ret; 436 } 437 438 ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack", 439 SND_JACK_HEADSET | SND_JACK_BTN_0 | 440 SND_JACK_BTN_1 | SND_JACK_BTN_2 | 441 SND_JACK_BTN_3, 442 jack, 443 mt8189_headset_jack_pins, 444 ARRAY_SIZE(mt8189_headset_jack_pins)); 445 if (ret) { 446 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret); 447 return ret; 448 } 449 450 if (card_data->flags & ES8326_HS_PRESENT) { 451 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); 452 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOLUMEUP); 453 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEDOWN); 454 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOICECOMMAND); 455 } else { 456 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); 457 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND); 458 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP); 459 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN); 460 } 461 462 type = SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2 | SND_JACK_BTN_3; 463 ret = snd_soc_component_set_jack(component, jack, (void *)&type); 464 if (ret) { 465 dev_err(rtd->dev, "Headset Jack call-back failed: %d\n", ret); 466 return ret; 467 } 468 469 return 0; 470}; 471 472static void mt8189_headset_codec_exit(struct snd_soc_pcm_runtime *rtd) 473{ 474 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component; 475 476 snd_soc_component_set_jack(component, NULL, NULL); 477} 478 479/* FE */ 480SND_SOC_DAILINK_DEFS(playback0, 481 DAILINK_COMP_ARRAY(COMP_CPU("DL0")), 482 DAILINK_COMP_ARRAY(COMP_DUMMY()), 483 DAILINK_COMP_ARRAY(COMP_EMPTY())); 484SND_SOC_DAILINK_DEFS(playback1, 485 DAILINK_COMP_ARRAY(COMP_CPU("DL1")), 486 DAILINK_COMP_ARRAY(COMP_DUMMY()), 487 DAILINK_COMP_ARRAY(COMP_EMPTY())); 488SND_SOC_DAILINK_DEFS(playback2, 489 DAILINK_COMP_ARRAY(COMP_CPU("DL2")), 490 DAILINK_COMP_ARRAY(COMP_DUMMY()), 491 DAILINK_COMP_ARRAY(COMP_EMPTY())); 492SND_SOC_DAILINK_DEFS(playback3, 493 DAILINK_COMP_ARRAY(COMP_CPU("DL3")), 494 DAILINK_COMP_ARRAY(COMP_DUMMY()), 495 DAILINK_COMP_ARRAY(COMP_EMPTY())); 496SND_SOC_DAILINK_DEFS(playback4, 497 DAILINK_COMP_ARRAY(COMP_CPU("DL4")), 498 DAILINK_COMP_ARRAY(COMP_DUMMY()), 499 DAILINK_COMP_ARRAY(COMP_EMPTY())); 500SND_SOC_DAILINK_DEFS(playback5, 501 DAILINK_COMP_ARRAY(COMP_CPU("DL5")), 502 DAILINK_COMP_ARRAY(COMP_DUMMY()), 503 DAILINK_COMP_ARRAY(COMP_EMPTY())); 504SND_SOC_DAILINK_DEFS(playback6, 505 DAILINK_COMP_ARRAY(COMP_CPU("DL6")), 506 DAILINK_COMP_ARRAY(COMP_DUMMY()), 507 DAILINK_COMP_ARRAY(COMP_EMPTY())); 508SND_SOC_DAILINK_DEFS(playback7, 509 DAILINK_COMP_ARRAY(COMP_CPU("DL7")), 510 DAILINK_COMP_ARRAY(COMP_DUMMY()), 511 DAILINK_COMP_ARRAY(COMP_EMPTY())); 512SND_SOC_DAILINK_DEFS(playback8, 513 DAILINK_COMP_ARRAY(COMP_CPU("DL8")), 514 DAILINK_COMP_ARRAY(COMP_DUMMY()), 515 DAILINK_COMP_ARRAY(COMP_EMPTY())); 516SND_SOC_DAILINK_DEFS(playback23, 517 DAILINK_COMP_ARRAY(COMP_CPU("DL23")), 518 DAILINK_COMP_ARRAY(COMP_DUMMY()), 519 DAILINK_COMP_ARRAY(COMP_EMPTY())); 520SND_SOC_DAILINK_DEFS(playback24, 521 DAILINK_COMP_ARRAY(COMP_CPU("DL24")), 522 DAILINK_COMP_ARRAY(COMP_DUMMY()), 523 DAILINK_COMP_ARRAY(COMP_EMPTY())); 524SND_SOC_DAILINK_DEFS(playback25, 525 DAILINK_COMP_ARRAY(COMP_CPU("DL25")), 526 DAILINK_COMP_ARRAY(COMP_DUMMY()), 527 DAILINK_COMP_ARRAY(COMP_EMPTY())); 528SND_SOC_DAILINK_DEFS(playback_24ch, 529 DAILINK_COMP_ARRAY(COMP_CPU("DL_24CH")), 530 DAILINK_COMP_ARRAY(COMP_DUMMY()), 531 DAILINK_COMP_ARRAY(COMP_EMPTY())); 532SND_SOC_DAILINK_DEFS(capture0, 533 DAILINK_COMP_ARRAY(COMP_CPU("UL0")), 534 DAILINK_COMP_ARRAY(COMP_DUMMY()), 535 DAILINK_COMP_ARRAY(COMP_EMPTY())); 536SND_SOC_DAILINK_DEFS(capture1, 537 DAILINK_COMP_ARRAY(COMP_CPU("UL1")), 538 DAILINK_COMP_ARRAY(COMP_DUMMY()), 539 DAILINK_COMP_ARRAY(COMP_EMPTY())); 540SND_SOC_DAILINK_DEFS(capture2, 541 DAILINK_COMP_ARRAY(COMP_CPU("UL2")), 542 DAILINK_COMP_ARRAY(COMP_DUMMY()), 543 DAILINK_COMP_ARRAY(COMP_EMPTY())); 544SND_SOC_DAILINK_DEFS(capture3, 545 DAILINK_COMP_ARRAY(COMP_CPU("UL3")), 546 DAILINK_COMP_ARRAY(COMP_DUMMY()), 547 DAILINK_COMP_ARRAY(COMP_EMPTY())); 548SND_SOC_DAILINK_DEFS(capture4, 549 DAILINK_COMP_ARRAY(COMP_CPU("UL4")), 550 DAILINK_COMP_ARRAY(COMP_DUMMY()), 551 DAILINK_COMP_ARRAY(COMP_EMPTY())); 552SND_SOC_DAILINK_DEFS(capture5, 553 DAILINK_COMP_ARRAY(COMP_CPU("UL5")), 554 DAILINK_COMP_ARRAY(COMP_DUMMY()), 555 DAILINK_COMP_ARRAY(COMP_EMPTY())); 556SND_SOC_DAILINK_DEFS(capture6, 557 DAILINK_COMP_ARRAY(COMP_CPU("UL6")), 558 DAILINK_COMP_ARRAY(COMP_DUMMY()), 559 DAILINK_COMP_ARRAY(COMP_EMPTY())); 560SND_SOC_DAILINK_DEFS(capture7, 561 DAILINK_COMP_ARRAY(COMP_CPU("UL7")), 562 DAILINK_COMP_ARRAY(COMP_DUMMY()), 563 DAILINK_COMP_ARRAY(COMP_EMPTY())); 564SND_SOC_DAILINK_DEFS(capture8, 565 DAILINK_COMP_ARRAY(COMP_CPU("UL8")), 566 DAILINK_COMP_ARRAY(COMP_DUMMY()), 567 DAILINK_COMP_ARRAY(COMP_EMPTY())); 568SND_SOC_DAILINK_DEFS(capture9, 569 DAILINK_COMP_ARRAY(COMP_CPU("UL9")), 570 DAILINK_COMP_ARRAY(COMP_DUMMY()), 571 DAILINK_COMP_ARRAY(COMP_EMPTY())); 572SND_SOC_DAILINK_DEFS(capture10, 573 DAILINK_COMP_ARRAY(COMP_CPU("UL10")), 574 DAILINK_COMP_ARRAY(COMP_DUMMY()), 575 DAILINK_COMP_ARRAY(COMP_EMPTY())); 576SND_SOC_DAILINK_DEFS(capture24, 577 DAILINK_COMP_ARRAY(COMP_CPU("UL24")), 578 DAILINK_COMP_ARRAY(COMP_DUMMY()), 579 DAILINK_COMP_ARRAY(COMP_EMPTY())); 580SND_SOC_DAILINK_DEFS(capture25, 581 DAILINK_COMP_ARRAY(COMP_CPU("UL25")), 582 DAILINK_COMP_ARRAY(COMP_DUMMY()), 583 DAILINK_COMP_ARRAY(COMP_EMPTY())); 584SND_SOC_DAILINK_DEFS(capture_cm0, 585 DAILINK_COMP_ARRAY(COMP_CPU("UL_CM0")), 586 DAILINK_COMP_ARRAY(COMP_DUMMY()), 587 DAILINK_COMP_ARRAY(COMP_EMPTY())); 588SND_SOC_DAILINK_DEFS(capture_cm1, 589 DAILINK_COMP_ARRAY(COMP_CPU("UL_CM1")), 590 DAILINK_COMP_ARRAY(COMP_DUMMY()), 591 DAILINK_COMP_ARRAY(COMP_EMPTY())); 592SND_SOC_DAILINK_DEFS(capture_etdm_in0, 593 DAILINK_COMP_ARRAY(COMP_CPU("UL_ETDM_IN0")), 594 DAILINK_COMP_ARRAY(COMP_DUMMY()), 595 DAILINK_COMP_ARRAY(COMP_EMPTY())); 596SND_SOC_DAILINK_DEFS(capture_etdm_in1, 597 DAILINK_COMP_ARRAY(COMP_CPU("UL_ETDM_IN1")), 598 DAILINK_COMP_ARRAY(COMP_DUMMY()), 599 DAILINK_COMP_ARRAY(COMP_EMPTY())); 600SND_SOC_DAILINK_DEFS(playback_hdmi, 601 DAILINK_COMP_ARRAY(COMP_CPU("HDMI")), 602 DAILINK_COMP_ARRAY(COMP_DUMMY()), 603 DAILINK_COMP_ARRAY(COMP_EMPTY())); 604/* BE */ 605SND_SOC_DAILINK_DEFS(ap_dmic, 606 DAILINK_COMP_ARRAY(COMP_CPU("AP_DMIC")), 607 DAILINK_COMP_ARRAY(COMP_DUMMY()), 608 DAILINK_COMP_ARRAY(COMP_EMPTY())); 609SND_SOC_DAILINK_DEFS(ap_dmic_ch34, 610 DAILINK_COMP_ARRAY(COMP_CPU("AP_DMIC_CH34")), 611 DAILINK_COMP_ARRAY(COMP_DUMMY()), 612 DAILINK_COMP_ARRAY(COMP_EMPTY())); 613SND_SOC_DAILINK_DEFS(i2sin0, 614 DAILINK_COMP_ARRAY(COMP_CPU("I2SIN0")), 615 DAILINK_COMP_ARRAY(COMP_DUMMY()), 616 DAILINK_COMP_ARRAY(COMP_EMPTY())); 617SND_SOC_DAILINK_DEFS(i2sin1, 618 DAILINK_COMP_ARRAY(COMP_CPU("I2SIN1")), 619 DAILINK_COMP_ARRAY(COMP_DUMMY()), 620 DAILINK_COMP_ARRAY(COMP_EMPTY())); 621SND_SOC_DAILINK_DEFS(i2sout0, 622 DAILINK_COMP_ARRAY(COMP_CPU("I2SOUT0")), 623 DAILINK_COMP_ARRAY(COMP_DUMMY()), 624 DAILINK_COMP_ARRAY(COMP_EMPTY())); 625SND_SOC_DAILINK_DEFS(i2sout1, 626 DAILINK_COMP_ARRAY(COMP_CPU("I2SOUT1")), 627 DAILINK_COMP_ARRAY(COMP_DUMMY()), 628 DAILINK_COMP_ARRAY(COMP_EMPTY())); 629SND_SOC_DAILINK_DEFS(pcm0, 630 DAILINK_COMP_ARRAY(COMP_CPU("PCM 0")), 631 DAILINK_COMP_ARRAY(COMP_DUMMY()), 632 DAILINK_COMP_ARRAY(COMP_EMPTY())); 633SND_SOC_DAILINK_DEFS(tdm_dptx, 634 DAILINK_COMP_ARRAY(COMP_CPU("TDM_DPTX")), 635 DAILINK_COMP_ARRAY(COMP_DUMMY()), 636 DAILINK_COMP_ARRAY(COMP_EMPTY())); 637 638static struct snd_soc_dai_link mt8189_nau8825_dai_links[] = { 639 /* Front End DAI links */ 640 { 641 .name = "DL0_FE", 642 .stream_name = "DL0 Playback", 643 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 644 SND_SOC_DPCM_TRIGGER_PRE}, 645 .dynamic = 1, 646 .playback_only = 1, 647 .dpcm_merged_format = 1, 648 SND_SOC_DAILINK_REG(playback0), 649 }, 650 { 651 .name = "DL1_FE", 652 .stream_name = "DL1 Playback", 653 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 654 SND_SOC_DPCM_TRIGGER_PRE}, 655 .dynamic = 1, 656 .playback_only = 1, 657 .dpcm_merged_format = 1, 658 SND_SOC_DAILINK_REG(playback1), 659 }, 660 { 661 .name = "UL0_FE", 662 .stream_name = "UL0 Capture", 663 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 664 SND_SOC_DPCM_TRIGGER_PRE}, 665 .dynamic = 1, 666 .capture_only = 1, 667 .dpcm_merged_format = 1, 668 SND_SOC_DAILINK_REG(capture0), 669 }, 670 { 671 .name = "UL1_FE", 672 .stream_name = "UL1 Capture", 673 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 674 SND_SOC_DPCM_TRIGGER_PRE}, 675 .dynamic = 1, 676 .capture_only = 1, 677 .dpcm_merged_format = 1, 678 SND_SOC_DAILINK_REG(capture1), 679 }, 680 { 681 .name = "UL2_FE", 682 .stream_name = "UL2 Capture", 683 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 684 SND_SOC_DPCM_TRIGGER_PRE}, 685 .dynamic = 1, 686 .capture_only = 1, 687 .dpcm_merged_format = 1, 688 SND_SOC_DAILINK_REG(capture2), 689 }, 690 { 691 .name = "HDMI_FE", 692 .stream_name = "HDMI Playback", 693 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 694 SND_SOC_DPCM_TRIGGER_PRE}, 695 .dynamic = 1, 696 .playback_only = 1, 697 SND_SOC_DAILINK_REG(playback_hdmi), 698 }, 699 { 700 .name = "DL2_FE", 701 .stream_name = "DL2 Playback", 702 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 703 SND_SOC_DPCM_TRIGGER_PRE}, 704 .dynamic = 1, 705 .playback_only = 1, 706 SND_SOC_DAILINK_REG(playback2), 707 }, 708 { 709 .name = "DL3_FE", 710 .stream_name = "DL3 Playback", 711 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 712 SND_SOC_DPCM_TRIGGER_PRE}, 713 .dynamic = 1, 714 .playback_only = 1, 715 SND_SOC_DAILINK_REG(playback3), 716 }, 717 { 718 .name = "DL4_FE", 719 .stream_name = "DL4 Playback", 720 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 721 SND_SOC_DPCM_TRIGGER_PRE}, 722 .dynamic = 1, 723 .playback_only = 1, 724 SND_SOC_DAILINK_REG(playback4), 725 }, 726 { 727 .name = "DL5_FE", 728 .stream_name = "DL5 Playback", 729 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 730 SND_SOC_DPCM_TRIGGER_PRE}, 731 .dynamic = 1, 732 .playback_only = 1, 733 SND_SOC_DAILINK_REG(playback5), 734 }, 735 { 736 .name = "DL6_FE", 737 .stream_name = "DL6 Playback", 738 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 739 SND_SOC_DPCM_TRIGGER_PRE}, 740 .dynamic = 1, 741 .playback_only = 1, 742 SND_SOC_DAILINK_REG(playback6), 743 }, 744 { 745 .name = "DL7_FE", 746 .stream_name = "DL7 Playback", 747 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 748 SND_SOC_DPCM_TRIGGER_PRE}, 749 .dynamic = 1, 750 .playback_only = 1, 751 SND_SOC_DAILINK_REG(playback7), 752 }, 753 { 754 .name = "DL8 FE", 755 .stream_name = "DL8 Playback", 756 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 757 SND_SOC_DPCM_TRIGGER_PRE}, 758 .dynamic = 1, 759 .playback_only = 1, 760 SND_SOC_DAILINK_REG(playback8), 761 }, 762 { 763 .name = "DL23 FE", 764 .stream_name = "DL23 Playback", 765 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 766 SND_SOC_DPCM_TRIGGER_PRE}, 767 .dynamic = 1, 768 .playback_only = 1, 769 SND_SOC_DAILINK_REG(playback23), 770 }, 771 { 772 .name = "DL24 FE", 773 .stream_name = "DL24 Playback", 774 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 775 SND_SOC_DPCM_TRIGGER_PRE}, 776 .dynamic = 1, 777 .playback_only = 1, 778 SND_SOC_DAILINK_REG(playback24), 779 }, 780 { 781 .name = "DL25 FE", 782 .stream_name = "DL25 Playback", 783 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 784 SND_SOC_DPCM_TRIGGER_PRE}, 785 .dynamic = 1, 786 .playback_only = 1, 787 SND_SOC_DAILINK_REG(playback25), 788 }, 789 { 790 .name = "DL_24CH_FE", 791 .stream_name = "DL_24CH Playback", 792 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 793 SND_SOC_DPCM_TRIGGER_PRE}, 794 .dynamic = 1, 795 .playback_only = 1, 796 SND_SOC_DAILINK_REG(playback_24ch), 797 }, 798 { 799 .name = "UL9_FE", 800 .stream_name = "UL9 Capture", 801 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 802 SND_SOC_DPCM_TRIGGER_PRE}, 803 .dynamic = 1, 804 .capture_only = 1, 805 SND_SOC_DAILINK_REG(capture9), 806 }, 807 { 808 .name = "UL3_FE", 809 .stream_name = "UL3 Capture", 810 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 811 SND_SOC_DPCM_TRIGGER_PRE}, 812 .dynamic = 1, 813 .capture_only = 1, 814 SND_SOC_DAILINK_REG(capture3), 815 }, 816 { 817 .name = "UL7_FE", 818 .stream_name = "UL7 Capture", 819 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 820 SND_SOC_DPCM_TRIGGER_PRE}, 821 .dynamic = 1, 822 .capture_only = 1, 823 SND_SOC_DAILINK_REG(capture7), 824 }, 825 { 826 .name = "UL4_FE", 827 .stream_name = "UL4 Capture", 828 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 829 SND_SOC_DPCM_TRIGGER_PRE}, 830 .dynamic = 1, 831 .capture_only = 1, 832 SND_SOC_DAILINK_REG(capture4), 833 }, 834 { 835 .name = "UL5_FE", 836 .stream_name = "UL5 Capture", 837 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 838 SND_SOC_DPCM_TRIGGER_PRE}, 839 .dynamic = 1, 840 .capture_only = 1, 841 SND_SOC_DAILINK_REG(capture5), 842 }, 843 { 844 .name = "UL_CM0_FE", 845 .stream_name = "UL_CM0 Capture", 846 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 847 SND_SOC_DPCM_TRIGGER_PRE}, 848 .dynamic = 1, 849 .capture_only = 1, 850 SND_SOC_DAILINK_REG(capture_cm0), 851 }, 852 { 853 .name = "UL_CM1_FE", 854 .stream_name = "UL_CM1 Capture", 855 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 856 SND_SOC_DPCM_TRIGGER_PRE}, 857 .dynamic = 1, 858 .capture_only = 1, 859 SND_SOC_DAILINK_REG(capture_cm1), 860 }, 861 { 862 .name = "UL10_FE", 863 .stream_name = "UL10 Capture", 864 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 865 SND_SOC_DPCM_TRIGGER_PRE}, 866 .dynamic = 1, 867 .capture_only = 1, 868 SND_SOC_DAILINK_REG(capture10), 869 }, 870 { 871 .name = "UL6_FE", 872 .stream_name = "UL6 Capture", 873 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 874 SND_SOC_DPCM_TRIGGER_PRE}, 875 .dynamic = 1, 876 .capture_only = 1, 877 SND_SOC_DAILINK_REG(capture6), 878 }, 879 { 880 .name = "UL25_FE", 881 .stream_name = "UL25 Capture", 882 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 883 SND_SOC_DPCM_TRIGGER_PRE}, 884 .dynamic = 1, 885 .capture_only = 1, 886 SND_SOC_DAILINK_REG(capture25), 887 }, 888 { 889 .name = "UL8_FE", 890 .stream_name = "UL8 Capture_Mono_1", 891 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 892 SND_SOC_DPCM_TRIGGER_PRE}, 893 .dynamic = 1, 894 .capture_only = 1, 895 SND_SOC_DAILINK_REG(capture8), 896 }, 897 { 898 .name = "UL24_FE", 899 .stream_name = "UL24 Capture_Mono_2", 900 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 901 SND_SOC_DPCM_TRIGGER_PRE}, 902 .dynamic = 1, 903 .capture_only = 1, 904 SND_SOC_DAILINK_REG(capture24), 905 }, 906 { 907 .name = "UL_ETDM_In0_FE", 908 .stream_name = "UL_ETDM_In0 Capture", 909 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 910 SND_SOC_DPCM_TRIGGER_PRE}, 911 .dynamic = 1, 912 .capture_only = 1, 913 SND_SOC_DAILINK_REG(capture_etdm_in0), 914 }, 915 { 916 .name = "UL_ETDM_In1_FE", 917 .stream_name = "UL_ETDM_In1 Capture", 918 .trigger = {SND_SOC_DPCM_TRIGGER_PRE, 919 SND_SOC_DPCM_TRIGGER_PRE}, 920 .dynamic = 1, 921 .capture_only = 1, 922 SND_SOC_DAILINK_REG(capture_etdm_in1), 923 }, 924 /* Back End DAI links */ 925 { 926 .name = "I2SIN0_BE", 927 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBC_CFC 928 | SND_SOC_DAIFMT_GATED, 929 .ops = &mt8189_common_i2s_ops, 930 .no_pcm = 1, 931 .capture_only = 1, 932 .ignore_suspend = 1, 933 SND_SOC_DAILINK_REG(i2sin0), 934 }, 935 { 936 .name = "I2SIN1_BE", 937 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBC_CFC 938 | SND_SOC_DAIFMT_GATED, 939 .ops = &mt8189_common_i2s_ops, 940 .no_pcm = 1, 941 .capture_only = 1, 942 .ignore_suspend = 1, 943 SND_SOC_DAILINK_REG(i2sin1), 944 }, 945 { 946 .name = "I2SOUT0_BE", 947 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBC_CFC 948 | SND_SOC_DAIFMT_GATED, 949 .ops = &mt8189_common_i2s_ops, 950 .no_pcm = 1, 951 .playback_only = 1, 952 .ignore_suspend = 1, 953 SND_SOC_DAILINK_REG(i2sout0), 954 }, 955 { 956 .name = "I2SOUT1_BE", 957 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBC_CFC 958 | SND_SOC_DAIFMT_GATED, 959 .ops = &mt8189_common_i2s_ops, 960 .no_pcm = 1, 961 .playback_only = 1, 962 .ignore_suspend = 1, 963 SND_SOC_DAILINK_REG(i2sout1), 964 }, 965 { 966 .name = "AP_DMIC_BE", 967 .no_pcm = 1, 968 .capture_only = 1, 969 .ignore_suspend = 1, 970 SND_SOC_DAILINK_REG(ap_dmic), 971 }, 972 { 973 .name = "AP_DMIC_CH34_BE", 974 .no_pcm = 1, 975 .capture_only = 1, 976 .ignore_suspend = 1, 977 SND_SOC_DAILINK_REG(ap_dmic_ch34), 978 }, 979 { 980 .name = "TDM_DPTX_BE", 981 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBC_CFC 982 | SND_SOC_DAIFMT_GATED, 983 .ops = &mt8189_dptx_ops, 984 .be_hw_params_fixup = mt8189_dptx_hw_params_fixup, 985 .no_pcm = 1, 986 .playback_only = 1, 987 .ignore_suspend = 1, 988 SND_SOC_DAILINK_REG(tdm_dptx), 989 }, 990 { 991 .name = "PCM_0_BE", 992 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBC_CFC 993 | SND_SOC_DAIFMT_GATED, 994 .no_pcm = 1, 995 .ops = &mt8189_pcm_ops, 996 .playback_only = 1, 997 .ignore_suspend = 1, 998 SND_SOC_DAILINK_REG(pcm0), 999 }, 1000}; 1001 1002static struct snd_soc_codec_conf mt8189_cs35l41_codec_conf[] = { 1003 { 1004 .dlc = COMP_CODEC_CONF(CS35L41_DEV0_NAME), 1005 .name_prefix = "Right", 1006 }, 1007 { 1008 .dlc = COMP_CODEC_CONF(CS35L41_DEV1_NAME), 1009 .name_prefix = "Left", 1010 }, 1011}; 1012 1013static int mt8189_nau8825_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy) 1014{ 1015 struct snd_soc_card *card = soc_card_data->card_data->card; 1016 struct snd_soc_dai_link *dai_link; 1017 bool init_nau8825 = false; 1018 bool init_rt5682s = false; 1019 bool init_rt5650 = false; 1020 bool init_rt5682i = false; 1021 bool init_es8326 = false; 1022 bool init_dumb = false; 1023 int i; 1024 1025 for_each_card_prelinks(card, i, dai_link) { 1026 if (strcmp(dai_link->name, "TDM_DPTX_BE") == 0) { 1027 if (dai_link->num_codecs && 1028 strcmp(dai_link->codecs->dai_name, "snd-soc-dummy-dai")) 1029 dai_link->init = mt8189_dptx_codec_init; 1030 } else if (strcmp(dai_link->name, "PCM_0_BE") == 0) { 1031 if (dai_link->num_codecs && 1032 strcmp(dai_link->codecs->dai_name, "snd-soc-dummy-dai")) 1033 dai_link->init = mt8189_hdmi_codec_init; 1034 } else if (strcmp(dai_link->name, "I2SOUT0_BE") == 0 || 1035 strcmp(dai_link->name, "I2SIN0_BE") == 0) { 1036 if (!strcmp(dai_link->codecs->dai_name, NAU8825_CODEC_DAI)) { 1037 dai_link->ops = &mt8189_nau8825_ops; 1038 if (!init_nau8825) { 1039 dai_link->init = mt8189_headset_codec_init; 1040 dai_link->exit = mt8189_headset_codec_exit; 1041 init_nau8825 = true; 1042 } 1043 } else if (!strcmp(dai_link->codecs->dai_name, RT5682S_CODEC_DAI)) { 1044 dai_link->ops = &mt8189_rtxxxx_i2s_ops; 1045 if (!init_rt5682s) { 1046 dai_link->init = mt8189_headset_codec_init; 1047 dai_link->exit = mt8189_headset_codec_exit; 1048 init_rt5682s = true; 1049 } 1050 } else if (!strcmp(dai_link->codecs->dai_name, RT5650_CODEC_DAI)) { 1051 dai_link->ops = &mt8189_rtxxxx_i2s_ops; 1052 if (!init_rt5650) { 1053 dai_link->init = mt8189_headset_codec_init; 1054 dai_link->exit = mt8189_headset_codec_exit; 1055 init_rt5650 = true; 1056 } 1057 } else if (!strcmp(dai_link->codecs->dai_name, RT5682I_CODEC_DAI)) { 1058 dai_link->ops = &mt8189_rtxxxx_i2s_ops; 1059 if (!init_rt5682i) { 1060 dai_link->init = mt8189_headset_codec_init; 1061 dai_link->exit = mt8189_headset_codec_exit; 1062 init_rt5682i = true; 1063 } 1064 } else if (!strcmp(dai_link->codecs->dai_name, ES8326_CODEC_DAI)) { 1065 dai_link->ops = &mt8189_es8326_ops; 1066 if (!init_es8326) { 1067 dai_link->init = mt8189_headset_codec_init; 1068 dai_link->exit = mt8189_headset_codec_exit; 1069 init_es8326 = true; 1070 } 1071 } else { 1072 if (strcmp(dai_link->codecs->dai_name, "snd-soc-dummy-dai")) { 1073 if (!init_dumb) { 1074 dai_link->init = mt8189_dumb_amp_init; 1075 init_dumb = true; 1076 } 1077 } 1078 } 1079 } else if (strcmp(dai_link->name, "I2SOUT1_BE") == 0) { 1080 if (!strcmp(dai_link->codecs->dai_name, CS35L41_CODEC_DAI)) { 1081 dai_link->ops = &mt8189_cs35l41_i2s_ops; 1082 card->num_configs = ARRAY_SIZE(mt8189_cs35l41_codec_conf); 1083 card->codec_conf = mt8189_cs35l41_codec_conf; 1084 } 1085 } 1086 } 1087 1088 return 0; 1089} 1090 1091static struct snd_soc_card mt8189_nau8825_soc_card = { 1092 .owner = THIS_MODULE, 1093 .dai_link = mt8189_nau8825_dai_links, 1094 .num_links = ARRAY_SIZE(mt8189_nau8825_dai_links), 1095 .dapm_widgets = mt8189_nau8825_card_widgets, 1096 .num_dapm_widgets = ARRAY_SIZE(mt8189_nau8825_card_widgets), 1097}; 1098 1099static const struct mtk_soundcard_pdata mt8189_nau8825_card = { 1100 .card_name = "mt8189_nau8825", 1101 .card_data = &(struct mtk_platform_card_data) { 1102 .card = &mt8189_nau8825_soc_card, 1103 .num_jacks = MT8189_JACK_MAX, 1104 .flags = NAU8825_HS_PRESENT 1105 }, 1106 .sof_priv = NULL, 1107 .soc_probe = mt8189_nau8825_soc_card_probe, 1108}; 1109 1110static const struct mtk_soundcard_pdata mt8189_rt5650_card = { 1111 .card_name = "mt8189_rt5650", 1112 .card_data = &(struct mtk_platform_card_data) { 1113 .card = &mt8189_nau8825_soc_card, 1114 .num_jacks = MT8189_JACK_MAX, 1115 .flags = RT5650_HS_PRESENT 1116 }, 1117 .sof_priv = NULL, 1118 .soc_probe = mt8189_nau8825_soc_card_probe, 1119}; 1120 1121static const struct mtk_soundcard_pdata mt8189_rt5682s_card = { 1122 .card_name = "mt8189_rt5682s", 1123 .card_data = &(struct mtk_platform_card_data) { 1124 .card = &mt8189_nau8825_soc_card, 1125 .num_jacks = MT8189_JACK_MAX, 1126 .flags = RT5682S_HS_PRESENT 1127 }, 1128 .sof_priv = NULL, 1129 .soc_probe = mt8189_nau8825_soc_card_probe, 1130}; 1131 1132static const struct mtk_soundcard_pdata mt8189_rt5682i_card = { 1133 .card_name = "mt8189_rt5682i", 1134 .card_data = &(struct mtk_platform_card_data) { 1135 .card = &mt8189_nau8825_soc_card, 1136 .num_jacks = MT8189_JACK_MAX, 1137 .flags = RT5682I_HS_PRESENT 1138 }, 1139 .sof_priv = NULL, 1140 .soc_probe = mt8189_nau8825_soc_card_probe, 1141}; 1142 1143static const struct mtk_soundcard_pdata mt8188_es8326_card = { 1144 .card_name = "mt8188_es8326", 1145 .card_data = &(struct mtk_platform_card_data) { 1146 .card = &mt8189_nau8825_soc_card, 1147 .num_jacks = MT8189_JACK_MAX, 1148 .flags = ES8326_HS_PRESENT 1149 }, 1150 .sof_priv = NULL, 1151 .soc_probe = mt8189_nau8825_soc_card_probe, 1152}; 1153 1154static const struct of_device_id mt8189_nau8825_dt_match[] = { 1155 {.compatible = "mediatek,mt8189-nau8825", .data = &mt8189_nau8825_card,}, 1156 {.compatible = "mediatek,mt8189-rt5650", .data = &mt8189_rt5650_card,}, 1157 {.compatible = "mediatek,mt8189-rt5682s", .data = &mt8189_rt5682s_card,}, 1158 {.compatible = "mediatek,mt8189-rt5682i", .data = &mt8189_rt5682i_card,}, 1159 {.compatible = "mediatek,mt8189-es8326", .data = &mt8188_es8326_card,}, 1160 {} 1161}; 1162MODULE_DEVICE_TABLE(of, mt8189_nau8825_dt_match); 1163 1164static struct platform_driver mt8189_nau8825_driver = { 1165 .driver = { 1166 .name = "mt8189-nau8825", 1167 .of_match_table = mt8189_nau8825_dt_match, 1168 .pm = &snd_soc_pm_ops, 1169 }, 1170 .probe = mtk_soundcard_common_probe, 1171}; 1172module_platform_driver(mt8189_nau8825_driver); 1173 1174/* Module information */ 1175MODULE_DESCRIPTION("MT8189 NAU8825 ALSA SoC machine driver"); 1176MODULE_AUTHOR("Darren Ye <darren.ye@mediatek.com>"); 1177MODULE_AUTHOR("Cyril Chao <cyril.chao@mediatek.com>"); 1178MODULE_LICENSE("GPL");
~/
Read-only file preview.