xref: /openbmc/linux/sound/soc/mediatek/mt8186/mt8186-mt6366-rt1019-rt5682s.c (revision b97d6790d03b763eca08847a9a5869a4291b9f9a)
10da16e37SJiaxin Yu // SPDX-License-Identifier: GPL-2.0
20da16e37SJiaxin Yu //
30da16e37SJiaxin Yu // mt8186-mt6366-rt1019-rt5682s.c
40da16e37SJiaxin Yu //	--  MT8186-MT6366-RT1019-RT5682S ALSA SoC machine driver
50da16e37SJiaxin Yu //
60da16e37SJiaxin Yu // Copyright (c) 2022 MediaTek Inc.
70da16e37SJiaxin Yu // Author: Jiaxin Yu <jiaxin.yu@mediatek.com>
80da16e37SJiaxin Yu //
90da16e37SJiaxin Yu 
10e14657c0SAjye Huang #include <linux/gpio.h>
11e14657c0SAjye Huang #include <linux/gpio/consumer.h>
120da16e37SJiaxin Yu #include <linux/input.h>
130da16e37SJiaxin Yu #include <linux/module.h>
140da16e37SJiaxin Yu #include <linux/of_device.h>
150da16e37SJiaxin Yu #include <sound/jack.h>
160da16e37SJiaxin Yu #include <sound/pcm_params.h>
170da16e37SJiaxin Yu #include <sound/rt5682.h>
180da16e37SJiaxin Yu #include <sound/soc.h>
190da16e37SJiaxin Yu 
200da16e37SJiaxin Yu #include "../../codecs/mt6358.h"
210da16e37SJiaxin Yu #include "../../codecs/rt5682.h"
220da16e37SJiaxin Yu #include "../common/mtk-afe-platform-driver.h"
234be34e1bSChunxu Li #include "../common/mtk-dsp-sof-common.h"
244be34e1bSChunxu Li #include "../common/mtk-soc-card.h"
250da16e37SJiaxin Yu #include "mt8186-afe-common.h"
260da16e37SJiaxin Yu #include "mt8186-afe-clk.h"
270da16e37SJiaxin Yu #include "mt8186-afe-gpio.h"
280da16e37SJiaxin Yu #include "mt8186-mt6366-common.h"
290da16e37SJiaxin Yu 
300da16e37SJiaxin Yu #define RT1019_CODEC_DAI	"HiFi"
310da16e37SJiaxin Yu #define RT1019_DEV0_NAME	"rt1019p"
320da16e37SJiaxin Yu 
330da16e37SJiaxin Yu #define RT5682S_CODEC_DAI	"rt5682s-aif1"
340da16e37SJiaxin Yu #define RT5682S_DEV0_NAME	"rt5682s.5-001a"
350da16e37SJiaxin Yu 
364be34e1bSChunxu Li #define SOF_DMA_DL1 "SOF_DMA_DL1"
374be34e1bSChunxu Li #define SOF_DMA_DL2 "SOF_DMA_DL2"
384be34e1bSChunxu Li #define SOF_DMA_UL1 "SOF_DMA_UL1"
394be34e1bSChunxu Li #define SOF_DMA_UL2 "SOF_DMA_UL2"
404be34e1bSChunxu Li 
410da16e37SJiaxin Yu struct mt8186_mt6366_rt1019_rt5682s_priv {
420da16e37SJiaxin Yu 	struct snd_soc_jack headset_jack, hdmi_jack;
43e14657c0SAjye Huang 	struct gpio_desc *dmic_sel;
44e14657c0SAjye Huang 	int dmic_switch;
450da16e37SJiaxin Yu };
460da16e37SJiaxin Yu 
4742de42c2SNícolas F. R. A. Prado /* Headset jack detection DAPM pins */
4842de42c2SNícolas F. R. A. Prado static struct snd_soc_jack_pin mt8186_jack_pins[] = {
4942de42c2SNícolas F. R. A. Prado 	{
5042de42c2SNícolas F. R. A. Prado 		.pin = "Headphone",
5142de42c2SNícolas F. R. A. Prado 		.mask = SND_JACK_HEADPHONE,
5242de42c2SNícolas F. R. A. Prado 	},
5342de42c2SNícolas F. R. A. Prado 	{
5442de42c2SNícolas F. R. A. Prado 		.pin = "Headset Mic",
5542de42c2SNícolas F. R. A. Prado 		.mask = SND_JACK_MICROPHONE,
5642de42c2SNícolas F. R. A. Prado 	},
5742de42c2SNícolas F. R. A. Prado };
5842de42c2SNícolas F. R. A. Prado 
590da16e37SJiaxin Yu static struct snd_soc_codec_conf mt8186_mt6366_rt1019_rt5682s_codec_conf[] = {
600da16e37SJiaxin Yu 	{
610da16e37SJiaxin Yu 		.dlc = COMP_CODEC_CONF("mt6358-sound"),
620da16e37SJiaxin Yu 		.name_prefix = "Mt6366",
630da16e37SJiaxin Yu 	},
640da16e37SJiaxin Yu 	{
650da16e37SJiaxin Yu 		.dlc = COMP_CODEC_CONF("bt-sco"),
660da16e37SJiaxin Yu 		.name_prefix = "Mt8186 bt",
670da16e37SJiaxin Yu 	},
680da16e37SJiaxin Yu 	{
690da16e37SJiaxin Yu 		.dlc = COMP_CODEC_CONF("hdmi-audio-codec"),
700da16e37SJiaxin Yu 		.name_prefix = "Mt8186 hdmi",
710da16e37SJiaxin Yu 	},
720da16e37SJiaxin Yu };
730da16e37SJiaxin Yu 
dmic_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)74e14657c0SAjye Huang static int dmic_get(struct snd_kcontrol *kcontrol,
75e14657c0SAjye Huang 		    struct snd_ctl_elem_value *ucontrol)
76e14657c0SAjye Huang {
77e14657c0SAjye Huang 	struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol);
78e14657c0SAjye Huang 	struct mtk_soc_card_data *soc_card_data =
79e14657c0SAjye Huang 		snd_soc_card_get_drvdata(dapm->card);
80e14657c0SAjye Huang 	struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
81e14657c0SAjye Huang 
82e14657c0SAjye Huang 	ucontrol->value.integer.value[0] = priv->dmic_switch;
83e14657c0SAjye Huang 	return 0;
84e14657c0SAjye Huang }
85e14657c0SAjye Huang 
dmic_set(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)86e14657c0SAjye Huang static int dmic_set(struct snd_kcontrol *kcontrol,
87e14657c0SAjye Huang 		    struct snd_ctl_elem_value *ucontrol)
88e14657c0SAjye Huang {
89e14657c0SAjye Huang 	struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol);
90e14657c0SAjye Huang 	struct mtk_soc_card_data *soc_card_data =
91e14657c0SAjye Huang 		snd_soc_card_get_drvdata(dapm->card);
92e14657c0SAjye Huang 	struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
93e14657c0SAjye Huang 
94e14657c0SAjye Huang 	priv->dmic_switch = ucontrol->value.integer.value[0];
95e14657c0SAjye Huang 	if (priv->dmic_sel) {
96e14657c0SAjye Huang 		gpiod_set_value(priv->dmic_sel, priv->dmic_switch);
973af24372SAllen-KH Cheng 		dev_dbg(dapm->card->dev, "dmic_set_value %d\n",
98e14657c0SAjye Huang 			 priv->dmic_switch);
99e14657c0SAjye Huang 	}
100e14657c0SAjye Huang 	return 0;
101e14657c0SAjye Huang }
102e14657c0SAjye Huang 
103e14657c0SAjye Huang static const char * const dmic_mux_text[] = {
104e14657c0SAjye Huang 	"Front Mic",
105e14657c0SAjye Huang 	"Rear Mic",
106e14657c0SAjye Huang };
107e14657c0SAjye Huang 
108e14657c0SAjye Huang static SOC_ENUM_SINGLE_DECL(mt8186_dmic_enum,
109e14657c0SAjye Huang 			    SND_SOC_NOPM, 0, dmic_mux_text);
110e14657c0SAjye Huang 
111e14657c0SAjye Huang static const struct snd_kcontrol_new mt8186_dmic_mux_control =
112e14657c0SAjye Huang 	SOC_DAPM_ENUM_EXT("DMIC Select Mux", mt8186_dmic_enum,
113e14657c0SAjye Huang 			  dmic_get, dmic_set);
114e14657c0SAjye Huang 
115e14657c0SAjye Huang static const struct snd_soc_dapm_widget dmic_widgets[] = {
116e14657c0SAjye Huang 	SND_SOC_DAPM_MIC("DMIC", NULL),
117e14657c0SAjye Huang 	SND_SOC_DAPM_MUX("Dmic Mux", SND_SOC_NOPM, 0, 0, &mt8186_dmic_mux_control),
118e14657c0SAjye Huang };
119e14657c0SAjye Huang 
120e14657c0SAjye Huang static const struct snd_soc_dapm_route dmic_map[] = {
121e14657c0SAjye Huang 	/* digital mics */
122e14657c0SAjye Huang 	{"Dmic Mux", "Front Mic", "DMIC"},
123e14657c0SAjye Huang 	{"Dmic Mux", "Rear Mic", "DMIC"},
124e14657c0SAjye Huang };
125e14657c0SAjye Huang 
primary_codec_init(struct snd_soc_pcm_runtime * rtd)126e14657c0SAjye Huang static int primary_codec_init(struct snd_soc_pcm_runtime *rtd)
127e14657c0SAjye Huang {
128e14657c0SAjye Huang 	struct snd_soc_card *card = rtd->card;
129e14657c0SAjye Huang 	struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);
130e14657c0SAjye Huang 	struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
131e14657c0SAjye Huang 	int ret;
132e14657c0SAjye Huang 
133e14657c0SAjye Huang 	ret = mt8186_mt6366_init(rtd);
134e14657c0SAjye Huang 
135e14657c0SAjye Huang 	if (ret) {
136e14657c0SAjye Huang 		dev_err(card->dev, "mt8186_mt6366_init failed: %d\n", ret);
137e14657c0SAjye Huang 		return ret;
138e14657c0SAjye Huang 	}
139e14657c0SAjye Huang 
140e14657c0SAjye Huang 	if (!priv->dmic_sel) {
1413af24372SAllen-KH Cheng 		dev_dbg(card->dev, "dmic_sel is null\n");
14205d450b0SAjye Huang 		return 0;
143e14657c0SAjye Huang 	}
144e14657c0SAjye Huang 
145e14657c0SAjye Huang 	ret = snd_soc_dapm_new_controls(&card->dapm, dmic_widgets,
146e14657c0SAjye Huang 					ARRAY_SIZE(dmic_widgets));
147e14657c0SAjye Huang 	if (ret) {
148e14657c0SAjye Huang 		dev_err(card->dev, "DMic widget addition failed: %d\n", ret);
149e14657c0SAjye Huang 		/* Don't need to add routes if widget addition failed */
150e14657c0SAjye Huang 		return ret;
151e14657c0SAjye Huang 	}
152e14657c0SAjye Huang 
153e14657c0SAjye Huang 	ret = snd_soc_dapm_add_routes(&card->dapm, dmic_map,
154e14657c0SAjye Huang 				      ARRAY_SIZE(dmic_map));
155e14657c0SAjye Huang 
156e14657c0SAjye Huang 	if (ret)
157e14657c0SAjye Huang 		dev_err(card->dev, "DMic map addition failed: %d\n", ret);
158e14657c0SAjye Huang 
159e14657c0SAjye Huang 	return ret;
160e14657c0SAjye Huang }
161e14657c0SAjye Huang 
mt8186_rt5682s_init(struct snd_soc_pcm_runtime * rtd)1620da16e37SJiaxin Yu static int mt8186_rt5682s_init(struct snd_soc_pcm_runtime *rtd)
1630da16e37SJiaxin Yu {
1649986bdaeSNícolas F. R. A. Prado 	struct snd_soc_component *cmpnt_afe =
1659986bdaeSNícolas F. R. A. Prado 		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
1669986bdaeSNícolas F. R. A. Prado 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
1674be34e1bSChunxu Li 	struct mtk_soc_card_data *soc_card_data =
1680da16e37SJiaxin Yu 		snd_soc_card_get_drvdata(rtd->card);
1694be34e1bSChunxu Li 	struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
1700da16e37SJiaxin Yu 	struct snd_soc_jack *jack = &priv->headset_jack;
1710da16e37SJiaxin Yu 	struct snd_soc_component *cmpnt_codec =
1720da16e37SJiaxin Yu 		asoc_rtd_to_codec(rtd, 0)->component;
1730da16e37SJiaxin Yu 	int ret;
1740da16e37SJiaxin Yu 
1759986bdaeSNícolas F. R. A. Prado 	ret = mt8186_dai_i2s_set_share(afe, "I2S1", "I2S0");
1769986bdaeSNícolas F. R. A. Prado 	if (ret) {
1779986bdaeSNícolas F. R. A. Prado 		dev_err(rtd->dev, "Failed to set up shared clocks\n");
1789986bdaeSNícolas F. R. A. Prado 		return ret;
1799986bdaeSNícolas F. R. A. Prado 	}
1809986bdaeSNícolas F. R. A. Prado 
18142de42c2SNícolas F. R. A. Prado 	ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
1820da16e37SJiaxin Yu 				    SND_JACK_HEADSET | SND_JACK_BTN_0 |
1830da16e37SJiaxin Yu 				    SND_JACK_BTN_1 | SND_JACK_BTN_2 |
1840da16e37SJiaxin Yu 				    SND_JACK_BTN_3,
18542de42c2SNícolas F. R. A. Prado 				    jack, mt8186_jack_pins,
18642de42c2SNícolas F. R. A. Prado 				    ARRAY_SIZE(mt8186_jack_pins));
1870da16e37SJiaxin Yu 	if (ret) {
1880da16e37SJiaxin Yu 		dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
1890da16e37SJiaxin Yu 		return ret;
1900da16e37SJiaxin Yu 	}
1910da16e37SJiaxin Yu 
1920da16e37SJiaxin Yu 	snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
1930da16e37SJiaxin Yu 	snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
1940da16e37SJiaxin Yu 	snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
1950da16e37SJiaxin Yu 	snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
1960da16e37SJiaxin Yu 
1970da16e37SJiaxin Yu 	return snd_soc_component_set_jack(cmpnt_codec, jack, NULL);
1980da16e37SJiaxin Yu }
1990da16e37SJiaxin Yu 
mt8186_rt5682s_i2s_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params)2000da16e37SJiaxin Yu static int mt8186_rt5682s_i2s_hw_params(struct snd_pcm_substream *substream,
2010da16e37SJiaxin Yu 					struct snd_pcm_hw_params *params)
2020da16e37SJiaxin Yu {
2030da16e37SJiaxin Yu 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
2040da16e37SJiaxin Yu 	struct snd_soc_card *card = rtd->card;
2050da16e37SJiaxin Yu 	struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
2060da16e37SJiaxin Yu 	struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
2070da16e37SJiaxin Yu 	unsigned int rate = params_rate(params);
2080da16e37SJiaxin Yu 	unsigned int mclk_fs_ratio = 128;
2090da16e37SJiaxin Yu 	unsigned int mclk_fs = rate * mclk_fs_ratio;
2100da16e37SJiaxin Yu 	int bitwidth;
2110da16e37SJiaxin Yu 	int ret;
2120da16e37SJiaxin Yu 
2130da16e37SJiaxin Yu 	bitwidth = snd_pcm_format_width(params_format(params));
2140da16e37SJiaxin Yu 	if (bitwidth < 0) {
2150da16e37SJiaxin Yu 		dev_err(card->dev, "invalid bit width: %d\n", bitwidth);
2160da16e37SJiaxin Yu 		return bitwidth;
2170da16e37SJiaxin Yu 	}
2180da16e37SJiaxin Yu 
2190da16e37SJiaxin Yu 	ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);
2200da16e37SJiaxin Yu 	if (ret) {
2210da16e37SJiaxin Yu 		dev_err(card->dev, "failed to set tdm slot\n");
2220da16e37SJiaxin Yu 		return ret;
2230da16e37SJiaxin Yu 	}
2240da16e37SJiaxin Yu 
2250da16e37SJiaxin Yu 	ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1,
2260da16e37SJiaxin Yu 				  RT5682_PLL1_S_BCLK1,
2270da16e37SJiaxin Yu 				  params_rate(params) * 64,
2280da16e37SJiaxin Yu 				  params_rate(params) * 512);
2290da16e37SJiaxin Yu 	if (ret) {
2300da16e37SJiaxin Yu 		dev_err(card->dev, "failed to set pll\n");
2310da16e37SJiaxin Yu 		return ret;
2320da16e37SJiaxin Yu 	}
2330da16e37SJiaxin Yu 
2340da16e37SJiaxin Yu 	ret = snd_soc_dai_set_sysclk(codec_dai,
2350da16e37SJiaxin Yu 				     RT5682_SCLK_S_PLL1,
2360da16e37SJiaxin Yu 				     params_rate(params) * 512,
2370da16e37SJiaxin Yu 				     SND_SOC_CLOCK_IN);
2380da16e37SJiaxin Yu 	if (ret) {
2390da16e37SJiaxin Yu 		dev_err(card->dev, "failed to set sysclk\n");
2400da16e37SJiaxin Yu 		return ret;
2410da16e37SJiaxin Yu 	}
2420da16e37SJiaxin Yu 
2430da16e37SJiaxin Yu 	return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
2440da16e37SJiaxin Yu }
2450da16e37SJiaxin Yu 
2460da16e37SJiaxin Yu static const struct snd_soc_ops mt8186_rt5682s_i2s_ops = {
2470da16e37SJiaxin Yu 	.hw_params = mt8186_rt5682s_i2s_hw_params,
2480da16e37SJiaxin Yu };
2490da16e37SJiaxin Yu 
mt8186_mt6366_rt1019_rt5682s_hdmi_init(struct snd_soc_pcm_runtime * rtd)2500da16e37SJiaxin Yu static int mt8186_mt6366_rt1019_rt5682s_hdmi_init(struct snd_soc_pcm_runtime *rtd)
2510da16e37SJiaxin Yu {
2529986bdaeSNícolas F. R. A. Prado 	struct snd_soc_component *cmpnt_afe =
2539986bdaeSNícolas F. R. A. Prado 		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
2549986bdaeSNícolas F. R. A. Prado 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
2550da16e37SJiaxin Yu 	struct snd_soc_component *cmpnt_codec =
2560da16e37SJiaxin Yu 		asoc_rtd_to_codec(rtd, 0)->component;
2574be34e1bSChunxu Li 	struct mtk_soc_card_data *soc_card_data =
2580da16e37SJiaxin Yu 		snd_soc_card_get_drvdata(rtd->card);
2594be34e1bSChunxu Li 	struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
2600da16e37SJiaxin Yu 	int ret;
2610da16e37SJiaxin Yu 
262248579fcSJiaxin Yu 	ret = mt8186_dai_i2s_set_share(afe, "I2S2", "I2S3");
2639986bdaeSNícolas F. R. A. Prado 	if (ret) {
2649986bdaeSNícolas F. R. A. Prado 		dev_err(rtd->dev, "Failed to set up shared clocks\n");
2659986bdaeSNícolas F. R. A. Prado 		return ret;
2669986bdaeSNícolas F. R. A. Prado 	}
2679986bdaeSNícolas F. R. A. Prado 
2680da16e37SJiaxin Yu 	ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, &priv->hdmi_jack);
2690da16e37SJiaxin Yu 	if (ret) {
2700da16e37SJiaxin Yu 		dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret);
2710da16e37SJiaxin Yu 		return ret;
2720da16e37SJiaxin Yu 	}
2730da16e37SJiaxin Yu 
2740da16e37SJiaxin Yu 	return snd_soc_component_set_jack(cmpnt_codec, &priv->hdmi_jack, NULL);
2750da16e37SJiaxin Yu }
2760da16e37SJiaxin Yu 
mt8186_hw_params_fixup(struct snd_soc_pcm_runtime * rtd,struct snd_pcm_hw_params * params,snd_pcm_format_t fmt)2770da16e37SJiaxin Yu static int mt8186_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
2780da16e37SJiaxin Yu 				  struct snd_pcm_hw_params *params,
2790da16e37SJiaxin Yu 				  snd_pcm_format_t fmt)
2800da16e37SJiaxin Yu {
2810da16e37SJiaxin Yu 	struct snd_interval *channels = hw_param_interval(params,
2820da16e37SJiaxin Yu 		SNDRV_PCM_HW_PARAM_CHANNELS);
2830da16e37SJiaxin Yu 
2840da16e37SJiaxin Yu 	dev_dbg(rtd->dev, "%s(), fix format to %d\n", __func__, fmt);
2850da16e37SJiaxin Yu 
2860da16e37SJiaxin Yu 	/* fix BE i2s channel to 2 channel */
2870da16e37SJiaxin Yu 	channels->min = 2;
2880da16e37SJiaxin Yu 	channels->max = 2;
2890da16e37SJiaxin Yu 
2900da16e37SJiaxin Yu 	/* clean param mask first */
2910da16e37SJiaxin Yu 	snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
2920da16e37SJiaxin Yu 			     0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
2930da16e37SJiaxin Yu 
2940da16e37SJiaxin Yu 	params_set_format(params, fmt);
2950da16e37SJiaxin Yu 
2960da16e37SJiaxin Yu 	return 0;
2970da16e37SJiaxin Yu }
2980da16e37SJiaxin Yu 
mt8186_i2s_hw_params_fixup(struct snd_soc_pcm_runtime * rtd,struct snd_pcm_hw_params * params)2990da16e37SJiaxin Yu static int mt8186_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
3000da16e37SJiaxin Yu 				      struct snd_pcm_hw_params *params)
3010da16e37SJiaxin Yu {
3020da16e37SJiaxin Yu 	return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S24_LE);
3030da16e37SJiaxin Yu }
3040da16e37SJiaxin Yu 
mt8186_it6505_i2s_hw_params_fixup(struct snd_soc_pcm_runtime * rtd,struct snd_pcm_hw_params * params)3050da16e37SJiaxin Yu static int mt8186_it6505_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
3060da16e37SJiaxin Yu 					     struct snd_pcm_hw_params *params)
3070da16e37SJiaxin Yu {
3080da16e37SJiaxin Yu 	return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S32_LE);
3090da16e37SJiaxin Yu }
3100da16e37SJiaxin Yu 
3114be34e1bSChunxu Li /* fixup the BE DAI link to match any values from topology */
mt8186_sof_dai_link_fixup(struct snd_soc_pcm_runtime * rtd,struct snd_pcm_hw_params * params)3124be34e1bSChunxu Li static int mt8186_sof_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,
3134be34e1bSChunxu Li 				     struct snd_pcm_hw_params *params)
3144be34e1bSChunxu Li {
3154be34e1bSChunxu Li 	int ret;
3164be34e1bSChunxu Li 
3174be34e1bSChunxu Li 	ret = mtk_sof_dai_link_fixup(rtd, params);
3184be34e1bSChunxu Li 
3194be34e1bSChunxu Li 	if (!strcmp(rtd->dai_link->name, "I2S0") ||
3204be34e1bSChunxu Li 	    !strcmp(rtd->dai_link->name, "I2S1") ||
3214be34e1bSChunxu Li 	    !strcmp(rtd->dai_link->name, "I2S2"))
3224be34e1bSChunxu Li 		mt8186_i2s_hw_params_fixup(rtd, params);
3234be34e1bSChunxu Li 	else if (!strcmp(rtd->dai_link->name, "I2S3"))
3244be34e1bSChunxu Li 		mt8186_it6505_i2s_hw_params_fixup(rtd, params);
3254be34e1bSChunxu Li 
3264be34e1bSChunxu Li 	return ret;
3274be34e1bSChunxu Li }
3284be34e1bSChunxu Li 
mt8186_mt6366_rt1019_rt5682s_playback_startup(struct snd_pcm_substream * substream)3290da16e37SJiaxin Yu static int mt8186_mt6366_rt1019_rt5682s_playback_startup(struct snd_pcm_substream *substream)
3300da16e37SJiaxin Yu {
3310da16e37SJiaxin Yu 	static const unsigned int rates[] = {
3320da16e37SJiaxin Yu 		48000
3330da16e37SJiaxin Yu 	};
3340da16e37SJiaxin Yu 	static const unsigned int channels[] = {
3350da16e37SJiaxin Yu 		2
3360da16e37SJiaxin Yu 	};
3370da16e37SJiaxin Yu 	static const struct snd_pcm_hw_constraint_list constraints_rates = {
3380da16e37SJiaxin Yu 		.count = ARRAY_SIZE(rates),
3390da16e37SJiaxin Yu 		.list  = rates,
3400da16e37SJiaxin Yu 		.mask = 0,
3410da16e37SJiaxin Yu 	};
3420da16e37SJiaxin Yu 	static const struct snd_pcm_hw_constraint_list constraints_channels = {
3430da16e37SJiaxin Yu 		.count = ARRAY_SIZE(channels),
3440da16e37SJiaxin Yu 		.list  = channels,
3450da16e37SJiaxin Yu 		.mask = 0,
3460da16e37SJiaxin Yu 	};
3470da16e37SJiaxin Yu 
3480da16e37SJiaxin Yu 	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
3490da16e37SJiaxin Yu 	struct snd_pcm_runtime *runtime = substream->runtime;
3500da16e37SJiaxin Yu 	int ret;
3510da16e37SJiaxin Yu 
3520da16e37SJiaxin Yu 	ret = snd_pcm_hw_constraint_list(runtime, 0,
3530da16e37SJiaxin Yu 					 SNDRV_PCM_HW_PARAM_RATE,
3540da16e37SJiaxin Yu 					 &constraints_rates);
3550da16e37SJiaxin Yu 	if (ret < 0) {
3560da16e37SJiaxin Yu 		dev_err(rtd->dev, "hw_constraint_list rate failed\n");
3570da16e37SJiaxin Yu 		return ret;
3580da16e37SJiaxin Yu 	}
3590da16e37SJiaxin Yu 
3600da16e37SJiaxin Yu 	ret = snd_pcm_hw_constraint_list(runtime, 0,
3610da16e37SJiaxin Yu 					 SNDRV_PCM_HW_PARAM_CHANNELS,
3620da16e37SJiaxin Yu 					 &constraints_channels);
3630da16e37SJiaxin Yu 	if (ret < 0) {
3640da16e37SJiaxin Yu 		dev_err(rtd->dev, "hw_constraint_list channel failed\n");
3650da16e37SJiaxin Yu 		return ret;
3660da16e37SJiaxin Yu 	}
3670da16e37SJiaxin Yu 
3680da16e37SJiaxin Yu 	return 0;
3690da16e37SJiaxin Yu }
3700da16e37SJiaxin Yu 
3710da16e37SJiaxin Yu static const struct snd_soc_ops mt8186_mt6366_rt1019_rt5682s_playback_ops = {
3720da16e37SJiaxin Yu 	.startup = mt8186_mt6366_rt1019_rt5682s_playback_startup,
3730da16e37SJiaxin Yu };
3740da16e37SJiaxin Yu 
mt8186_mt6366_rt1019_rt5682s_capture_startup(struct snd_pcm_substream * substream)3750da16e37SJiaxin Yu static int mt8186_mt6366_rt1019_rt5682s_capture_startup(struct snd_pcm_substream *substream)
3760da16e37SJiaxin Yu {
3770da16e37SJiaxin Yu 	static const unsigned int rates[] = {
3780da16e37SJiaxin Yu 		48000
3790da16e37SJiaxin Yu 	};
3800da16e37SJiaxin Yu 	static const unsigned int channels[] = {
3810da16e37SJiaxin Yu 		1, 2
3820da16e37SJiaxin Yu 	};
3830da16e37SJiaxin Yu 	static const struct snd_pcm_hw_constraint_list constraints_rates = {
3840da16e37SJiaxin Yu 		.count = ARRAY_SIZE(rates),
3850da16e37SJiaxin Yu 		.list  = rates,
3860da16e37SJiaxin Yu 		.mask = 0,
3870da16e37SJiaxin Yu 	};
3880da16e37SJiaxin Yu 	static const struct snd_pcm_hw_constraint_list constraints_channels = {
3890da16e37SJiaxin Yu 		.count = ARRAY_SIZE(channels),
3900da16e37SJiaxin Yu 		.list  = channels,
3910da16e37SJiaxin Yu 		.mask = 0,
3920da16e37SJiaxin Yu 	};
3930da16e37SJiaxin Yu 
3940da16e37SJiaxin Yu 	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
3950da16e37SJiaxin Yu 	struct snd_pcm_runtime *runtime = substream->runtime;
3960da16e37SJiaxin Yu 	int ret;
3970da16e37SJiaxin Yu 
3980da16e37SJiaxin Yu 	ret = snd_pcm_hw_constraint_list(runtime, 0,
3990da16e37SJiaxin Yu 					 SNDRV_PCM_HW_PARAM_RATE,
4000da16e37SJiaxin Yu 					 &constraints_rates);
4010da16e37SJiaxin Yu 	if (ret < 0) {
4020da16e37SJiaxin Yu 		dev_err(rtd->dev, "hw_constraint_list rate failed\n");
4030da16e37SJiaxin Yu 		return ret;
4040da16e37SJiaxin Yu 	}
4050da16e37SJiaxin Yu 
4060da16e37SJiaxin Yu 	ret = snd_pcm_hw_constraint_list(runtime, 0,
4070da16e37SJiaxin Yu 					 SNDRV_PCM_HW_PARAM_CHANNELS,
4080da16e37SJiaxin Yu 					 &constraints_channels);
4090da16e37SJiaxin Yu 	if (ret < 0) {
4100da16e37SJiaxin Yu 		dev_err(rtd->dev, "hw_constraint_list channel failed\n");
4110da16e37SJiaxin Yu 		return ret;
4120da16e37SJiaxin Yu 	}
4130da16e37SJiaxin Yu 
4140da16e37SJiaxin Yu 	return 0;
4150da16e37SJiaxin Yu }
4160da16e37SJiaxin Yu 
4170da16e37SJiaxin Yu static const struct snd_soc_ops mt8186_mt6366_rt1019_rt5682s_capture_ops = {
4180da16e37SJiaxin Yu 	.startup = mt8186_mt6366_rt1019_rt5682s_capture_startup,
4190da16e37SJiaxin Yu };
4200da16e37SJiaxin Yu 
4210da16e37SJiaxin Yu /* FE */
4220da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(playback1,
4230da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("DL1")),
4240da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4250da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4260da16e37SJiaxin Yu 
4270da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(playback12,
4280da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("DL12")),
4290da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4300da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4310da16e37SJiaxin Yu 
4320da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(playback2,
4330da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
4340da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4350da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4360da16e37SJiaxin Yu 
4370da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(playback3,
4380da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
4390da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4400da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4410da16e37SJiaxin Yu 
4420da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(playback4,
4430da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("DL4")),
4440da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4450da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4460da16e37SJiaxin Yu 
4470da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(playback5,
4480da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("DL5")),
4490da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4500da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4510da16e37SJiaxin Yu 
4520da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(playback6,
4530da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("DL6")),
4540da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4550da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4560da16e37SJiaxin Yu 
4570da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(playback7,
4580da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("DL7")),
4590da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4600da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4610da16e37SJiaxin Yu 
4620da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(playback8,
4630da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("DL8")),
4640da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4650da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4660da16e37SJiaxin Yu 
4670da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(capture1,
4680da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
4690da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4700da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4710da16e37SJiaxin Yu 
4720da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(capture2,
4730da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
4740da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4750da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4760da16e37SJiaxin Yu 
4770da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(capture3,
4780da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
4790da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4800da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4810da16e37SJiaxin Yu 
4820da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(capture4,
4830da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("UL4")),
4840da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4850da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4860da16e37SJiaxin Yu 
4870da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(capture5,
4880da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("UL5")),
4890da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4900da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4910da16e37SJiaxin Yu 
4920da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(capture6,
4930da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("UL6")),
4940da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4950da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4960da16e37SJiaxin Yu 
4970da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(capture7,
4980da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("UL7")),
4990da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5000da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5010da16e37SJiaxin Yu 
5020da16e37SJiaxin Yu /* hostless */
5030da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(hostless_lpbk,
5040da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless LPBK DAI")),
5050da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5060da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5070da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(hostless_fm,
5080da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless FM DAI")),
5090da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5100da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5110da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(hostless_src1,
5120da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_SRC_1_DAI")),
5130da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5140da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5150da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(hostless_src_bargein,
5160da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_SRC_Bargein_DAI")),
5170da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5180da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5190da16e37SJiaxin Yu 
5200da16e37SJiaxin Yu /* BE */
5210da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(adda,
5220da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),
5230da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CODEC("mt6358-sound",
5240da16e37SJiaxin Yu 						   "mt6358-snd-codec-aif1"),
5250da16e37SJiaxin Yu 					COMP_CODEC("dmic-codec",
5260da16e37SJiaxin Yu 						   "dmic-hifi")),
5270da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5280da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(i2s0,
5290da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S0")),
5300da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()),
5310da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5320da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(i2s1,
5330da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S1")),
5340da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()),
5350da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5360da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(i2s2,
5370da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S2")),
5380da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5390da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5400da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(i2s3,
5410da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S3")),
5420da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()),
5430da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5440da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(hw_gain1,
5450da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("HW Gain 1")),
5460da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5470da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5480da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(hw_gain2,
5490da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("HW Gain 2")),
5500da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5510da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5520da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(hw_src1,
5530da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("HW_SRC_1")),
5540da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5550da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5560da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(hw_src2,
5570da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("HW_SRC_2")),
5580da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5590da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5600da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(connsys_i2s,
5610da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("CONNSYS_I2S")),
5620da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5630da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5640da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(pcm1,
5650da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")),
5660da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CODEC("bt-sco", "bt-sco-pcm-wb")),
5670da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5680da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(tdm_in,
5690da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("TDM IN")),
5700da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5710da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5720da16e37SJiaxin Yu 
5730da16e37SJiaxin Yu /* hostless */
5740da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(hostless_ul1,
5750da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL1 DAI")),
5760da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5770da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5780da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(hostless_ul2,
5790da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL2 DAI")),
5800da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5810da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5820da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(hostless_ul3,
5830da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL3 DAI")),
5840da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5850da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5860da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(hostless_ul5,
5870da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL5 DAI")),
5880da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5890da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5900da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(hostless_ul6,
5910da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL6 DAI")),
5920da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5930da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5940da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(hostless_hw_gain_aaudio,
5950da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless HW Gain AAudio DAI")),
5960da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5970da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5980da16e37SJiaxin Yu SND_SOC_DAILINK_DEFS(hostless_src_aaudio,
5990da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless SRC AAudio DAI")),
6000da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
6010da16e37SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
6024be34e1bSChunxu Li SND_SOC_DAILINK_DEFS(AFE_SOF_DL1,
6034be34e1bSChunxu Li 		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL1")),
6044be34e1bSChunxu Li 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
6054be34e1bSChunxu Li 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
6064be34e1bSChunxu Li 
6074be34e1bSChunxu Li SND_SOC_DAILINK_DEFS(AFE_SOF_DL2,
6084be34e1bSChunxu Li 		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")),
6094be34e1bSChunxu Li 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
6104be34e1bSChunxu Li 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
6114be34e1bSChunxu Li 
6124be34e1bSChunxu Li SND_SOC_DAILINK_DEFS(AFE_SOF_UL1,
6134be34e1bSChunxu Li 		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL1")),
6144be34e1bSChunxu Li 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
6154be34e1bSChunxu Li 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
6164be34e1bSChunxu Li 
6174be34e1bSChunxu Li SND_SOC_DAILINK_DEFS(AFE_SOF_UL2,
6184be34e1bSChunxu Li 		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL2")),
6194be34e1bSChunxu Li 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
6204be34e1bSChunxu Li 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
6214be34e1bSChunxu Li 
6224be34e1bSChunxu Li static const struct sof_conn_stream g_sof_conn_streams[] = {
6234be34e1bSChunxu Li 	{ "I2S1", "AFE_SOF_DL1", SOF_DMA_DL1, SNDRV_PCM_STREAM_PLAYBACK},
6244be34e1bSChunxu Li 	{ "I2S3", "AFE_SOF_DL2", SOF_DMA_DL2, SNDRV_PCM_STREAM_PLAYBACK},
6254be34e1bSChunxu Li 	{ "Primary Codec", "AFE_SOF_UL1", SOF_DMA_UL1, SNDRV_PCM_STREAM_CAPTURE},
6264be34e1bSChunxu Li 	{ "I2S0", "AFE_SOF_UL2", SOF_DMA_UL2, SNDRV_PCM_STREAM_CAPTURE},
6274be34e1bSChunxu Li };
6284be34e1bSChunxu Li 
6290da16e37SJiaxin Yu static struct snd_soc_dai_link mt8186_mt6366_rt1019_rt5682s_dai_links[] = {
6300da16e37SJiaxin Yu 	/* Front End DAI links */
6310da16e37SJiaxin Yu 	{
6320da16e37SJiaxin Yu 		.name = "Playback_1",
6330da16e37SJiaxin Yu 		.stream_name = "Playback_1",
6340da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
6350da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
6360da16e37SJiaxin Yu 		.dynamic = 1,
6370da16e37SJiaxin Yu 		.dpcm_playback = 1,
6380da16e37SJiaxin Yu 		.dpcm_merged_format = 1,
6390da16e37SJiaxin Yu 		.dpcm_merged_chan = 1,
6400da16e37SJiaxin Yu 		.dpcm_merged_rate = 1,
6410da16e37SJiaxin Yu 		.ops = &mt8186_mt6366_rt1019_rt5682s_playback_ops,
6420da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(playback1),
6430da16e37SJiaxin Yu 	},
6440da16e37SJiaxin Yu 	{
6450da16e37SJiaxin Yu 		.name = "Playback_12",
6460da16e37SJiaxin Yu 		.stream_name = "Playback_12",
6470da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
6480da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
6490da16e37SJiaxin Yu 		.dynamic = 1,
6500da16e37SJiaxin Yu 		.dpcm_playback = 1,
6510da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(playback12),
6520da16e37SJiaxin Yu 	},
6530da16e37SJiaxin Yu 	{
6540da16e37SJiaxin Yu 		.name = "Playback_2",
6550da16e37SJiaxin Yu 		.stream_name = "Playback_2",
6560da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
6570da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
6580da16e37SJiaxin Yu 		.dynamic = 1,
6590da16e37SJiaxin Yu 		.dpcm_playback = 1,
6600da16e37SJiaxin Yu 		.dpcm_merged_format = 1,
6610da16e37SJiaxin Yu 		.dpcm_merged_chan = 1,
6620da16e37SJiaxin Yu 		.dpcm_merged_rate = 1,
6630da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(playback2),
6640da16e37SJiaxin Yu 	},
6650da16e37SJiaxin Yu 	{
6660da16e37SJiaxin Yu 		.name = "Playback_3",
6670da16e37SJiaxin Yu 		.stream_name = "Playback_3",
6680da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
6690da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
6700da16e37SJiaxin Yu 		.dynamic = 1,
6710da16e37SJiaxin Yu 		.dpcm_playback = 1,
6720da16e37SJiaxin Yu 		.dpcm_merged_format = 1,
6730da16e37SJiaxin Yu 		.dpcm_merged_chan = 1,
6740da16e37SJiaxin Yu 		.dpcm_merged_rate = 1,
6750da16e37SJiaxin Yu 		.ops = &mt8186_mt6366_rt1019_rt5682s_playback_ops,
6760da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(playback3),
6770da16e37SJiaxin Yu 	},
6780da16e37SJiaxin Yu 	{
6790da16e37SJiaxin Yu 		.name = "Playback_4",
6800da16e37SJiaxin Yu 		.stream_name = "Playback_4",
6810da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
6820da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
6830da16e37SJiaxin Yu 		.dynamic = 1,
6840da16e37SJiaxin Yu 		.dpcm_playback = 1,
6850da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(playback4),
6860da16e37SJiaxin Yu 	},
6870da16e37SJiaxin Yu 	{
6880da16e37SJiaxin Yu 		.name = "Playback_5",
6890da16e37SJiaxin Yu 		.stream_name = "Playback_5",
6900da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
6910da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
6920da16e37SJiaxin Yu 		.dynamic = 1,
6930da16e37SJiaxin Yu 		.dpcm_playback = 1,
6940da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(playback5),
6950da16e37SJiaxin Yu 	},
6960da16e37SJiaxin Yu 	{
6970da16e37SJiaxin Yu 		.name = "Playback_6",
6980da16e37SJiaxin Yu 		.stream_name = "Playback_6",
6990da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7000da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
7010da16e37SJiaxin Yu 		.dynamic = 1,
7020da16e37SJiaxin Yu 		.dpcm_playback = 1,
7030da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(playback6),
7040da16e37SJiaxin Yu 	},
7050da16e37SJiaxin Yu 	{
7060da16e37SJiaxin Yu 		.name = "Playback_7",
7070da16e37SJiaxin Yu 		.stream_name = "Playback_7",
7080da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7090da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
7100da16e37SJiaxin Yu 		.dynamic = 1,
7110da16e37SJiaxin Yu 		.dpcm_playback = 1,
7120da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(playback7),
7130da16e37SJiaxin Yu 	},
7140da16e37SJiaxin Yu 	{
7150da16e37SJiaxin Yu 		.name = "Playback_8",
7160da16e37SJiaxin Yu 		.stream_name = "Playback_8",
7170da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7180da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
7190da16e37SJiaxin Yu 		.dynamic = 1,
7200da16e37SJiaxin Yu 		.dpcm_playback = 1,
7210da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(playback8),
7220da16e37SJiaxin Yu 	},
7230da16e37SJiaxin Yu 	{
7240da16e37SJiaxin Yu 		.name = "Capture_1",
7250da16e37SJiaxin Yu 		.stream_name = "Capture_1",
7260da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7270da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
7280da16e37SJiaxin Yu 		.dynamic = 1,
7290da16e37SJiaxin Yu 		.dpcm_capture = 1,
7300da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(capture1),
7310da16e37SJiaxin Yu 	},
7320da16e37SJiaxin Yu 	{
7330da16e37SJiaxin Yu 		.name = "Capture_2",
7340da16e37SJiaxin Yu 		.stream_name = "Capture_2",
7350da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7360da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
7370da16e37SJiaxin Yu 		.dynamic = 1,
7380da16e37SJiaxin Yu 		.dpcm_capture = 1,
7390da16e37SJiaxin Yu 		.dpcm_merged_format = 1,
7400da16e37SJiaxin Yu 		.dpcm_merged_chan = 1,
7410da16e37SJiaxin Yu 		.dpcm_merged_rate = 1,
7420da16e37SJiaxin Yu 		.ops = &mt8186_mt6366_rt1019_rt5682s_capture_ops,
7430da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(capture2),
7440da16e37SJiaxin Yu 	},
7450da16e37SJiaxin Yu 	{
7460da16e37SJiaxin Yu 		.name = "Capture_3",
7470da16e37SJiaxin Yu 		.stream_name = "Capture_3",
7480da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7490da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
7500da16e37SJiaxin Yu 		.dynamic = 1,
7510da16e37SJiaxin Yu 		.dpcm_capture = 1,
7520da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(capture3),
7530da16e37SJiaxin Yu 	},
7540da16e37SJiaxin Yu 	{
7550da16e37SJiaxin Yu 		.name = "Capture_4",
7560da16e37SJiaxin Yu 		.stream_name = "Capture_4",
7570da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7580da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
7590da16e37SJiaxin Yu 		.dynamic = 1,
7600da16e37SJiaxin Yu 		.dpcm_capture = 1,
7610da16e37SJiaxin Yu 		.dpcm_merged_format = 1,
7620da16e37SJiaxin Yu 		.dpcm_merged_chan = 1,
7630da16e37SJiaxin Yu 		.dpcm_merged_rate = 1,
7640da16e37SJiaxin Yu 		.ops = &mt8186_mt6366_rt1019_rt5682s_capture_ops,
7650da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(capture4),
7660da16e37SJiaxin Yu 	},
7670da16e37SJiaxin Yu 	{
7680da16e37SJiaxin Yu 		.name = "Capture_5",
7690da16e37SJiaxin Yu 		.stream_name = "Capture_5",
7700da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7710da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
7720da16e37SJiaxin Yu 		.dynamic = 1,
7730da16e37SJiaxin Yu 		.dpcm_capture = 1,
7740da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(capture5),
7750da16e37SJiaxin Yu 	},
7760da16e37SJiaxin Yu 	{
7770da16e37SJiaxin Yu 		.name = "Capture_6",
7780da16e37SJiaxin Yu 		.stream_name = "Capture_6",
7790da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7800da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
7810da16e37SJiaxin Yu 		.dynamic = 1,
7820da16e37SJiaxin Yu 		.dpcm_capture = 1,
7830da16e37SJiaxin Yu 		.dpcm_merged_format = 1,
7840da16e37SJiaxin Yu 		.dpcm_merged_chan = 1,
7850da16e37SJiaxin Yu 		.dpcm_merged_rate = 1,
7860da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(capture6),
7870da16e37SJiaxin Yu 	},
7880da16e37SJiaxin Yu 	{
7890da16e37SJiaxin Yu 		.name = "Capture_7",
7900da16e37SJiaxin Yu 		.stream_name = "Capture_7",
7910da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7920da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
7930da16e37SJiaxin Yu 		.dynamic = 1,
7940da16e37SJiaxin Yu 		.dpcm_capture = 1,
7950da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(capture7),
7960da16e37SJiaxin Yu 	},
7970da16e37SJiaxin Yu 	{
7980da16e37SJiaxin Yu 		.name = "Hostless_LPBK",
7990da16e37SJiaxin Yu 		.stream_name = "Hostless_LPBK",
8000da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
8010da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
8020da16e37SJiaxin Yu 		.dynamic = 1,
8030da16e37SJiaxin Yu 		.dpcm_playback = 1,
8040da16e37SJiaxin Yu 		.dpcm_capture = 1,
8050da16e37SJiaxin Yu 		.ignore_suspend = 1,
8060da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(hostless_lpbk),
8070da16e37SJiaxin Yu 	},
8080da16e37SJiaxin Yu 	{
8090da16e37SJiaxin Yu 		.name = "Hostless_FM",
8100da16e37SJiaxin Yu 		.stream_name = "Hostless_FM",
8110da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
8120da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
8130da16e37SJiaxin Yu 		.dynamic = 1,
8140da16e37SJiaxin Yu 		.dpcm_playback = 1,
8150da16e37SJiaxin Yu 		.dpcm_capture = 1,
8160da16e37SJiaxin Yu 		.ignore_suspend = 1,
8170da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(hostless_fm),
8180da16e37SJiaxin Yu 	},
8190da16e37SJiaxin Yu 	{
8200da16e37SJiaxin Yu 		.name = "Hostless_SRC_1",
8210da16e37SJiaxin Yu 		.stream_name = "Hostless_SRC_1",
8220da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
8230da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
8240da16e37SJiaxin Yu 		.dynamic = 1,
8250da16e37SJiaxin Yu 		.dpcm_playback = 1,
8260da16e37SJiaxin Yu 		.dpcm_capture = 1,
8270da16e37SJiaxin Yu 		.ignore_suspend = 1,
8280da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(hostless_src1),
8290da16e37SJiaxin Yu 	},
8300da16e37SJiaxin Yu 	{
8310da16e37SJiaxin Yu 		.name = "Hostless_SRC_Bargein",
8320da16e37SJiaxin Yu 		.stream_name = "Hostless_SRC_Bargein",
8330da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
8340da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
8350da16e37SJiaxin Yu 		.dynamic = 1,
8360da16e37SJiaxin Yu 		.dpcm_playback = 1,
8370da16e37SJiaxin Yu 		.dpcm_capture = 1,
8380da16e37SJiaxin Yu 		.ignore_suspend = 1,
8390da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(hostless_src_bargein),
8400da16e37SJiaxin Yu 	},
8410da16e37SJiaxin Yu 	{
8420da16e37SJiaxin Yu 		.name = "Hostless_HW_Gain_AAudio",
8430da16e37SJiaxin Yu 		.stream_name = "Hostless_HW_Gain_AAudio",
8440da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
8450da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
8460da16e37SJiaxin Yu 		.dynamic = 1,
8470da16e37SJiaxin Yu 		.dpcm_capture = 1,
8480da16e37SJiaxin Yu 		.ignore_suspend = 1,
8490da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(hostless_hw_gain_aaudio),
8500da16e37SJiaxin Yu 	},
8510da16e37SJiaxin Yu 	{
8520da16e37SJiaxin Yu 		.name = "Hostless_SRC_AAudio",
8530da16e37SJiaxin Yu 		.stream_name = "Hostless_SRC_AAudio",
8540da16e37SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
8550da16e37SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
8560da16e37SJiaxin Yu 		.dynamic = 1,
8570da16e37SJiaxin Yu 		.dpcm_playback = 1,
8580da16e37SJiaxin Yu 		.dpcm_capture = 1,
8590da16e37SJiaxin Yu 		.ignore_suspend = 1,
8600da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(hostless_src_aaudio),
8610da16e37SJiaxin Yu 	},
8620da16e37SJiaxin Yu 	/* Back End DAI links */
8630da16e37SJiaxin Yu 	{
8640da16e37SJiaxin Yu 		.name = "Primary Codec",
8650da16e37SJiaxin Yu 		.no_pcm = 1,
8660da16e37SJiaxin Yu 		.dpcm_playback = 1,
8670da16e37SJiaxin Yu 		.dpcm_capture = 1,
8680da16e37SJiaxin Yu 		.ignore_suspend = 1,
869e14657c0SAjye Huang 		.init = primary_codec_init,
8700da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(adda),
8710da16e37SJiaxin Yu 	},
8720da16e37SJiaxin Yu 	{
8730da16e37SJiaxin Yu 		.name = "I2S3",
8740da16e37SJiaxin Yu 		.no_pcm = 1,
8750da16e37SJiaxin Yu 		.dai_fmt = SND_SOC_DAIFMT_I2S |
8760da16e37SJiaxin Yu 			   SND_SOC_DAIFMT_IB_IF |
8770da16e37SJiaxin Yu 			   SND_SOC_DAIFMT_CBM_CFM,
8780da16e37SJiaxin Yu 		.dpcm_playback = 1,
8790da16e37SJiaxin Yu 		.ignore_suspend = 1,
8800da16e37SJiaxin Yu 		.init = mt8186_mt6366_rt1019_rt5682s_hdmi_init,
8810da16e37SJiaxin Yu 		.be_hw_params_fixup = mt8186_it6505_i2s_hw_params_fixup,
8820da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(i2s3),
8830da16e37SJiaxin Yu 	},
8840da16e37SJiaxin Yu 	{
8850da16e37SJiaxin Yu 		.name = "I2S0",
8860da16e37SJiaxin Yu 		.no_pcm = 1,
8870da16e37SJiaxin Yu 		.dpcm_capture = 1,
8880da16e37SJiaxin Yu 		.ignore_suspend = 1,
8890da16e37SJiaxin Yu 		.be_hw_params_fixup = mt8186_i2s_hw_params_fixup,
8900da16e37SJiaxin Yu 		.ops = &mt8186_rt5682s_i2s_ops,
8910da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(i2s0),
8920da16e37SJiaxin Yu 	},
8930da16e37SJiaxin Yu 	{
8940da16e37SJiaxin Yu 		.name = "I2S1",
8950da16e37SJiaxin Yu 		.no_pcm = 1,
8960da16e37SJiaxin Yu 		.dpcm_playback = 1,
8970da16e37SJiaxin Yu 		.ignore_suspend = 1,
8980da16e37SJiaxin Yu 		.be_hw_params_fixup = mt8186_i2s_hw_params_fixup,
8990da16e37SJiaxin Yu 		.init = mt8186_rt5682s_init,
9000da16e37SJiaxin Yu 		.ops = &mt8186_rt5682s_i2s_ops,
9010da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(i2s1),
9020da16e37SJiaxin Yu 	},
9030da16e37SJiaxin Yu 	{
9040da16e37SJiaxin Yu 		.name = "I2S2",
9050da16e37SJiaxin Yu 		.no_pcm = 1,
9060da16e37SJiaxin Yu 		.dpcm_capture = 1,
9070da16e37SJiaxin Yu 		.ignore_suspend = 1,
9080da16e37SJiaxin Yu 		.be_hw_params_fixup = mt8186_i2s_hw_params_fixup,
9090da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(i2s2),
9100da16e37SJiaxin Yu 	},
9110da16e37SJiaxin Yu 	{
9120da16e37SJiaxin Yu 		.name = "HW Gain 1",
9130da16e37SJiaxin Yu 		.no_pcm = 1,
9140da16e37SJiaxin Yu 		.dpcm_playback = 1,
9150da16e37SJiaxin Yu 		.dpcm_capture = 1,
9160da16e37SJiaxin Yu 		.ignore_suspend = 1,
9170da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(hw_gain1),
9180da16e37SJiaxin Yu 	},
9190da16e37SJiaxin Yu 	{
9200da16e37SJiaxin Yu 		.name = "HW Gain 2",
9210da16e37SJiaxin Yu 		.no_pcm = 1,
9220da16e37SJiaxin Yu 		.dpcm_playback = 1,
9230da16e37SJiaxin Yu 		.dpcm_capture = 1,
9240da16e37SJiaxin Yu 		.ignore_suspend = 1,
9250da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(hw_gain2),
9260da16e37SJiaxin Yu 	},
9270da16e37SJiaxin Yu 	{
9280da16e37SJiaxin Yu 		.name = "HW_SRC_1",
9290da16e37SJiaxin Yu 		.no_pcm = 1,
9300da16e37SJiaxin Yu 		.dpcm_playback = 1,
9310da16e37SJiaxin Yu 		.dpcm_capture = 1,
9320da16e37SJiaxin Yu 		.ignore_suspend = 1,
9330da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(hw_src1),
9340da16e37SJiaxin Yu 	},
9350da16e37SJiaxin Yu 	{
9360da16e37SJiaxin Yu 		.name = "HW_SRC_2",
9370da16e37SJiaxin Yu 		.no_pcm = 1,
9380da16e37SJiaxin Yu 		.dpcm_playback = 1,
9390da16e37SJiaxin Yu 		.dpcm_capture = 1,
9400da16e37SJiaxin Yu 		.ignore_suspend = 1,
9410da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(hw_src2),
9420da16e37SJiaxin Yu 	},
9430da16e37SJiaxin Yu 	{
9440da16e37SJiaxin Yu 		.name = "CONNSYS_I2S",
9450da16e37SJiaxin Yu 		.no_pcm = 1,
9460da16e37SJiaxin Yu 		.dpcm_capture = 1,
9470da16e37SJiaxin Yu 		.ignore_suspend = 1,
9480da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(connsys_i2s),
9490da16e37SJiaxin Yu 	},
9500da16e37SJiaxin Yu 	{
9510da16e37SJiaxin Yu 		.name = "PCM 1",
9520da16e37SJiaxin Yu 		.dai_fmt = SND_SOC_DAIFMT_I2S |
9530da16e37SJiaxin Yu 			   SND_SOC_DAIFMT_NB_IF,
9540da16e37SJiaxin Yu 		.no_pcm = 1,
9550da16e37SJiaxin Yu 		.dpcm_playback = 1,
9560da16e37SJiaxin Yu 		.dpcm_capture = 1,
9570da16e37SJiaxin Yu 		.ignore_suspend = 1,
9580da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(pcm1),
9590da16e37SJiaxin Yu 	},
9600da16e37SJiaxin Yu 	{
9610da16e37SJiaxin Yu 		.name = "TDM IN",
9620da16e37SJiaxin Yu 		.no_pcm = 1,
9630da16e37SJiaxin Yu 		.dpcm_capture = 1,
9640da16e37SJiaxin Yu 		.ignore_suspend = 1,
9650da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(tdm_in),
9660da16e37SJiaxin Yu 	},
9670da16e37SJiaxin Yu 	/* dummy BE for ul memif to record from dl memif */
9680da16e37SJiaxin Yu 	{
9690da16e37SJiaxin Yu 		.name = "Hostless_UL1",
9700da16e37SJiaxin Yu 		.no_pcm = 1,
9710da16e37SJiaxin Yu 		.dpcm_capture = 1,
9720da16e37SJiaxin Yu 		.ignore_suspend = 1,
9730da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(hostless_ul1),
9740da16e37SJiaxin Yu 	},
9750da16e37SJiaxin Yu 	{
9760da16e37SJiaxin Yu 		.name = "Hostless_UL2",
9770da16e37SJiaxin Yu 		.no_pcm = 1,
9780da16e37SJiaxin Yu 		.dpcm_capture = 1,
9790da16e37SJiaxin Yu 		.ignore_suspend = 1,
9800da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(hostless_ul2),
9810da16e37SJiaxin Yu 	},
9820da16e37SJiaxin Yu 	{
9830da16e37SJiaxin Yu 		.name = "Hostless_UL3",
9840da16e37SJiaxin Yu 		.no_pcm = 1,
9850da16e37SJiaxin Yu 		.dpcm_capture = 1,
9860da16e37SJiaxin Yu 		.ignore_suspend = 1,
9870da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(hostless_ul3),
9880da16e37SJiaxin Yu 	},
9890da16e37SJiaxin Yu 	{
9900da16e37SJiaxin Yu 		.name = "Hostless_UL5",
9910da16e37SJiaxin Yu 		.no_pcm = 1,
9920da16e37SJiaxin Yu 		.dpcm_capture = 1,
9930da16e37SJiaxin Yu 		.ignore_suspend = 1,
9940da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(hostless_ul5),
9950da16e37SJiaxin Yu 	},
9960da16e37SJiaxin Yu 	{
9970da16e37SJiaxin Yu 		.name = "Hostless_UL6",
9980da16e37SJiaxin Yu 		.no_pcm = 1,
9990da16e37SJiaxin Yu 		.dpcm_capture = 1,
10000da16e37SJiaxin Yu 		.ignore_suspend = 1,
10010da16e37SJiaxin Yu 		SND_SOC_DAILINK_REG(hostless_ul6),
10020da16e37SJiaxin Yu 	},
10034be34e1bSChunxu Li 	/* SOF BE */
10044be34e1bSChunxu Li 	{
10054be34e1bSChunxu Li 		.name = "AFE_SOF_DL1",
10064be34e1bSChunxu Li 		.no_pcm = 1,
10074be34e1bSChunxu Li 		.dpcm_playback = 1,
10084be34e1bSChunxu Li 		SND_SOC_DAILINK_REG(AFE_SOF_DL1),
10094be34e1bSChunxu Li 	},
10104be34e1bSChunxu Li 	{
10114be34e1bSChunxu Li 		.name = "AFE_SOF_DL2",
10124be34e1bSChunxu Li 		.no_pcm = 1,
10134be34e1bSChunxu Li 		.dpcm_playback = 1,
10144be34e1bSChunxu Li 		SND_SOC_DAILINK_REG(AFE_SOF_DL2),
10154be34e1bSChunxu Li 	},
10164be34e1bSChunxu Li 	{
10174be34e1bSChunxu Li 		.name = "AFE_SOF_UL1",
10184be34e1bSChunxu Li 		.no_pcm = 1,
10194be34e1bSChunxu Li 		.dpcm_capture = 1,
10204be34e1bSChunxu Li 		SND_SOC_DAILINK_REG(AFE_SOF_UL1),
10214be34e1bSChunxu Li 	},
10224be34e1bSChunxu Li 	{
10234be34e1bSChunxu Li 		.name = "AFE_SOF_UL2",
10244be34e1bSChunxu Li 		.no_pcm = 1,
10254be34e1bSChunxu Li 		.dpcm_capture = 1,
10264be34e1bSChunxu Li 		SND_SOC_DAILINK_REG(AFE_SOF_UL2),
10274be34e1bSChunxu Li 	},
10280da16e37SJiaxin Yu };
10290da16e37SJiaxin Yu 
10300da16e37SJiaxin Yu static const struct snd_soc_dapm_widget
10310da16e37SJiaxin Yu mt8186_mt6366_rt1019_rt5682s_widgets[] = {
10320da16e37SJiaxin Yu 	SND_SOC_DAPM_SPK("Speakers", NULL),
1033d888e7afSNícolas F. R. A. Prado 	SND_SOC_DAPM_HP("Headphone", NULL),
1034d888e7afSNícolas F. R. A. Prado 	SND_SOC_DAPM_MIC("Headset Mic", NULL),
10350da16e37SJiaxin Yu 	SND_SOC_DAPM_OUTPUT("HDMI1"),
10364be34e1bSChunxu Li 	SND_SOC_DAPM_MIXER(SOF_DMA_DL1, SND_SOC_NOPM, 0, 0, NULL, 0),
10374be34e1bSChunxu Li 	SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),
10384be34e1bSChunxu Li 	SND_SOC_DAPM_MIXER(SOF_DMA_UL1, SND_SOC_NOPM, 0, 0, NULL, 0),
10394be34e1bSChunxu Li 	SND_SOC_DAPM_MIXER(SOF_DMA_UL2, SND_SOC_NOPM, 0, 0, NULL, 0),
10400da16e37SJiaxin Yu };
10410da16e37SJiaxin Yu 
10420da16e37SJiaxin Yu static const struct snd_soc_dapm_route
10430da16e37SJiaxin Yu mt8186_mt6366_rt1019_rt5682s_routes[] = {
10440da16e37SJiaxin Yu 	/* SPK */
10450da16e37SJiaxin Yu 	{ "Speakers", NULL, "Speaker" },
1046d888e7afSNícolas F. R. A. Prado 	/* Headset */
1047d888e7afSNícolas F. R. A. Prado 	{ "Headphone", NULL, "HPOL" },
1048d888e7afSNícolas F. R. A. Prado 	{ "Headphone", NULL, "HPOR" },
1049d888e7afSNícolas F. R. A. Prado 	{ "IN1P", NULL, "Headset Mic" },
10500da16e37SJiaxin Yu 	/* HDMI */
10510da16e37SJiaxin Yu 	{ "HDMI1", NULL, "TX" },
10524be34e1bSChunxu Li 	/* SOF Uplink */
10534be34e1bSChunxu Li 	{SOF_DMA_UL1, NULL, "UL1_CH1"},
10544be34e1bSChunxu Li 	{SOF_DMA_UL1, NULL, "UL1_CH2"},
10554be34e1bSChunxu Li 	{SOF_DMA_UL2, NULL, "UL2_CH1"},
10564be34e1bSChunxu Li 	{SOF_DMA_UL2, NULL, "UL2_CH2"},
10574be34e1bSChunxu Li 	/* SOF Downlink */
10584be34e1bSChunxu Li 	{"DSP_DL1_VIRT", NULL, SOF_DMA_DL1},
10594be34e1bSChunxu Li 	{"DSP_DL2_VIRT", NULL, SOF_DMA_DL2},
10600da16e37SJiaxin Yu };
10610da16e37SJiaxin Yu 
10620da16e37SJiaxin Yu static const struct snd_kcontrol_new
10630da16e37SJiaxin Yu mt8186_mt6366_rt1019_rt5682s_controls[] = {
10640da16e37SJiaxin Yu 	SOC_DAPM_PIN_SWITCH("Speakers"),
1065d888e7afSNícolas F. R. A. Prado 	SOC_DAPM_PIN_SWITCH("Headphone"),
1066d888e7afSNícolas F. R. A. Prado 	SOC_DAPM_PIN_SWITCH("Headset Mic"),
10670da16e37SJiaxin Yu 	SOC_DAPM_PIN_SWITCH("HDMI1"),
10680da16e37SJiaxin Yu };
10690da16e37SJiaxin Yu 
10700da16e37SJiaxin Yu static struct snd_soc_card mt8186_mt6366_rt1019_rt5682s_soc_card = {
1071e8ee449bSchunxu.li 	.name = "mt8186_rt1019_rt5682s",
10720da16e37SJiaxin Yu 	.owner = THIS_MODULE,
10730da16e37SJiaxin Yu 	.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,
10740da16e37SJiaxin Yu 	.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),
10750da16e37SJiaxin Yu 	.controls = mt8186_mt6366_rt1019_rt5682s_controls,
10760da16e37SJiaxin Yu 	.num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),
10770da16e37SJiaxin Yu 	.dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,
10780da16e37SJiaxin Yu 	.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),
10790da16e37SJiaxin Yu 	.dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,
10800da16e37SJiaxin Yu 	.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),
10810da16e37SJiaxin Yu 	.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,
10820da16e37SJiaxin Yu 	.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),
10830da16e37SJiaxin Yu };
10840da16e37SJiaxin Yu 
10856e1dbf69Stongjian static struct snd_soc_card mt8186_mt6366_rt5682s_max98360_soc_card = {
10866e1dbf69Stongjian 	.name = "mt8186_rt5682s_max98360",
10876e1dbf69Stongjian 	.owner = THIS_MODULE,
10886e1dbf69Stongjian 	.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,
10896e1dbf69Stongjian 	.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),
10906e1dbf69Stongjian 	.controls = mt8186_mt6366_rt1019_rt5682s_controls,
10916e1dbf69Stongjian 	.num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),
10926e1dbf69Stongjian 	.dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,
10936e1dbf69Stongjian 	.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),
10946e1dbf69Stongjian 	.dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,
10956e1dbf69Stongjian 	.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),
10966e1dbf69Stongjian 	.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,
10976e1dbf69Stongjian 	.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),
10986e1dbf69Stongjian };
10996e1dbf69Stongjian 
mt8186_mt6366_rt1019_rt5682s_dev_probe(struct platform_device * pdev)11000da16e37SJiaxin Yu static int mt8186_mt6366_rt1019_rt5682s_dev_probe(struct platform_device *pdev)
11010da16e37SJiaxin Yu {
11020da16e37SJiaxin Yu 	struct snd_soc_card *card;
11030da16e37SJiaxin Yu 	struct snd_soc_dai_link *dai_link;
11044be34e1bSChunxu Li 	struct mtk_soc_card_data *soc_card_data;
11054be34e1bSChunxu Li 	struct mt8186_mt6366_rt1019_rt5682s_priv *mach_priv;
11064be34e1bSChunxu Li 	struct device_node *platform_node, *headset_codec, *playback_codec, *adsp_node;
11074be34e1bSChunxu Li 	int sof_on = 0;
11080da16e37SJiaxin Yu 	int ret, i;
11090da16e37SJiaxin Yu 
11100da16e37SJiaxin Yu 	card = (struct snd_soc_card *)device_get_match_data(&pdev->dev);
11110da16e37SJiaxin Yu 	if (!card)
11120da16e37SJiaxin Yu 		return -EINVAL;
11130da16e37SJiaxin Yu 	card->dev = &pdev->dev;
11140da16e37SJiaxin Yu 
11154be34e1bSChunxu Li 	soc_card_data = devm_kzalloc(&pdev->dev, sizeof(*soc_card_data), GFP_KERNEL);
11164be34e1bSChunxu Li 	if (!soc_card_data)
11174be34e1bSChunxu Li 		return -ENOMEM;
11184be34e1bSChunxu Li 	mach_priv = devm_kzalloc(&pdev->dev, sizeof(*mach_priv), GFP_KERNEL);
11194be34e1bSChunxu Li 	if (!mach_priv)
11204be34e1bSChunxu Li 		return -ENOMEM;
11214be34e1bSChunxu Li 
11224be34e1bSChunxu Li 	soc_card_data->mach_priv = mach_priv;
11234be34e1bSChunxu Li 
1124e14657c0SAjye Huang 	mach_priv->dmic_sel = devm_gpiod_get_optional(&pdev->dev,
1125e14657c0SAjye Huang 						      "dmic", GPIOD_OUT_LOW);
1126e14657c0SAjye Huang 	if (IS_ERR(mach_priv->dmic_sel)) {
1127e14657c0SAjye Huang 		dev_err(&pdev->dev, "DMIC gpio failed err=%ld\n",
1128e14657c0SAjye Huang 			PTR_ERR(mach_priv->dmic_sel));
1129e14657c0SAjye Huang 		return PTR_ERR(mach_priv->dmic_sel);
1130e14657c0SAjye Huang 	}
1131e14657c0SAjye Huang 
11324be34e1bSChunxu Li 	adsp_node = of_parse_phandle(pdev->dev.of_node, "mediatek,adsp", 0);
11334be34e1bSChunxu Li 	if (adsp_node) {
11344be34e1bSChunxu Li 		struct mtk_sof_priv *sof_priv;
11354be34e1bSChunxu Li 
11364be34e1bSChunxu Li 		sof_priv = devm_kzalloc(&pdev->dev, sizeof(*sof_priv), GFP_KERNEL);
11374be34e1bSChunxu Li 		if (!sof_priv) {
11384be34e1bSChunxu Li 			ret = -ENOMEM;
11394be34e1bSChunxu Li 			goto err_adsp_node;
11404be34e1bSChunxu Li 		}
11414be34e1bSChunxu Li 		sof_priv->conn_streams = g_sof_conn_streams;
11424be34e1bSChunxu Li 		sof_priv->num_streams = ARRAY_SIZE(g_sof_conn_streams);
11434be34e1bSChunxu Li 		sof_priv->sof_dai_link_fixup = mt8186_sof_dai_link_fixup;
11444be34e1bSChunxu Li 		soc_card_data->sof_priv = sof_priv;
11454be34e1bSChunxu Li 		card->probe = mtk_sof_card_probe;
11464be34e1bSChunxu Li 		card->late_probe = mtk_sof_card_late_probe;
11474be34e1bSChunxu Li 		if (!card->topology_shortname_created) {
11484be34e1bSChunxu Li 			snprintf(card->topology_shortname, 32, "sof-%s", card->name);
11494be34e1bSChunxu Li 			card->topology_shortname_created = true;
11504be34e1bSChunxu Li 		}
11514be34e1bSChunxu Li 		card->name = card->topology_shortname;
11524be34e1bSChunxu Li 		sof_on = 1;
11534be34e1bSChunxu Li 	} else {
11543af24372SAllen-KH Cheng 		dev_dbg(&pdev->dev, "Probe without adsp\n");
11554be34e1bSChunxu Li 	}
11564be34e1bSChunxu Li 
11574be34e1bSChunxu Li 	if (of_property_read_bool(pdev->dev.of_node, "mediatek,dai-link")) {
11584be34e1bSChunxu Li 		ret = mtk_sof_dailink_parse_of(card, pdev->dev.of_node,
11594be34e1bSChunxu Li 					       "mediatek,dai-link",
11604be34e1bSChunxu Li 					       mt8186_mt6366_rt1019_rt5682s_dai_links,
11614be34e1bSChunxu Li 					       ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links));
11624be34e1bSChunxu Li 		if (ret) {
11634be34e1bSChunxu Li 			dev_dbg(&pdev->dev, "Parse dai-link fail\n");
11644be34e1bSChunxu Li 			goto err_adsp_node;
11654be34e1bSChunxu Li 		}
11664be34e1bSChunxu Li 	} else {
11674be34e1bSChunxu Li 		if (!sof_on)
11684be34e1bSChunxu Li 			card->num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links)
11694be34e1bSChunxu Li 					- ARRAY_SIZE(g_sof_conn_streams);
11704be34e1bSChunxu Li 	}
11714be34e1bSChunxu Li 
11720da16e37SJiaxin Yu 	platform_node = of_parse_phandle(pdev->dev.of_node, "mediatek,platform", 0);
11730da16e37SJiaxin Yu 	if (!platform_node) {
11740da16e37SJiaxin Yu 		ret = -EINVAL;
11750da16e37SJiaxin Yu 		dev_err_probe(&pdev->dev, ret, "Property 'platform' missing or invalid\n");
11764be34e1bSChunxu Li 		goto err_platform_node;
11770da16e37SJiaxin Yu 	}
11780da16e37SJiaxin Yu 
11790da16e37SJiaxin Yu 	playback_codec = of_get_child_by_name(pdev->dev.of_node, "playback-codecs");
11800da16e37SJiaxin Yu 	if (!playback_codec) {
11810da16e37SJiaxin Yu 		ret = -EINVAL;
1182*74b6a2f2SEugen Hristev 		dev_err_probe(&pdev->dev, ret, "Property 'playback-codecs' missing or invalid\n");
11830da16e37SJiaxin Yu 		goto err_playback_codec;
11840da16e37SJiaxin Yu 	}
11850da16e37SJiaxin Yu 
11860da16e37SJiaxin Yu 	headset_codec = of_get_child_by_name(pdev->dev.of_node, "headset-codec");
11870da16e37SJiaxin Yu 	if (!headset_codec) {
11880da16e37SJiaxin Yu 		ret = -EINVAL;
11890da16e37SJiaxin Yu 		dev_err_probe(&pdev->dev, ret, "Property 'headset-codec' missing or invalid\n");
11900da16e37SJiaxin Yu 		goto err_headset_codec;
11910da16e37SJiaxin Yu 	}
11920da16e37SJiaxin Yu 
11930da16e37SJiaxin Yu 	for_each_card_prelinks(card, i, dai_link) {
11940da16e37SJiaxin Yu 		ret = mt8186_mt6366_card_set_be_link(card, dai_link, playback_codec, "I2S3");
11950da16e37SJiaxin Yu 		if (ret) {
1196*74b6a2f2SEugen Hristev 			dev_err_probe(&pdev->dev, ret, "%s set playback_codec fail\n",
11970da16e37SJiaxin Yu 				      dai_link->name);
11980da16e37SJiaxin Yu 			goto err_probe;
11990da16e37SJiaxin Yu 		}
12000da16e37SJiaxin Yu 
12010da16e37SJiaxin Yu 		ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S0");
12020da16e37SJiaxin Yu 		if (ret) {
12030da16e37SJiaxin Yu 			dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n",
12040da16e37SJiaxin Yu 				      dai_link->name);
12050da16e37SJiaxin Yu 			goto err_probe;
12060da16e37SJiaxin Yu 		}
12070da16e37SJiaxin Yu 
12080da16e37SJiaxin Yu 		ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S1");
12090da16e37SJiaxin Yu 		if (ret) {
12100da16e37SJiaxin Yu 			dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n",
12110da16e37SJiaxin Yu 				      dai_link->name);
12120da16e37SJiaxin Yu 			goto err_probe;
12130da16e37SJiaxin Yu 		}
12140da16e37SJiaxin Yu 
12154be34e1bSChunxu Li 		if (!strncmp(dai_link->name, "AFE_SOF", strlen("AFE_SOF")) && sof_on)
12164be34e1bSChunxu Li 			dai_link->platforms->of_node = adsp_node;
12174be34e1bSChunxu Li 
12184be34e1bSChunxu Li 		if (!dai_link->platforms->name && !dai_link->platforms->of_node)
12190da16e37SJiaxin Yu 			dai_link->platforms->of_node = platform_node;
12200da16e37SJiaxin Yu 	}
12210da16e37SJiaxin Yu 
12224be34e1bSChunxu Li 	snd_soc_card_set_drvdata(card, soc_card_data);
12230da16e37SJiaxin Yu 
12240da16e37SJiaxin Yu 	ret = mt8186_afe_gpio_init(&pdev->dev);
12250da16e37SJiaxin Yu 	if (ret) {
12260da16e37SJiaxin Yu 		dev_err_probe(&pdev->dev, ret, "%s init gpio error\n", __func__);
12270da16e37SJiaxin Yu 		goto err_probe;
12280da16e37SJiaxin Yu 	}
12290da16e37SJiaxin Yu 
12300da16e37SJiaxin Yu 	ret = devm_snd_soc_register_card(&pdev->dev, card);
12310da16e37SJiaxin Yu 	if (ret)
12320da16e37SJiaxin Yu 		dev_err_probe(&pdev->dev, ret, "%s snd_soc_register_card fail\n", __func__);
12330da16e37SJiaxin Yu 
12340da16e37SJiaxin Yu err_probe:
12350da16e37SJiaxin Yu 	of_node_put(headset_codec);
12360da16e37SJiaxin Yu err_headset_codec:
12370da16e37SJiaxin Yu 	of_node_put(playback_codec);
12380da16e37SJiaxin Yu err_playback_codec:
12390da16e37SJiaxin Yu 	of_node_put(platform_node);
12404be34e1bSChunxu Li err_platform_node:
12414be34e1bSChunxu Li err_adsp_node:
12424be34e1bSChunxu Li 	of_node_put(adsp_node);
12430da16e37SJiaxin Yu 
12440da16e37SJiaxin Yu 	return ret;
12450da16e37SJiaxin Yu }
12460da16e37SJiaxin Yu 
12470da16e37SJiaxin Yu #if IS_ENABLED(CONFIG_OF)
12480da16e37SJiaxin Yu static const struct of_device_id mt8186_mt6366_rt1019_rt5682s_dt_match[] = {
12496e1dbf69Stongjian 	{
12506e1dbf69Stongjian 		.compatible = "mediatek,mt8186-mt6366-rt1019-rt5682s-sound",
12510da16e37SJiaxin Yu 		.data = &mt8186_mt6366_rt1019_rt5682s_soc_card,
12520da16e37SJiaxin Yu 	},
12536e1dbf69Stongjian 	{
12546e1dbf69Stongjian 		.compatible = "mediatek,mt8186-mt6366-rt5682s-max98360-sound",
12556e1dbf69Stongjian 		.data = &mt8186_mt6366_rt5682s_max98360_soc_card,
12566e1dbf69Stongjian 	},
12570da16e37SJiaxin Yu 	{}
12580da16e37SJiaxin Yu };
12595d7c2ac0SNícolas F. R. A. Prado MODULE_DEVICE_TABLE(of, mt8186_mt6366_rt1019_rt5682s_dt_match);
12600da16e37SJiaxin Yu #endif
12610da16e37SJiaxin Yu 
12620da16e37SJiaxin Yu static struct platform_driver mt8186_mt6366_rt1019_rt5682s_driver = {
12630da16e37SJiaxin Yu 	.driver = {
12640da16e37SJiaxin Yu 		.name = "mt8186_mt6366_rt1019_rt5682s",
12650da16e37SJiaxin Yu #if IS_ENABLED(CONFIG_OF)
12660da16e37SJiaxin Yu 		.of_match_table = mt8186_mt6366_rt1019_rt5682s_dt_match,
12670da16e37SJiaxin Yu #endif
12680da16e37SJiaxin Yu 		.pm = &snd_soc_pm_ops,
12690da16e37SJiaxin Yu 	},
12700da16e37SJiaxin Yu 	.probe = mt8186_mt6366_rt1019_rt5682s_dev_probe,
12710da16e37SJiaxin Yu };
12720da16e37SJiaxin Yu 
12730da16e37SJiaxin Yu module_platform_driver(mt8186_mt6366_rt1019_rt5682s_driver);
12740da16e37SJiaxin Yu 
12750da16e37SJiaxin Yu /* Module information */
12760da16e37SJiaxin Yu MODULE_DESCRIPTION("MT8186-MT6366-RT1019-RT5682S ALSA SoC machine driver");
12770da16e37SJiaxin Yu MODULE_AUTHOR("Jiaxin Yu <jiaxin.yu@mediatek.com>");
12780da16e37SJiaxin Yu MODULE_LICENSE("GPL v2");
12790da16e37SJiaxin Yu MODULE_ALIAS("mt8186_mt6366_rt1019_rt5682s soc card");
1280