Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: mediatek: mt8189: add machine driver with nau8825

Add support for mt8189 board with nau8825.

Signed-off-by: Cyril Chao <Cyril.Chao@mediatek.com>
Link: https://patch.msgid.link/20251031073216.8662-11-Cyril.Chao@mediatek.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Cyril Chao and committed by
Mark Brown
d218ea17 4980df10

+1202
+21
sound/soc/mediatek/Kconfig
··· 256 256 Select Y if you have such device. 257 257 If unsure select "N". 258 258 259 + config SND_SOC_MT8189_NAU8825 260 + tristate "ASoc Audio driver for MT8189 with NAU8825 and I2S codec" 261 + depends on SND_SOC_MT8189 262 + depends on I2C 263 + select SND_SOC_DMIC 264 + select SND_SOC_HDMI_CODEC 265 + select SND_SOC_NAU8825 266 + select SND_SOC_RT5645 267 + select SND_SOC_RT9123P 268 + select SND_SOC_RT1015P 269 + select SND_SOC_RT5682S 270 + select SND_SOC_RT5682_I2C 271 + select SND_SOC_CS35L41_I2C 272 + select SND_SOC_AW88081 273 + select SND_SOC_ES8326 274 + help 275 + This adds support for ASoC machine driver for MediaTek MT8189 276 + boards with the NAU8828 and other I2S audio codecs. 277 + Select Y if you have such device. 278 + If unsure select "N". 279 + 259 280 config SND_SOC_MT8192 260 281 tristate "ASoC support for Mediatek MT8192 chip" 261 282 depends on ARCH_MEDIATEK
+3
sound/soc/mediatek/mt8189/Makefile
··· 13 13 mt8189-dai-tdm.o 14 14 15 15 obj-$(CONFIG_SND_SOC_MT8189) += snd-soc-mt8189-afe.o 16 + 17 + # machine driver 18 + obj-$(CONFIG_SND_SOC_MT8189_NAU8825) += mt8189-nau8825.o
+1178
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 + 67 + enum mt8189_jacks { 68 + MT8189_JACK_HEADSET, 69 + MT8189_JACK_DP, 70 + MT8189_JACK_HDMI, 71 + MT8189_JACK_MAX, 72 + }; 73 + 74 + static struct snd_soc_jack_pin mt8189_dp_jack_pins[] = { 75 + { 76 + .pin = "DP", 77 + .mask = SND_JACK_LINEOUT, 78 + }, 79 + }; 80 + 81 + static struct snd_soc_jack_pin mt8189_hdmi_jack_pins[] = { 82 + { 83 + .pin = "HDMI", 84 + .mask = SND_JACK_LINEOUT, 85 + }, 86 + }; 87 + 88 + static 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 + 99 + static const struct snd_kcontrol_new mt8189_dumb_spk_controls[] = { 100 + SOC_DAPM_PIN_SWITCH("Ext Spk"), 101 + }; 102 + 103 + static const struct snd_soc_dapm_widget mt8189_dumb_spk_widgets[] = { 104 + SND_SOC_DAPM_SPK("Ext Spk", NULL), 105 + }; 106 + 107 + static 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 + 112 + static const struct snd_kcontrol_new mt8189_headset_controls[] = { 113 + SOC_DAPM_PIN_SWITCH("Headphone Jack"), 114 + SOC_DAPM_PIN_SWITCH("Headset Mic"), 115 + }; 116 + 117 + static const struct snd_soc_dapm_widget mt8189_nau8825_card_widgets[] = { 118 + SND_SOC_DAPM_SINK("DP"), 119 + }; 120 + 121 + static 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 + 136 + static 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 + 149 + static 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 + 154 + static 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 + 166 + static const struct snd_soc_ops mt8189_dptx_ops = { 167 + .hw_params = mt8189_dptx_hw_params, 168 + }; 169 + 170 + static 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 + 184 + static const struct snd_soc_ops mt8189_pcm_ops = { 185 + .startup = mt8189_common_i2s_startup, 186 + }; 187 + 188 + static 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 + 220 + static const struct snd_soc_ops mt8189_nau8825_ops = { 221 + .startup = mt8189_common_i2s_startup, 222 + .hw_params = mt8189_nau8825_hw_params, 223 + }; 224 + 225 + static 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 + 264 + static 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 + 269 + static 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 + 312 + static 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 + 317 + static 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 + 337 + static const struct snd_soc_ops mt8189_es8326_ops = { 338 + .startup = mt8189_common_i2s_startup, 339 + .hw_params = mt8189_es8326_hw_params, 340 + }; 341 + 342 + static 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 + 364 + static 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 + 389 + static 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 + 414 + static 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 + 472 + static 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 */ 480 + SND_SOC_DAILINK_DEFS(playback0, 481 + DAILINK_COMP_ARRAY(COMP_CPU("DL0")), 482 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 483 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 484 + SND_SOC_DAILINK_DEFS(playback1, 485 + DAILINK_COMP_ARRAY(COMP_CPU("DL1")), 486 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 487 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 488 + SND_SOC_DAILINK_DEFS(playback2, 489 + DAILINK_COMP_ARRAY(COMP_CPU("DL2")), 490 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 491 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 492 + SND_SOC_DAILINK_DEFS(playback3, 493 + DAILINK_COMP_ARRAY(COMP_CPU("DL3")), 494 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 495 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 496 + SND_SOC_DAILINK_DEFS(playback4, 497 + DAILINK_COMP_ARRAY(COMP_CPU("DL4")), 498 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 499 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 500 + SND_SOC_DAILINK_DEFS(playback5, 501 + DAILINK_COMP_ARRAY(COMP_CPU("DL5")), 502 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 503 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 504 + SND_SOC_DAILINK_DEFS(playback6, 505 + DAILINK_COMP_ARRAY(COMP_CPU("DL6")), 506 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 507 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 508 + SND_SOC_DAILINK_DEFS(playback7, 509 + DAILINK_COMP_ARRAY(COMP_CPU("DL7")), 510 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 511 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 512 + SND_SOC_DAILINK_DEFS(playback8, 513 + DAILINK_COMP_ARRAY(COMP_CPU("DL8")), 514 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 515 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 516 + SND_SOC_DAILINK_DEFS(playback23, 517 + DAILINK_COMP_ARRAY(COMP_CPU("DL23")), 518 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 519 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 520 + SND_SOC_DAILINK_DEFS(playback24, 521 + DAILINK_COMP_ARRAY(COMP_CPU("DL24")), 522 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 523 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 524 + SND_SOC_DAILINK_DEFS(playback25, 525 + DAILINK_COMP_ARRAY(COMP_CPU("DL25")), 526 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 527 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 528 + SND_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())); 532 + SND_SOC_DAILINK_DEFS(capture0, 533 + DAILINK_COMP_ARRAY(COMP_CPU("UL0")), 534 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 535 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 536 + SND_SOC_DAILINK_DEFS(capture1, 537 + DAILINK_COMP_ARRAY(COMP_CPU("UL1")), 538 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 539 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 540 + SND_SOC_DAILINK_DEFS(capture2, 541 + DAILINK_COMP_ARRAY(COMP_CPU("UL2")), 542 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 543 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 544 + SND_SOC_DAILINK_DEFS(capture3, 545 + DAILINK_COMP_ARRAY(COMP_CPU("UL3")), 546 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 547 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 548 + SND_SOC_DAILINK_DEFS(capture4, 549 + DAILINK_COMP_ARRAY(COMP_CPU("UL4")), 550 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 551 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 552 + SND_SOC_DAILINK_DEFS(capture5, 553 + DAILINK_COMP_ARRAY(COMP_CPU("UL5")), 554 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 555 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 556 + SND_SOC_DAILINK_DEFS(capture6, 557 + DAILINK_COMP_ARRAY(COMP_CPU("UL6")), 558 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 559 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 560 + SND_SOC_DAILINK_DEFS(capture7, 561 + DAILINK_COMP_ARRAY(COMP_CPU("UL7")), 562 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 563 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 564 + SND_SOC_DAILINK_DEFS(capture8, 565 + DAILINK_COMP_ARRAY(COMP_CPU("UL8")), 566 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 567 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 568 + SND_SOC_DAILINK_DEFS(capture9, 569 + DAILINK_COMP_ARRAY(COMP_CPU("UL9")), 570 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 571 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 572 + SND_SOC_DAILINK_DEFS(capture10, 573 + DAILINK_COMP_ARRAY(COMP_CPU("UL10")), 574 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 575 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 576 + SND_SOC_DAILINK_DEFS(capture24, 577 + DAILINK_COMP_ARRAY(COMP_CPU("UL24")), 578 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 579 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 580 + SND_SOC_DAILINK_DEFS(capture25, 581 + DAILINK_COMP_ARRAY(COMP_CPU("UL25")), 582 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 583 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 584 + SND_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())); 588 + SND_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())); 592 + SND_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())); 596 + SND_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())); 600 + SND_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 */ 605 + SND_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())); 609 + SND_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())); 613 + SND_SOC_DAILINK_DEFS(i2sin0, 614 + DAILINK_COMP_ARRAY(COMP_CPU("I2SIN0")), 615 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 616 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 617 + SND_SOC_DAILINK_DEFS(i2sin1, 618 + DAILINK_COMP_ARRAY(COMP_CPU("I2SIN1")), 619 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 620 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 621 + SND_SOC_DAILINK_DEFS(i2sout0, 622 + DAILINK_COMP_ARRAY(COMP_CPU("I2SOUT0")), 623 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 624 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 625 + SND_SOC_DAILINK_DEFS(i2sout1, 626 + DAILINK_COMP_ARRAY(COMP_CPU("I2SOUT1")), 627 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 628 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 629 + SND_SOC_DAILINK_DEFS(pcm0, 630 + DAILINK_COMP_ARRAY(COMP_CPU("PCM 0")), 631 + DAILINK_COMP_ARRAY(COMP_DUMMY()), 632 + DAILINK_COMP_ARRAY(COMP_EMPTY())); 633 + SND_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 + 638 + static 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 + 1002 + static 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 + 1013 + static 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 + 1091 + static 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 + 1099 + static 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 + 1110 + static 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 + 1121 + static 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 + 1132 + static 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 + 1143 + static 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 + 1154 + static 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 + }; 1162 + MODULE_DEVICE_TABLE(of, mt8189_nau8825_dt_match); 1163 + 1164 + static 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 + }; 1172 + module_platform_driver(mt8189_nau8825_driver); 1173 + 1174 + /* Module information */ 1175 + MODULE_DESCRIPTION("MT8189 NAU8825 ALSA SoC machine driver"); 1176 + MODULE_AUTHOR("Darren Ye <darren.ye@mediatek.com>"); 1177 + MODULE_AUTHOR("Cyril Chao <cyril.chao@mediatek.com>"); 1178 + MODULE_LICENSE("GPL");