File Index
Files and directories
Sign in
FILE

mt8189-nau8825.c

File preview with syntax highlighting.

linux-6.19.14/sound/soc/mediatek/mt8189/mt8189-nau8825.c 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.