File Index
Files and directories
Sign in
FILE

mt8195-mt6359.c

File preview with syntax highlighting.

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