xref: /linux/sound/soc/mediatek/mt8186/mt8186-mt6366.c (revision 33e02dc69afbd8f1b85a51d74d72f139ba4ca623)
16ed619b3SAngeloGioacchino Del Regno // SPDX-License-Identifier: GPL-2.0
26ed619b3SAngeloGioacchino Del Regno //
36ed619b3SAngeloGioacchino Del Regno // mt8186-mt6366.c
46ed619b3SAngeloGioacchino Del Regno //	--  MT8186-MT6366 ALSA SoC machine driver
56ed619b3SAngeloGioacchino Del Regno //
66ed619b3SAngeloGioacchino Del Regno // Copyright (c) 2022 MediaTek Inc.
76ed619b3SAngeloGioacchino Del Regno // Author: Jiaxin Yu <jiaxin.yu@mediatek.com>
86ed619b3SAngeloGioacchino Del Regno //
96ed619b3SAngeloGioacchino Del Regno // Copyright (c) 2024 Collabora Ltd.
106ed619b3SAngeloGioacchino Del Regno //                    AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
116ed619b3SAngeloGioacchino Del Regno //
126ed619b3SAngeloGioacchino Del Regno 
136ed619b3SAngeloGioacchino Del Regno #include <linux/gpio/consumer.h>
146ed619b3SAngeloGioacchino Del Regno #include <linux/input.h>
156ed619b3SAngeloGioacchino Del Regno #include <linux/module.h>
166ed619b3SAngeloGioacchino Del Regno #include <linux/of.h>
176ed619b3SAngeloGioacchino Del Regno #include <sound/jack.h>
186ed619b3SAngeloGioacchino Del Regno #include <sound/pcm_params.h>
196ed619b3SAngeloGioacchino Del Regno #include <sound/rt5682.h>
206ed619b3SAngeloGioacchino Del Regno #include <sound/soc.h>
216ed619b3SAngeloGioacchino Del Regno 
226ed619b3SAngeloGioacchino Del Regno #include "../../codecs/da7219.h"
236ed619b3SAngeloGioacchino Del Regno #include "../../codecs/mt6358.h"
246ed619b3SAngeloGioacchino Del Regno #include "../../codecs/rt5682.h"
256ed619b3SAngeloGioacchino Del Regno #include "../common/mtk-afe-platform-driver.h"
266ed619b3SAngeloGioacchino Del Regno #include "../common/mtk-dsp-sof-common.h"
276ed619b3SAngeloGioacchino Del Regno #include "../common/mtk-soc-card.h"
286ed619b3SAngeloGioacchino Del Regno #include "../common/mtk-soundcard-driver.h"
296ed619b3SAngeloGioacchino Del Regno #include "mt8186-afe-common.h"
306ed619b3SAngeloGioacchino Del Regno #include "mt8186-afe-clk.h"
316ed619b3SAngeloGioacchino Del Regno #include "mt8186-afe-gpio.h"
326ed619b3SAngeloGioacchino Del Regno #include "mt8186-mt6366-common.h"
336ed619b3SAngeloGioacchino Del Regno 
346ed619b3SAngeloGioacchino Del Regno #define RT1019_CODEC_DAI	"HiFi"
356ed619b3SAngeloGioacchino Del Regno #define RT1019_DEV0_NAME	"rt1019p"
366ed619b3SAngeloGioacchino Del Regno 
376ed619b3SAngeloGioacchino Del Regno #define RT5682S_CODEC_DAI	"rt5682s-aif1"
386ed619b3SAngeloGioacchino Del Regno #define RT5682S_DEV0_NAME	"rt5682s.5-001a"
396ed619b3SAngeloGioacchino Del Regno 
406ed619b3SAngeloGioacchino Del Regno #define DA7219_CODEC_DAI	"da7219-hifi"
416ed619b3SAngeloGioacchino Del Regno #define DA7219_DEV_NAME		"da7219.5-001a"
426ed619b3SAngeloGioacchino Del Regno 
436ed619b3SAngeloGioacchino Del Regno #define SOF_DMA_DL1 "SOF_DMA_DL1"
446ed619b3SAngeloGioacchino Del Regno #define SOF_DMA_DL2 "SOF_DMA_DL2"
456ed619b3SAngeloGioacchino Del Regno #define SOF_DMA_UL1 "SOF_DMA_UL1"
466ed619b3SAngeloGioacchino Del Regno #define SOF_DMA_UL2 "SOF_DMA_UL2"
476ed619b3SAngeloGioacchino Del Regno 
486ed619b3SAngeloGioacchino Del Regno #define DA7219_CODEC_PRESENT	BIT(0)
496ed619b3SAngeloGioacchino Del Regno 
506ed619b3SAngeloGioacchino Del Regno struct mt8186_mt6366_rt1019_rt5682s_priv {
516ed619b3SAngeloGioacchino Del Regno 	struct gpio_desc *dmic_sel;
526ed619b3SAngeloGioacchino Del Regno 	int dmic_switch;
536ed619b3SAngeloGioacchino Del Regno };
546ed619b3SAngeloGioacchino Del Regno 
556ed619b3SAngeloGioacchino Del Regno enum mt8186_jacks {
566ed619b3SAngeloGioacchino Del Regno 	MT8186_JACK_HEADSET,
576ed619b3SAngeloGioacchino Del Regno 	MT8186_JACK_HDMI,
586ed619b3SAngeloGioacchino Del Regno 	MT8186_JACK_MAX,
596ed619b3SAngeloGioacchino Del Regno };
606ed619b3SAngeloGioacchino Del Regno 
616ed619b3SAngeloGioacchino Del Regno /* Headset jack detection DAPM pins */
626ed619b3SAngeloGioacchino Del Regno static struct snd_soc_jack_pin mt8186_jack_pins[] = {
636ed619b3SAngeloGioacchino Del Regno 	{
646ed619b3SAngeloGioacchino Del Regno 		.pin = "Headphone",
656ed619b3SAngeloGioacchino Del Regno 		.mask = SND_JACK_HEADPHONE,
666ed619b3SAngeloGioacchino Del Regno 	},
676ed619b3SAngeloGioacchino Del Regno 	{
686ed619b3SAngeloGioacchino Del Regno 		.pin = "Headset Mic",
696ed619b3SAngeloGioacchino Del Regno 		.mask = SND_JACK_MICROPHONE,
706ed619b3SAngeloGioacchino Del Regno 	},
716ed619b3SAngeloGioacchino Del Regno };
726ed619b3SAngeloGioacchino Del Regno 
736ed619b3SAngeloGioacchino Del Regno static struct snd_soc_codec_conf mt8186_mt6366_rt1019_rt5682s_codec_conf[] = {
746ed619b3SAngeloGioacchino Del Regno 	{
756ed619b3SAngeloGioacchino Del Regno 		.dlc = COMP_CODEC_CONF("mt6358-sound"),
766ed619b3SAngeloGioacchino Del Regno 		.name_prefix = "Mt6366",
776ed619b3SAngeloGioacchino Del Regno 	},
786ed619b3SAngeloGioacchino Del Regno 	{
796ed619b3SAngeloGioacchino Del Regno 		.dlc = COMP_CODEC_CONF("bt-sco"),
806ed619b3SAngeloGioacchino Del Regno 		.name_prefix = "Mt8186 bt",
816ed619b3SAngeloGioacchino Del Regno 	},
826ed619b3SAngeloGioacchino Del Regno 	{
836ed619b3SAngeloGioacchino Del Regno 		.dlc = COMP_CODEC_CONF("hdmi-audio-codec"),
846ed619b3SAngeloGioacchino Del Regno 		.name_prefix = "Mt8186 hdmi",
856ed619b3SAngeloGioacchino Del Regno 	},
866ed619b3SAngeloGioacchino Del Regno };
876ed619b3SAngeloGioacchino Del Regno 
dmic_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)886ed619b3SAngeloGioacchino Del Regno static int dmic_get(struct snd_kcontrol *kcontrol,
896ed619b3SAngeloGioacchino Del Regno 		    struct snd_ctl_elem_value *ucontrol)
906ed619b3SAngeloGioacchino Del Regno {
916ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol);
926ed619b3SAngeloGioacchino Del Regno 	struct mtk_soc_card_data *soc_card_data =
936ed619b3SAngeloGioacchino Del Regno 		snd_soc_card_get_drvdata(dapm->card);
946ed619b3SAngeloGioacchino Del Regno 	struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
956ed619b3SAngeloGioacchino Del Regno 
966ed619b3SAngeloGioacchino Del Regno 	ucontrol->value.integer.value[0] = priv->dmic_switch;
976ed619b3SAngeloGioacchino Del Regno 	return 0;
986ed619b3SAngeloGioacchino Del Regno }
996ed619b3SAngeloGioacchino Del Regno 
dmic_set(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)1006ed619b3SAngeloGioacchino Del Regno static int dmic_set(struct snd_kcontrol *kcontrol,
1016ed619b3SAngeloGioacchino Del Regno 		    struct snd_ctl_elem_value *ucontrol)
1026ed619b3SAngeloGioacchino Del Regno {
1036ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol);
1046ed619b3SAngeloGioacchino Del Regno 	struct mtk_soc_card_data *soc_card_data =
1056ed619b3SAngeloGioacchino Del Regno 		snd_soc_card_get_drvdata(dapm->card);
1066ed619b3SAngeloGioacchino Del Regno 	struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
1076ed619b3SAngeloGioacchino Del Regno 
1086ed619b3SAngeloGioacchino Del Regno 	priv->dmic_switch = ucontrol->value.integer.value[0];
1096ed619b3SAngeloGioacchino Del Regno 	if (priv->dmic_sel) {
1106ed619b3SAngeloGioacchino Del Regno 		gpiod_set_value(priv->dmic_sel, priv->dmic_switch);
1116ed619b3SAngeloGioacchino Del Regno 		dev_dbg(dapm->card->dev, "dmic_set_value %d\n",
1126ed619b3SAngeloGioacchino Del Regno 			 priv->dmic_switch);
1136ed619b3SAngeloGioacchino Del Regno 	}
1146ed619b3SAngeloGioacchino Del Regno 	return 0;
1156ed619b3SAngeloGioacchino Del Regno }
1166ed619b3SAngeloGioacchino Del Regno 
1176ed619b3SAngeloGioacchino Del Regno static const char * const dmic_mux_text[] = {
1186ed619b3SAngeloGioacchino Del Regno 	"Front Mic",
1196ed619b3SAngeloGioacchino Del Regno 	"Rear Mic",
1206ed619b3SAngeloGioacchino Del Regno };
1216ed619b3SAngeloGioacchino Del Regno 
1226ed619b3SAngeloGioacchino Del Regno static SOC_ENUM_SINGLE_DECL(mt8186_dmic_enum,
1236ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_NOPM, 0, dmic_mux_text);
1246ed619b3SAngeloGioacchino Del Regno 
1256ed619b3SAngeloGioacchino Del Regno static const struct snd_kcontrol_new mt8186_dmic_mux_control =
1266ed619b3SAngeloGioacchino Del Regno 	SOC_DAPM_ENUM_EXT("DMIC Select Mux", mt8186_dmic_enum,
1276ed619b3SAngeloGioacchino Del Regno 			  dmic_get, dmic_set);
1286ed619b3SAngeloGioacchino Del Regno 
1296ed619b3SAngeloGioacchino Del Regno static const struct snd_soc_dapm_widget dmic_widgets[] = {
1306ed619b3SAngeloGioacchino Del Regno 	SND_SOC_DAPM_MIC("DMIC", NULL),
1316ed619b3SAngeloGioacchino Del Regno 	SND_SOC_DAPM_MUX("Dmic Mux", SND_SOC_NOPM, 0, 0, &mt8186_dmic_mux_control),
1326ed619b3SAngeloGioacchino Del Regno };
1336ed619b3SAngeloGioacchino Del Regno 
1346ed619b3SAngeloGioacchino Del Regno static const struct snd_soc_dapm_route dmic_map[] = {
1356ed619b3SAngeloGioacchino Del Regno 	/* digital mics */
1366ed619b3SAngeloGioacchino Del Regno 	{"Dmic Mux", "Front Mic", "DMIC"},
1376ed619b3SAngeloGioacchino Del Regno 	{"Dmic Mux", "Rear Mic", "DMIC"},
1386ed619b3SAngeloGioacchino Del Regno };
1396ed619b3SAngeloGioacchino Del Regno 
primary_codec_init(struct snd_soc_pcm_runtime * rtd)1406ed619b3SAngeloGioacchino Del Regno static int primary_codec_init(struct snd_soc_pcm_runtime *rtd)
1416ed619b3SAngeloGioacchino Del Regno {
1426ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_card *card = rtd->card;
1436ed619b3SAngeloGioacchino Del Regno 	struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);
1446ed619b3SAngeloGioacchino Del Regno 	struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
1456ed619b3SAngeloGioacchino Del Regno 	int ret;
1466ed619b3SAngeloGioacchino Del Regno 
1476ed619b3SAngeloGioacchino Del Regno 	ret = mt8186_mt6366_init(rtd);
1486ed619b3SAngeloGioacchino Del Regno 
1496ed619b3SAngeloGioacchino Del Regno 	if (ret) {
1506ed619b3SAngeloGioacchino Del Regno 		dev_err(card->dev, "mt8186_mt6366_init failed: %d\n", ret);
1516ed619b3SAngeloGioacchino Del Regno 		return ret;
1526ed619b3SAngeloGioacchino Del Regno 	}
1536ed619b3SAngeloGioacchino Del Regno 
1546ed619b3SAngeloGioacchino Del Regno 	if (!priv->dmic_sel) {
1556ed619b3SAngeloGioacchino Del Regno 		dev_dbg(card->dev, "dmic_sel is null\n");
1566ed619b3SAngeloGioacchino Del Regno 		return 0;
1576ed619b3SAngeloGioacchino Del Regno 	}
1586ed619b3SAngeloGioacchino Del Regno 
1596ed619b3SAngeloGioacchino Del Regno 	ret = snd_soc_dapm_new_controls(&card->dapm, dmic_widgets,
1606ed619b3SAngeloGioacchino Del Regno 					ARRAY_SIZE(dmic_widgets));
1616ed619b3SAngeloGioacchino Del Regno 	if (ret) {
1626ed619b3SAngeloGioacchino Del Regno 		dev_err(card->dev, "DMic widget addition failed: %d\n", ret);
1636ed619b3SAngeloGioacchino Del Regno 		/* Don't need to add routes if widget addition failed */
1646ed619b3SAngeloGioacchino Del Regno 		return ret;
1656ed619b3SAngeloGioacchino Del Regno 	}
1666ed619b3SAngeloGioacchino Del Regno 
1676ed619b3SAngeloGioacchino Del Regno 	ret = snd_soc_dapm_add_routes(&card->dapm, dmic_map,
1686ed619b3SAngeloGioacchino Del Regno 				      ARRAY_SIZE(dmic_map));
1696ed619b3SAngeloGioacchino Del Regno 
1706ed619b3SAngeloGioacchino Del Regno 	if (ret)
1716ed619b3SAngeloGioacchino Del Regno 		dev_err(card->dev, "DMic map addition failed: %d\n", ret);
1726ed619b3SAngeloGioacchino Del Regno 
1736ed619b3SAngeloGioacchino Del Regno 	return ret;
1746ed619b3SAngeloGioacchino Del Regno }
1756ed619b3SAngeloGioacchino Del Regno 
mt8186_headset_codec_init(struct snd_soc_pcm_runtime * rtd)1766ed619b3SAngeloGioacchino Del Regno static int mt8186_headset_codec_init(struct snd_soc_pcm_runtime *rtd)
1776ed619b3SAngeloGioacchino Del Regno {
1786ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_component *cmpnt_afe =
1796ed619b3SAngeloGioacchino Del Regno 		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
1806ed619b3SAngeloGioacchino Del Regno 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
1816ed619b3SAngeloGioacchino Del Regno 	struct mtk_soc_card_data *soc_card_data =
1826ed619b3SAngeloGioacchino Del Regno 		snd_soc_card_get_drvdata(rtd->card);
1836ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8186_JACK_HEADSET];
1846ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_component *cmpnt_codec =
1856ed619b3SAngeloGioacchino Del Regno 		snd_soc_rtd_to_codec(rtd, 0)->component;
1866ed619b3SAngeloGioacchino Del Regno 	const int hs_keys_rt5682[] = {
1876ed619b3SAngeloGioacchino Del Regno 		KEY_PLAYPAUSE, KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_VOICECOMMAND
1886ed619b3SAngeloGioacchino Del Regno 	};
1896ed619b3SAngeloGioacchino Del Regno 	const int hs_keys_da7219[] = {
1906ed619b3SAngeloGioacchino Del Regno 		KEY_PLAYPAUSE, KEY_VOICECOMMAND, KEY_VOLUMEUP, KEY_VOLUMEDOWN
1916ed619b3SAngeloGioacchino Del Regno 	};
1926ed619b3SAngeloGioacchino Del Regno 	const int *hs_keys;
1936ed619b3SAngeloGioacchino Del Regno 	int ret;
1946ed619b3SAngeloGioacchino Del Regno 	int type;
1956ed619b3SAngeloGioacchino Del Regno 
1966ed619b3SAngeloGioacchino Del Regno 	ret = mt8186_dai_i2s_set_share(afe, "I2S1", "I2S0");
1976ed619b3SAngeloGioacchino Del Regno 	if (ret) {
1986ed619b3SAngeloGioacchino Del Regno 		dev_err(rtd->dev, "Failed to set up shared clocks\n");
1996ed619b3SAngeloGioacchino Del Regno 		return ret;
2006ed619b3SAngeloGioacchino Del Regno 	}
2016ed619b3SAngeloGioacchino Del Regno 
2026ed619b3SAngeloGioacchino Del Regno 	ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
2036ed619b3SAngeloGioacchino Del Regno 				    SND_JACK_HEADSET | SND_JACK_BTN_0 |
2046ed619b3SAngeloGioacchino Del Regno 				    SND_JACK_BTN_1 | SND_JACK_BTN_2 |
2056ed619b3SAngeloGioacchino Del Regno 				    SND_JACK_BTN_3,
2066ed619b3SAngeloGioacchino Del Regno 				    jack, mt8186_jack_pins,
2076ed619b3SAngeloGioacchino Del Regno 				    ARRAY_SIZE(mt8186_jack_pins));
2086ed619b3SAngeloGioacchino Del Regno 	if (ret) {
2096ed619b3SAngeloGioacchino Del Regno 		dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
2106ed619b3SAngeloGioacchino Del Regno 		return ret;
2116ed619b3SAngeloGioacchino Del Regno 	}
2126ed619b3SAngeloGioacchino Del Regno 
2136ed619b3SAngeloGioacchino Del Regno 	if (soc_card_data->card_data->flags & DA7219_CODEC_PRESENT)
2146ed619b3SAngeloGioacchino Del Regno 		hs_keys = hs_keys_da7219;
2156ed619b3SAngeloGioacchino Del Regno 	else
2166ed619b3SAngeloGioacchino Del Regno 		hs_keys = hs_keys_rt5682;
2176ed619b3SAngeloGioacchino Del Regno 
2186ed619b3SAngeloGioacchino Del Regno 	snd_jack_set_key(jack->jack, SND_JACK_BTN_0, hs_keys[0]);
2196ed619b3SAngeloGioacchino Del Regno 	snd_jack_set_key(jack->jack, SND_JACK_BTN_1, hs_keys[1]);
2206ed619b3SAngeloGioacchino Del Regno 	snd_jack_set_key(jack->jack, SND_JACK_BTN_2, hs_keys[2]);
2216ed619b3SAngeloGioacchino Del Regno 	snd_jack_set_key(jack->jack, SND_JACK_BTN_3, hs_keys[3]);
2226ed619b3SAngeloGioacchino Del Regno 
2236ed619b3SAngeloGioacchino Del Regno 	type = SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2 | SND_JACK_BTN_3;
2246ed619b3SAngeloGioacchino Del Regno 	return snd_soc_component_set_jack(cmpnt_codec, jack, (void *)&type);
2256ed619b3SAngeloGioacchino Del Regno }
2266ed619b3SAngeloGioacchino Del Regno 
mt8186_da7219_i2s_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params)2276ed619b3SAngeloGioacchino Del Regno static int mt8186_da7219_i2s_hw_params(struct snd_pcm_substream *substream,
2286ed619b3SAngeloGioacchino Del Regno 				       struct snd_pcm_hw_params *params)
2296ed619b3SAngeloGioacchino Del Regno {
2306ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
2316ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
2326ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_dai *codec_dai;
2336ed619b3SAngeloGioacchino Del Regno 	unsigned int rate = params_rate(params);
2346ed619b3SAngeloGioacchino Del Regno 	unsigned int mclk_fs_ratio = 256;
2356ed619b3SAngeloGioacchino Del Regno 	unsigned int mclk_fs = rate * mclk_fs_ratio;
2366ed619b3SAngeloGioacchino Del Regno 	unsigned int freq;
2376ed619b3SAngeloGioacchino Del Regno 	int ret, j;
2386ed619b3SAngeloGioacchino Del Regno 
2396ed619b3SAngeloGioacchino Del Regno 	ret = snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
2406ed619b3SAngeloGioacchino Del Regno 	if (ret < 0) {
2416ed619b3SAngeloGioacchino Del Regno 		dev_err(rtd->dev, "failed to set cpu dai sysclk: %d\n", ret);
2426ed619b3SAngeloGioacchino Del Regno 		return ret;
2436ed619b3SAngeloGioacchino Del Regno 	}
2446ed619b3SAngeloGioacchino Del Regno 
2456ed619b3SAngeloGioacchino Del Regno 	for_each_rtd_codec_dais(rtd, j, codec_dai) {
2466ed619b3SAngeloGioacchino Del Regno 		if (strcmp(codec_dai->component->name, DA7219_DEV_NAME))
2476ed619b3SAngeloGioacchino Del Regno 			continue;
2486ed619b3SAngeloGioacchino Del Regno 
2496ed619b3SAngeloGioacchino Del Regno 		ret = snd_soc_dai_set_sysclk(codec_dai, DA7219_CLKSRC_MCLK,
2506ed619b3SAngeloGioacchino Del Regno 					     mclk_fs, SND_SOC_CLOCK_IN);
2516ed619b3SAngeloGioacchino Del Regno 		if (ret < 0) {
2526ed619b3SAngeloGioacchino Del Regno 			dev_err(rtd->dev, "failed to set sysclk: %d\n", ret);
2536ed619b3SAngeloGioacchino Del Regno 			return ret;
2546ed619b3SAngeloGioacchino Del Regno 		}
2556ed619b3SAngeloGioacchino Del Regno 
2566ed619b3SAngeloGioacchino Del Regno 		if ((rate % 8000) == 0)
2576ed619b3SAngeloGioacchino Del Regno 			freq = DA7219_PLL_FREQ_OUT_98304;
2586ed619b3SAngeloGioacchino Del Regno 		else
2596ed619b3SAngeloGioacchino Del Regno 			freq = DA7219_PLL_FREQ_OUT_90316;
2606ed619b3SAngeloGioacchino Del Regno 
2616ed619b3SAngeloGioacchino Del Regno 		ret = snd_soc_dai_set_pll(codec_dai, 0, DA7219_SYSCLK_PLL_SRM,
2626ed619b3SAngeloGioacchino Del Regno 					  0, freq);
2636ed619b3SAngeloGioacchino Del Regno 		if (ret) {
2646ed619b3SAngeloGioacchino Del Regno 			dev_err(rtd->dev, "failed to start PLL: %d\n", ret);
2656ed619b3SAngeloGioacchino Del Regno 			return ret;
2666ed619b3SAngeloGioacchino Del Regno 		}
2676ed619b3SAngeloGioacchino Del Regno 	}
2686ed619b3SAngeloGioacchino Del Regno 
2696ed619b3SAngeloGioacchino Del Regno 	return 0;
2706ed619b3SAngeloGioacchino Del Regno }
2716ed619b3SAngeloGioacchino Del Regno 
mt8186_da7219_i2s_hw_free(struct snd_pcm_substream * substream)2726ed619b3SAngeloGioacchino Del Regno static int mt8186_da7219_i2s_hw_free(struct snd_pcm_substream *substream)
2736ed619b3SAngeloGioacchino Del Regno {
2746ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
2756ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_dai *codec_dai;
2766ed619b3SAngeloGioacchino Del Regno 	int j, ret;
2776ed619b3SAngeloGioacchino Del Regno 
2786ed619b3SAngeloGioacchino Del Regno 	for_each_rtd_codec_dais(rtd, j, codec_dai) {
2796ed619b3SAngeloGioacchino Del Regno 		if (strcmp(codec_dai->component->name, DA7219_DEV_NAME))
2806ed619b3SAngeloGioacchino Del Regno 			continue;
2816ed619b3SAngeloGioacchino Del Regno 
2826ed619b3SAngeloGioacchino Del Regno 		ret = snd_soc_dai_set_pll(codec_dai, 0, DA7219_SYSCLK_MCLK, 0, 0);
2836ed619b3SAngeloGioacchino Del Regno 		if (ret < 0) {
2846ed619b3SAngeloGioacchino Del Regno 			dev_err(rtd->dev, "failed to stop PLL: %d\n", ret);
2856ed619b3SAngeloGioacchino Del Regno 			return ret;
2866ed619b3SAngeloGioacchino Del Regno 		}
2876ed619b3SAngeloGioacchino Del Regno 	}
2886ed619b3SAngeloGioacchino Del Regno 
2896ed619b3SAngeloGioacchino Del Regno 	return 0;
2906ed619b3SAngeloGioacchino Del Regno }
2916ed619b3SAngeloGioacchino Del Regno 
2926ed619b3SAngeloGioacchino Del Regno static const struct snd_soc_ops mt8186_da7219_i2s_ops = {
2936ed619b3SAngeloGioacchino Del Regno 	.hw_params = mt8186_da7219_i2s_hw_params,
2946ed619b3SAngeloGioacchino Del Regno 	.hw_free = mt8186_da7219_i2s_hw_free,
2956ed619b3SAngeloGioacchino Del Regno };
2966ed619b3SAngeloGioacchino Del Regno 
mt8186_rt5682s_i2s_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params)2976ed619b3SAngeloGioacchino Del Regno static int mt8186_rt5682s_i2s_hw_params(struct snd_pcm_substream *substream,
2986ed619b3SAngeloGioacchino Del Regno 					struct snd_pcm_hw_params *params)
2996ed619b3SAngeloGioacchino Del Regno {
300*410a4514SKrzysztof Kozlowski 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
3016ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_card *card = rtd->card;
3026ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
3036ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
3046ed619b3SAngeloGioacchino Del Regno 	unsigned int rate = params_rate(params);
3056ed619b3SAngeloGioacchino Del Regno 	unsigned int mclk_fs_ratio = 128;
3066ed619b3SAngeloGioacchino Del Regno 	unsigned int mclk_fs = rate * mclk_fs_ratio;
3076ed619b3SAngeloGioacchino Del Regno 	int bitwidth;
3086ed619b3SAngeloGioacchino Del Regno 	int ret;
3096ed619b3SAngeloGioacchino Del Regno 
3106ed619b3SAngeloGioacchino Del Regno 	bitwidth = snd_pcm_format_width(params_format(params));
3116ed619b3SAngeloGioacchino Del Regno 	if (bitwidth < 0) {
3126ed619b3SAngeloGioacchino Del Regno 		dev_err(card->dev, "invalid bit width: %d\n", bitwidth);
3136ed619b3SAngeloGioacchino Del Regno 		return bitwidth;
3146ed619b3SAngeloGioacchino Del Regno 	}
3156ed619b3SAngeloGioacchino Del Regno 
3166ed619b3SAngeloGioacchino Del Regno 	ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);
3176ed619b3SAngeloGioacchino Del Regno 	if (ret) {
3186ed619b3SAngeloGioacchino Del Regno 		dev_err(card->dev, "failed to set tdm slot\n");
3196ed619b3SAngeloGioacchino Del Regno 		return ret;
3206ed619b3SAngeloGioacchino Del Regno 	}
3216ed619b3SAngeloGioacchino Del Regno 
3226ed619b3SAngeloGioacchino Del Regno 	ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1,
3236ed619b3SAngeloGioacchino Del Regno 				  RT5682_PLL1_S_BCLK1,
3246ed619b3SAngeloGioacchino Del Regno 				  params_rate(params) * 64,
3256ed619b3SAngeloGioacchino Del Regno 				  params_rate(params) * 512);
3266ed619b3SAngeloGioacchino Del Regno 	if (ret) {
3276ed619b3SAngeloGioacchino Del Regno 		dev_err(card->dev, "failed to set pll\n");
3286ed619b3SAngeloGioacchino Del Regno 		return ret;
3296ed619b3SAngeloGioacchino Del Regno 	}
3306ed619b3SAngeloGioacchino Del Regno 
3316ed619b3SAngeloGioacchino Del Regno 	ret = snd_soc_dai_set_sysclk(codec_dai,
3326ed619b3SAngeloGioacchino Del Regno 				     RT5682_SCLK_S_PLL1,
3336ed619b3SAngeloGioacchino Del Regno 				     params_rate(params) * 512,
3346ed619b3SAngeloGioacchino Del Regno 				     SND_SOC_CLOCK_IN);
3356ed619b3SAngeloGioacchino Del Regno 	if (ret) {
3366ed619b3SAngeloGioacchino Del Regno 		dev_err(card->dev, "failed to set sysclk\n");
3376ed619b3SAngeloGioacchino Del Regno 		return ret;
3386ed619b3SAngeloGioacchino Del Regno 	}
3396ed619b3SAngeloGioacchino Del Regno 
3406ed619b3SAngeloGioacchino Del Regno 	return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
3416ed619b3SAngeloGioacchino Del Regno }
3426ed619b3SAngeloGioacchino Del Regno 
3436ed619b3SAngeloGioacchino Del Regno static const struct snd_soc_ops mt8186_rt5682s_i2s_ops = {
3446ed619b3SAngeloGioacchino Del Regno 	.hw_params = mt8186_rt5682s_i2s_hw_params,
3456ed619b3SAngeloGioacchino Del Regno };
3466ed619b3SAngeloGioacchino Del Regno 
mt8186_mt6366_rt1019_rt5682s_hdmi_init(struct snd_soc_pcm_runtime * rtd)3476ed619b3SAngeloGioacchino Del Regno static int mt8186_mt6366_rt1019_rt5682s_hdmi_init(struct snd_soc_pcm_runtime *rtd)
3486ed619b3SAngeloGioacchino Del Regno {
3496ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_component *cmpnt_afe =
3506ed619b3SAngeloGioacchino Del Regno 		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
3516ed619b3SAngeloGioacchino Del Regno 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
3526ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_component *cmpnt_codec =
3536ed619b3SAngeloGioacchino Del Regno 		snd_soc_rtd_to_codec(rtd, 0)->component;
3546ed619b3SAngeloGioacchino Del Regno 	struct mtk_soc_card_data *soc_card_data =
3556ed619b3SAngeloGioacchino Del Regno 		snd_soc_card_get_drvdata(rtd->card);
3566ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8186_JACK_HDMI];
3576ed619b3SAngeloGioacchino Del Regno 	int ret;
3586ed619b3SAngeloGioacchino Del Regno 
3596ed619b3SAngeloGioacchino Del Regno 	ret = mt8186_dai_i2s_set_share(afe, "I2S2", "I2S3");
3606ed619b3SAngeloGioacchino Del Regno 	if (ret) {
3616ed619b3SAngeloGioacchino Del Regno 		dev_err(rtd->dev, "Failed to set up shared clocks\n");
3626ed619b3SAngeloGioacchino Del Regno 		return ret;
3636ed619b3SAngeloGioacchino Del Regno 	}
3646ed619b3SAngeloGioacchino Del Regno 
3656ed619b3SAngeloGioacchino Del Regno 	ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, jack);
3666ed619b3SAngeloGioacchino Del Regno 	if (ret) {
3676ed619b3SAngeloGioacchino Del Regno 		dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret);
3686ed619b3SAngeloGioacchino Del Regno 		return ret;
3696ed619b3SAngeloGioacchino Del Regno 	}
3706ed619b3SAngeloGioacchino Del Regno 
3716ed619b3SAngeloGioacchino Del Regno 	return snd_soc_component_set_jack(cmpnt_codec, jack, NULL);
3726ed619b3SAngeloGioacchino Del Regno }
3736ed619b3SAngeloGioacchino Del Regno 
mt8186_hw_params_fixup(struct snd_soc_pcm_runtime * rtd,struct snd_pcm_hw_params * params,snd_pcm_format_t fmt)3746ed619b3SAngeloGioacchino Del Regno static int mt8186_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
3756ed619b3SAngeloGioacchino Del Regno 				  struct snd_pcm_hw_params *params,
3766ed619b3SAngeloGioacchino Del Regno 				  snd_pcm_format_t fmt)
3776ed619b3SAngeloGioacchino Del Regno {
3786ed619b3SAngeloGioacchino Del Regno 	struct snd_interval *channels = hw_param_interval(params,
3796ed619b3SAngeloGioacchino Del Regno 		SNDRV_PCM_HW_PARAM_CHANNELS);
3806ed619b3SAngeloGioacchino Del Regno 
3816ed619b3SAngeloGioacchino Del Regno 	dev_dbg(rtd->dev, "%s(), fix format to %d\n", __func__, fmt);
3826ed619b3SAngeloGioacchino Del Regno 
3836ed619b3SAngeloGioacchino Del Regno 	/* fix BE i2s channel to 2 channel */
3846ed619b3SAngeloGioacchino Del Regno 	channels->min = 2;
3856ed619b3SAngeloGioacchino Del Regno 	channels->max = 2;
3866ed619b3SAngeloGioacchino Del Regno 
3876ed619b3SAngeloGioacchino Del Regno 	/* clean param mask first */
3886ed619b3SAngeloGioacchino Del Regno 	snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
3896ed619b3SAngeloGioacchino Del Regno 			     0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
3906ed619b3SAngeloGioacchino Del Regno 
3916ed619b3SAngeloGioacchino Del Regno 	params_set_format(params, fmt);
3926ed619b3SAngeloGioacchino Del Regno 
3936ed619b3SAngeloGioacchino Del Regno 	return 0;
3946ed619b3SAngeloGioacchino Del Regno }
3956ed619b3SAngeloGioacchino Del Regno 
mt8186_i2s_hw_params_24le_fixup(struct snd_soc_pcm_runtime * rtd,struct snd_pcm_hw_params * params)3966ed619b3SAngeloGioacchino Del Regno static int mt8186_i2s_hw_params_24le_fixup(struct snd_soc_pcm_runtime *rtd,
3976ed619b3SAngeloGioacchino Del Regno 					   struct snd_pcm_hw_params *params)
3986ed619b3SAngeloGioacchino Del Regno {
3996ed619b3SAngeloGioacchino Del Regno 	return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S24_LE);
4006ed619b3SAngeloGioacchino Del Regno }
4016ed619b3SAngeloGioacchino Del Regno 
mt8186_i2s_hw_params_32le_fixup(struct snd_soc_pcm_runtime * rtd,struct snd_pcm_hw_params * params)4026ed619b3SAngeloGioacchino Del Regno static int mt8186_i2s_hw_params_32le_fixup(struct snd_soc_pcm_runtime *rtd,
4036ed619b3SAngeloGioacchino Del Regno 					   struct snd_pcm_hw_params *params)
4046ed619b3SAngeloGioacchino Del Regno {
4056ed619b3SAngeloGioacchino Del Regno 	return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S32_LE);
4066ed619b3SAngeloGioacchino Del Regno }
4076ed619b3SAngeloGioacchino Del Regno 
4086ed619b3SAngeloGioacchino Del Regno /* 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)4096ed619b3SAngeloGioacchino Del Regno static int mt8186_sof_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,
4106ed619b3SAngeloGioacchino Del Regno 				     struct snd_pcm_hw_params *params)
4116ed619b3SAngeloGioacchino Del Regno {
4126ed619b3SAngeloGioacchino Del Regno 	struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
4136ed619b3SAngeloGioacchino Del Regno 	int ret;
4146ed619b3SAngeloGioacchino Del Regno 
4156ed619b3SAngeloGioacchino Del Regno 	ret = mtk_sof_dai_link_fixup(rtd, params);
4166ed619b3SAngeloGioacchino Del Regno 
4176ed619b3SAngeloGioacchino Del Regno 	if (!strcmp(rtd->dai_link->name, "I2S0") ||
4186ed619b3SAngeloGioacchino Del Regno 	    !strcmp(rtd->dai_link->name, "I2S1") ||
4196ed619b3SAngeloGioacchino Del Regno 	    !strcmp(rtd->dai_link->name, "I2S2")) {
4206ed619b3SAngeloGioacchino Del Regno 		if (soc_card_data->card_data->flags & DA7219_CODEC_PRESENT)
4216ed619b3SAngeloGioacchino Del Regno 			mt8186_i2s_hw_params_32le_fixup(rtd, params);
4226ed619b3SAngeloGioacchino Del Regno 		else
4236ed619b3SAngeloGioacchino Del Regno 			mt8186_i2s_hw_params_24le_fixup(rtd, params);
4246ed619b3SAngeloGioacchino Del Regno 	} else if (!strcmp(rtd->dai_link->name, "I2S3")) {
4256ed619b3SAngeloGioacchino Del Regno 		if (soc_card_data->card_data->flags & DA7219_CODEC_PRESENT)
4266ed619b3SAngeloGioacchino Del Regno 			mt8186_i2s_hw_params_24le_fixup(rtd, params);
4276ed619b3SAngeloGioacchino Del Regno 		else
4286ed619b3SAngeloGioacchino Del Regno 			mt8186_i2s_hw_params_32le_fixup(rtd, params);
4296ed619b3SAngeloGioacchino Del Regno 	}
4306ed619b3SAngeloGioacchino Del Regno 
4316ed619b3SAngeloGioacchino Del Regno 	return ret;
4326ed619b3SAngeloGioacchino Del Regno }
4336ed619b3SAngeloGioacchino Del Regno 
4346ed619b3SAngeloGioacchino Del Regno /* FE */
4356ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(playback1,
4366ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("DL1")),
4376ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4386ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4396ed619b3SAngeloGioacchino Del Regno 
4406ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(playback12,
4416ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("DL12")),
4426ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4436ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4446ed619b3SAngeloGioacchino Del Regno 
4456ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(playback2,
4466ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
4476ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4486ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4496ed619b3SAngeloGioacchino Del Regno 
4506ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(playback3,
4516ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
4526ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4536ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4546ed619b3SAngeloGioacchino Del Regno 
4556ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(playback4,
4566ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("DL4")),
4576ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4586ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4596ed619b3SAngeloGioacchino Del Regno 
4606ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(playback5,
4616ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("DL5")),
4626ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4636ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4646ed619b3SAngeloGioacchino Del Regno 
4656ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(playback6,
4666ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("DL6")),
4676ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4686ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4696ed619b3SAngeloGioacchino Del Regno 
4706ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(playback7,
4716ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("DL7")),
4726ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4736ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4746ed619b3SAngeloGioacchino Del Regno 
4756ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(playback8,
4766ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("DL8")),
4776ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4786ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4796ed619b3SAngeloGioacchino Del Regno 
4806ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(capture1,
4816ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
4826ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4836ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4846ed619b3SAngeloGioacchino Del Regno 
4856ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(capture2,
4866ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
4876ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4886ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4896ed619b3SAngeloGioacchino Del Regno 
4906ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(capture3,
4916ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
4926ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4936ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4946ed619b3SAngeloGioacchino Del Regno 
4956ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(capture4,
4966ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("UL4")),
4976ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
4986ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
4996ed619b3SAngeloGioacchino Del Regno 
5006ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(capture5,
5016ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("UL5")),
5026ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5036ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5046ed619b3SAngeloGioacchino Del Regno 
5056ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(capture6,
5066ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("UL6")),
5076ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5086ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5096ed619b3SAngeloGioacchino Del Regno 
5106ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(capture7,
5116ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("UL7")),
5126ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5136ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5146ed619b3SAngeloGioacchino Del Regno 
5156ed619b3SAngeloGioacchino Del Regno /* hostless */
5166ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(hostless_lpbk,
5176ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless LPBK DAI")),
5186ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5196ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5206ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(hostless_fm,
5216ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless FM DAI")),
5226ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5236ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5246ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(hostless_src1,
5256ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_SRC_1_DAI")),
5266ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5276ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5286ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(hostless_src_bargein,
5296ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_SRC_Bargein_DAI")),
5306ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5316ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5326ed619b3SAngeloGioacchino Del Regno 
5336ed619b3SAngeloGioacchino Del Regno /* BE */
5346ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(adda,
5356ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),
5366ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CODEC("mt6358-sound",
5376ed619b3SAngeloGioacchino Del Regno 						   "mt6358-snd-codec-aif1"),
5386ed619b3SAngeloGioacchino Del Regno 					COMP_CODEC("dmic-codec",
5396ed619b3SAngeloGioacchino Del Regno 						   "dmic-hifi")),
5406ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5416ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(i2s0,
5426ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S0")),
5436ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()),
5446ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5456ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(i2s1,
5466ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S1")),
5476ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()),
5486ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5496ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(i2s2,
5506ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S2")),
5516ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5526ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5536ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(i2s3,
5546ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S3")),
5556ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()),
5566ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5576ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(hw_gain1,
5586ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("HW Gain 1")),
5596ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5606ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5616ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(hw_gain2,
5626ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("HW Gain 2")),
5636ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5646ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5656ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(hw_src1,
5666ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("HW_SRC_1")),
5676ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5686ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5696ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(hw_src2,
5706ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("HW_SRC_2")),
5716ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5726ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5736ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(connsys_i2s,
5746ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("CONNSYS_I2S")),
5756ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5766ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5776ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(pcm1,
5786ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")),
5796ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CODEC("bt-sco", "bt-sco-pcm-wb")),
5806ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5816ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(tdm_in,
5826ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("TDM IN")),
5836ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5846ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5856ed619b3SAngeloGioacchino Del Regno 
5866ed619b3SAngeloGioacchino Del Regno /* hostless */
5876ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(hostless_ul1,
5886ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL1 DAI")),
5896ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5906ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5916ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(hostless_ul2,
5926ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL2 DAI")),
5936ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5946ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5956ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(hostless_ul3,
5966ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL3 DAI")),
5976ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
5986ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
5996ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(hostless_ul5,
6006ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL5 DAI")),
6016ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
6026ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
6036ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(hostless_ul6,
6046ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL6 DAI")),
6056ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
6066ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
6076ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(hostless_hw_gain_aaudio,
6086ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless HW Gain AAudio DAI")),
6096ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
6106ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
6116ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(hostless_src_aaudio,
6126ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("Hostless SRC AAudio DAI")),
6136ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
6146ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
6156ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(AFE_SOF_DL1,
6166ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL1")),
6176ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
6186ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
6196ed619b3SAngeloGioacchino Del Regno 
6206ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(AFE_SOF_DL2,
6216ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")),
6226ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
6236ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
6246ed619b3SAngeloGioacchino Del Regno 
6256ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(AFE_SOF_UL1,
6266ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL1")),
6276ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
6286ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
6296ed619b3SAngeloGioacchino Del Regno 
6306ed619b3SAngeloGioacchino Del Regno SND_SOC_DAILINK_DEFS(AFE_SOF_UL2,
6316ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL2")),
6326ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
6336ed619b3SAngeloGioacchino Del Regno 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
6346ed619b3SAngeloGioacchino Del Regno 
6356ed619b3SAngeloGioacchino Del Regno static const struct sof_conn_stream g_sof_conn_streams[] = {
6366ed619b3SAngeloGioacchino Del Regno 	{ "I2S1", "AFE_SOF_DL1", SOF_DMA_DL1, SNDRV_PCM_STREAM_PLAYBACK},
6376ed619b3SAngeloGioacchino Del Regno 	{ "I2S3", "AFE_SOF_DL2", SOF_DMA_DL2, SNDRV_PCM_STREAM_PLAYBACK},
6386ed619b3SAngeloGioacchino Del Regno 	{ "Primary Codec", "AFE_SOF_UL1", SOF_DMA_UL1, SNDRV_PCM_STREAM_CAPTURE},
6396ed619b3SAngeloGioacchino Del Regno 	{ "I2S0", "AFE_SOF_UL2", SOF_DMA_UL2, SNDRV_PCM_STREAM_CAPTURE},
6406ed619b3SAngeloGioacchino Del Regno };
6416ed619b3SAngeloGioacchino Del Regno 
6426ed619b3SAngeloGioacchino Del Regno static struct snd_soc_dai_link mt8186_mt6366_rt1019_rt5682s_dai_links[] = {
6436ed619b3SAngeloGioacchino Del Regno 	/* Front End DAI links */
6446ed619b3SAngeloGioacchino Del Regno 	{
6456ed619b3SAngeloGioacchino Del Regno 		.name = "Playback_1",
6466ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Playback_1",
6476ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
6486ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
6496ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
6506ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
6516ed619b3SAngeloGioacchino Del Regno 		.dpcm_merged_format = 1,
6526ed619b3SAngeloGioacchino Del Regno 		.dpcm_merged_chan = 1,
6536ed619b3SAngeloGioacchino Del Regno 		.dpcm_merged_rate = 1,
6546ed619b3SAngeloGioacchino Del Regno 		.ops = &mtk_soundcard_common_playback_ops,
6556ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(playback1),
6566ed619b3SAngeloGioacchino Del Regno 	},
6576ed619b3SAngeloGioacchino Del Regno 	{
6586ed619b3SAngeloGioacchino Del Regno 		.name = "Playback_12",
6596ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Playback_12",
6606ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
6616ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
6626ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
6636ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
6646ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(playback12),
6656ed619b3SAngeloGioacchino Del Regno 	},
6666ed619b3SAngeloGioacchino Del Regno 	{
6676ed619b3SAngeloGioacchino Del Regno 		.name = "Playback_2",
6686ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Playback_2",
6696ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
6706ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
6716ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
6726ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
6736ed619b3SAngeloGioacchino Del Regno 		.dpcm_merged_format = 1,
6746ed619b3SAngeloGioacchino Del Regno 		.dpcm_merged_chan = 1,
6756ed619b3SAngeloGioacchino Del Regno 		.dpcm_merged_rate = 1,
6766ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(playback2),
6776ed619b3SAngeloGioacchino Del Regno 	},
6786ed619b3SAngeloGioacchino Del Regno 	{
6796ed619b3SAngeloGioacchino Del Regno 		.name = "Playback_3",
6806ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Playback_3",
6816ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
6826ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
6836ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
6846ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
6856ed619b3SAngeloGioacchino Del Regno 		.dpcm_merged_format = 1,
6866ed619b3SAngeloGioacchino Del Regno 		.dpcm_merged_chan = 1,
6876ed619b3SAngeloGioacchino Del Regno 		.dpcm_merged_rate = 1,
6886ed619b3SAngeloGioacchino Del Regno 		.ops = &mtk_soundcard_common_playback_ops,
6896ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(playback3),
6906ed619b3SAngeloGioacchino Del Regno 	},
6916ed619b3SAngeloGioacchino Del Regno 	{
6926ed619b3SAngeloGioacchino Del Regno 		.name = "Playback_4",
6936ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Playback_4",
6946ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
6956ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
6966ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
6976ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
6986ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(playback4),
6996ed619b3SAngeloGioacchino Del Regno 	},
7006ed619b3SAngeloGioacchino Del Regno 	{
7016ed619b3SAngeloGioacchino Del Regno 		.name = "Playback_5",
7026ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Playback_5",
7036ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7046ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
7056ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
7066ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
7076ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(playback5),
7086ed619b3SAngeloGioacchino Del Regno 	},
7096ed619b3SAngeloGioacchino Del Regno 	{
7106ed619b3SAngeloGioacchino Del Regno 		.name = "Playback_6",
7116ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Playback_6",
7126ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7136ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
7146ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
7156ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
7166ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(playback6),
7176ed619b3SAngeloGioacchino Del Regno 	},
7186ed619b3SAngeloGioacchino Del Regno 	{
7196ed619b3SAngeloGioacchino Del Regno 		.name = "Playback_7",
7206ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Playback_7",
7216ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7226ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
7236ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
7246ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
7256ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(playback7),
7266ed619b3SAngeloGioacchino Del Regno 	},
7276ed619b3SAngeloGioacchino Del Regno 	{
7286ed619b3SAngeloGioacchino Del Regno 		.name = "Playback_8",
7296ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Playback_8",
7306ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7316ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
7326ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
7336ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
7346ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(playback8),
7356ed619b3SAngeloGioacchino Del Regno 	},
7366ed619b3SAngeloGioacchino Del Regno 	{
7376ed619b3SAngeloGioacchino Del Regno 		.name = "Capture_1",
7386ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Capture_1",
7396ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7406ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
7416ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
7426ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
7436ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(capture1),
7446ed619b3SAngeloGioacchino Del Regno 	},
7456ed619b3SAngeloGioacchino Del Regno 	{
7466ed619b3SAngeloGioacchino Del Regno 		.name = "Capture_2",
7476ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Capture_2",
7486ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7496ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
7506ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
7516ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
7526ed619b3SAngeloGioacchino Del Regno 		.dpcm_merged_format = 1,
7536ed619b3SAngeloGioacchino Del Regno 		.dpcm_merged_chan = 1,
7546ed619b3SAngeloGioacchino Del Regno 		.dpcm_merged_rate = 1,
7556ed619b3SAngeloGioacchino Del Regno 		.ops = &mtk_soundcard_common_capture_ops,
7566ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(capture2),
7576ed619b3SAngeloGioacchino Del Regno 	},
7586ed619b3SAngeloGioacchino Del Regno 	{
7596ed619b3SAngeloGioacchino Del Regno 		.name = "Capture_3",
7606ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Capture_3",
7616ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7626ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
7636ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
7646ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
7656ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(capture3),
7666ed619b3SAngeloGioacchino Del Regno 	},
7676ed619b3SAngeloGioacchino Del Regno 	{
7686ed619b3SAngeloGioacchino Del Regno 		.name = "Capture_4",
7696ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Capture_4",
7706ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7716ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
7726ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
7736ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
7746ed619b3SAngeloGioacchino Del Regno 		.dpcm_merged_format = 1,
7756ed619b3SAngeloGioacchino Del Regno 		.dpcm_merged_chan = 1,
7766ed619b3SAngeloGioacchino Del Regno 		.dpcm_merged_rate = 1,
7776ed619b3SAngeloGioacchino Del Regno 		.ops = &mtk_soundcard_common_capture_ops,
7786ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(capture4),
7796ed619b3SAngeloGioacchino Del Regno 	},
7806ed619b3SAngeloGioacchino Del Regno 	{
7816ed619b3SAngeloGioacchino Del Regno 		.name = "Capture_5",
7826ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Capture_5",
7836ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7846ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
7856ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
7866ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
7876ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(capture5),
7886ed619b3SAngeloGioacchino Del Regno 	},
7896ed619b3SAngeloGioacchino Del Regno 	{
7906ed619b3SAngeloGioacchino Del Regno 		.name = "Capture_6",
7916ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Capture_6",
7926ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
7936ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
7946ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
7956ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
7966ed619b3SAngeloGioacchino Del Regno 		.dpcm_merged_format = 1,
7976ed619b3SAngeloGioacchino Del Regno 		.dpcm_merged_chan = 1,
7986ed619b3SAngeloGioacchino Del Regno 		.dpcm_merged_rate = 1,
7996ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(capture6),
8006ed619b3SAngeloGioacchino Del Regno 	},
8016ed619b3SAngeloGioacchino Del Regno 	{
8026ed619b3SAngeloGioacchino Del Regno 		.name = "Capture_7",
8036ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Capture_7",
8046ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
8056ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
8066ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
8076ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
8086ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(capture7),
8096ed619b3SAngeloGioacchino Del Regno 	},
8106ed619b3SAngeloGioacchino Del Regno 	{
8116ed619b3SAngeloGioacchino Del Regno 		.name = "Hostless_LPBK",
8126ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Hostless_LPBK",
8136ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
8146ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
8156ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
8166ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
8176ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
8186ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
8196ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(hostless_lpbk),
8206ed619b3SAngeloGioacchino Del Regno 	},
8216ed619b3SAngeloGioacchino Del Regno 	{
8226ed619b3SAngeloGioacchino Del Regno 		.name = "Hostless_FM",
8236ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Hostless_FM",
8246ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
8256ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
8266ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
8276ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
8286ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
8296ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
8306ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(hostless_fm),
8316ed619b3SAngeloGioacchino Del Regno 	},
8326ed619b3SAngeloGioacchino Del Regno 	{
8336ed619b3SAngeloGioacchino Del Regno 		.name = "Hostless_SRC_1",
8346ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Hostless_SRC_1",
8356ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
8366ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
8376ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
8386ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
8396ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
8406ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
8416ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(hostless_src1),
8426ed619b3SAngeloGioacchino Del Regno 	},
8436ed619b3SAngeloGioacchino Del Regno 	{
8446ed619b3SAngeloGioacchino Del Regno 		.name = "Hostless_SRC_Bargein",
8456ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Hostless_SRC_Bargein",
8466ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
8476ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
8486ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
8496ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
8506ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
8516ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
8526ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(hostless_src_bargein),
8536ed619b3SAngeloGioacchino Del Regno 	},
8546ed619b3SAngeloGioacchino Del Regno 	{
8556ed619b3SAngeloGioacchino Del Regno 		.name = "Hostless_HW_Gain_AAudio",
8566ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Hostless_HW_Gain_AAudio",
8576ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
8586ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
8596ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
8606ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
8616ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
8626ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(hostless_hw_gain_aaudio),
8636ed619b3SAngeloGioacchino Del Regno 	},
8646ed619b3SAngeloGioacchino Del Regno 	{
8656ed619b3SAngeloGioacchino Del Regno 		.name = "Hostless_SRC_AAudio",
8666ed619b3SAngeloGioacchino Del Regno 		.stream_name = "Hostless_SRC_AAudio",
8676ed619b3SAngeloGioacchino Del Regno 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
8686ed619b3SAngeloGioacchino Del Regno 			    SND_SOC_DPCM_TRIGGER_PRE},
8696ed619b3SAngeloGioacchino Del Regno 		.dynamic = 1,
8706ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
8716ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
8726ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
8736ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(hostless_src_aaudio),
8746ed619b3SAngeloGioacchino Del Regno 	},
8756ed619b3SAngeloGioacchino Del Regno 	/* Back End DAI links */
8766ed619b3SAngeloGioacchino Del Regno 	{
8776ed619b3SAngeloGioacchino Del Regno 		.name = "Primary Codec",
8786ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
8796ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
8806ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
8816ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
8826ed619b3SAngeloGioacchino Del Regno 		.init = primary_codec_init,
8836ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(adda),
8846ed619b3SAngeloGioacchino Del Regno 	},
8856ed619b3SAngeloGioacchino Del Regno 	{
8866ed619b3SAngeloGioacchino Del Regno 		.name = "I2S3",
8876ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
8886ed619b3SAngeloGioacchino Del Regno 		.dai_fmt = SND_SOC_DAIFMT_I2S |
8896ed619b3SAngeloGioacchino Del Regno 			   SND_SOC_DAIFMT_IB_IF |
8906ed619b3SAngeloGioacchino Del Regno 			   SND_SOC_DAIFMT_CBM_CFM,
8916ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
8926ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
8936ed619b3SAngeloGioacchino Del Regno 		.init = mt8186_mt6366_rt1019_rt5682s_hdmi_init,
8946ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(i2s3),
8956ed619b3SAngeloGioacchino Del Regno 	},
8966ed619b3SAngeloGioacchino Del Regno 	{
8976ed619b3SAngeloGioacchino Del Regno 		.name = "I2S0",
8986ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
8996ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
9006ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
9016ed619b3SAngeloGioacchino Del Regno 		.ops = &mt8186_rt5682s_i2s_ops,
9026ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(i2s0),
9036ed619b3SAngeloGioacchino Del Regno 	},
9046ed619b3SAngeloGioacchino Del Regno 	{
9056ed619b3SAngeloGioacchino Del Regno 		.name = "I2S1",
9066ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
9076ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
9086ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
9096ed619b3SAngeloGioacchino Del Regno 		.init = mt8186_headset_codec_init,
9106ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(i2s1),
9116ed619b3SAngeloGioacchino Del Regno 	},
9126ed619b3SAngeloGioacchino Del Regno 	{
9136ed619b3SAngeloGioacchino Del Regno 		.name = "I2S2",
9146ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
9156ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
9166ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
9176ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(i2s2),
9186ed619b3SAngeloGioacchino Del Regno 	},
9196ed619b3SAngeloGioacchino Del Regno 	{
9206ed619b3SAngeloGioacchino Del Regno 		.name = "HW Gain 1",
9216ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
9226ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
9236ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
9246ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
9256ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(hw_gain1),
9266ed619b3SAngeloGioacchino Del Regno 	},
9276ed619b3SAngeloGioacchino Del Regno 	{
9286ed619b3SAngeloGioacchino Del Regno 		.name = "HW Gain 2",
9296ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
9306ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
9316ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
9326ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
9336ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(hw_gain2),
9346ed619b3SAngeloGioacchino Del Regno 	},
9356ed619b3SAngeloGioacchino Del Regno 	{
9366ed619b3SAngeloGioacchino Del Regno 		.name = "HW_SRC_1",
9376ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
9386ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
9396ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
9406ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
9416ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(hw_src1),
9426ed619b3SAngeloGioacchino Del Regno 	},
9436ed619b3SAngeloGioacchino Del Regno 	{
9446ed619b3SAngeloGioacchino Del Regno 		.name = "HW_SRC_2",
9456ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
9466ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
9476ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
9486ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
9496ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(hw_src2),
9506ed619b3SAngeloGioacchino Del Regno 	},
9516ed619b3SAngeloGioacchino Del Regno 	{
9526ed619b3SAngeloGioacchino Del Regno 		.name = "CONNSYS_I2S",
9536ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
9546ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
9556ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
9566ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(connsys_i2s),
9576ed619b3SAngeloGioacchino Del Regno 	},
9586ed619b3SAngeloGioacchino Del Regno 	{
9596ed619b3SAngeloGioacchino Del Regno 		.name = "PCM 1",
9606ed619b3SAngeloGioacchino Del Regno 		.dai_fmt = SND_SOC_DAIFMT_I2S |
9616ed619b3SAngeloGioacchino Del Regno 			   SND_SOC_DAIFMT_NB_IF,
9626ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
9636ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
9646ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
9656ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
9666ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(pcm1),
9676ed619b3SAngeloGioacchino Del Regno 	},
9686ed619b3SAngeloGioacchino Del Regno 	{
9696ed619b3SAngeloGioacchino Del Regno 		.name = "TDM IN",
9706ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
9716ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
9726ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
9736ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(tdm_in),
9746ed619b3SAngeloGioacchino Del Regno 	},
9756ed619b3SAngeloGioacchino Del Regno 	/* dummy BE for ul memif to record from dl memif */
9766ed619b3SAngeloGioacchino Del Regno 	{
9776ed619b3SAngeloGioacchino Del Regno 		.name = "Hostless_UL1",
9786ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
9796ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
9806ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
9816ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(hostless_ul1),
9826ed619b3SAngeloGioacchino Del Regno 	},
9836ed619b3SAngeloGioacchino Del Regno 	{
9846ed619b3SAngeloGioacchino Del Regno 		.name = "Hostless_UL2",
9856ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
9866ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
9876ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
9886ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(hostless_ul2),
9896ed619b3SAngeloGioacchino Del Regno 	},
9906ed619b3SAngeloGioacchino Del Regno 	{
9916ed619b3SAngeloGioacchino Del Regno 		.name = "Hostless_UL3",
9926ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
9936ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
9946ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
9956ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(hostless_ul3),
9966ed619b3SAngeloGioacchino Del Regno 	},
9976ed619b3SAngeloGioacchino Del Regno 	{
9986ed619b3SAngeloGioacchino Del Regno 		.name = "Hostless_UL5",
9996ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
10006ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
10016ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
10026ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(hostless_ul5),
10036ed619b3SAngeloGioacchino Del Regno 	},
10046ed619b3SAngeloGioacchino Del Regno 	{
10056ed619b3SAngeloGioacchino Del Regno 		.name = "Hostless_UL6",
10066ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
10076ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
10086ed619b3SAngeloGioacchino Del Regno 		.ignore_suspend = 1,
10096ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(hostless_ul6),
10106ed619b3SAngeloGioacchino Del Regno 	},
10116ed619b3SAngeloGioacchino Del Regno 	/* SOF BE */
10126ed619b3SAngeloGioacchino Del Regno 	{
10136ed619b3SAngeloGioacchino Del Regno 		.name = "AFE_SOF_DL1",
10146ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
10156ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
10166ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(AFE_SOF_DL1),
10176ed619b3SAngeloGioacchino Del Regno 	},
10186ed619b3SAngeloGioacchino Del Regno 	{
10196ed619b3SAngeloGioacchino Del Regno 		.name = "AFE_SOF_DL2",
10206ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
10216ed619b3SAngeloGioacchino Del Regno 		.dpcm_playback = 1,
10226ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(AFE_SOF_DL2),
10236ed619b3SAngeloGioacchino Del Regno 	},
10246ed619b3SAngeloGioacchino Del Regno 	{
10256ed619b3SAngeloGioacchino Del Regno 		.name = "AFE_SOF_UL1",
10266ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
10276ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
10286ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(AFE_SOF_UL1),
10296ed619b3SAngeloGioacchino Del Regno 	},
10306ed619b3SAngeloGioacchino Del Regno 	{
10316ed619b3SAngeloGioacchino Del Regno 		.name = "AFE_SOF_UL2",
10326ed619b3SAngeloGioacchino Del Regno 		.no_pcm = 1,
10336ed619b3SAngeloGioacchino Del Regno 		.dpcm_capture = 1,
10346ed619b3SAngeloGioacchino Del Regno 		SND_SOC_DAILINK_REG(AFE_SOF_UL2),
10356ed619b3SAngeloGioacchino Del Regno 	},
10366ed619b3SAngeloGioacchino Del Regno };
10376ed619b3SAngeloGioacchino Del Regno 
10386ed619b3SAngeloGioacchino Del Regno static const struct snd_soc_dapm_widget
10396ed619b3SAngeloGioacchino Del Regno mt8186_mt6366_da7219_max98357_widgets[] = {
10406ed619b3SAngeloGioacchino Del Regno 	SND_SOC_DAPM_SPK("Speakers", NULL),
10416ed619b3SAngeloGioacchino Del Regno 	SND_SOC_DAPM_HP("Headphones", NULL),
10426ed619b3SAngeloGioacchino Del Regno 	SND_SOC_DAPM_MIC("Headset Mic", NULL),
10436ed619b3SAngeloGioacchino Del Regno 	SND_SOC_DAPM_LINE("Line Out", NULL),
10446ed619b3SAngeloGioacchino Del Regno 	SND_SOC_DAPM_LINE("HDMI1", NULL),
10456ed619b3SAngeloGioacchino Del Regno 	SND_SOC_DAPM_MIXER(SOF_DMA_DL1, SND_SOC_NOPM, 0, 0, NULL, 0),
10466ed619b3SAngeloGioacchino Del Regno 	SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),
10476ed619b3SAngeloGioacchino Del Regno 	SND_SOC_DAPM_MIXER(SOF_DMA_UL1, SND_SOC_NOPM, 0, 0, NULL, 0),
10486ed619b3SAngeloGioacchino Del Regno 	SND_SOC_DAPM_MIXER(SOF_DMA_UL2, SND_SOC_NOPM, 0, 0, NULL, 0),
10496ed619b3SAngeloGioacchino Del Regno };
10506ed619b3SAngeloGioacchino Del Regno 
10516ed619b3SAngeloGioacchino Del Regno static const struct snd_soc_dapm_widget
10526ed619b3SAngeloGioacchino Del Regno mt8186_mt6366_rt1019_rt5682s_widgets[] = {
10536ed619b3SAngeloGioacchino Del Regno 	SND_SOC_DAPM_SPK("Speakers", NULL),
10546ed619b3SAngeloGioacchino Del Regno 	SND_SOC_DAPM_HP("Headphone", NULL),
10556ed619b3SAngeloGioacchino Del Regno 	SND_SOC_DAPM_MIC("Headset Mic", NULL),
10566ed619b3SAngeloGioacchino Del Regno 	SND_SOC_DAPM_OUTPUT("HDMI1"),
10576ed619b3SAngeloGioacchino Del Regno 	SND_SOC_DAPM_MIXER(SOF_DMA_DL1, SND_SOC_NOPM, 0, 0, NULL, 0),
10586ed619b3SAngeloGioacchino Del Regno 	SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),
10596ed619b3SAngeloGioacchino Del Regno 	SND_SOC_DAPM_MIXER(SOF_DMA_UL1, SND_SOC_NOPM, 0, 0, NULL, 0),
10606ed619b3SAngeloGioacchino Del Regno 	SND_SOC_DAPM_MIXER(SOF_DMA_UL2, SND_SOC_NOPM, 0, 0, NULL, 0),
10616ed619b3SAngeloGioacchino Del Regno };
10626ed619b3SAngeloGioacchino Del Regno 
10636ed619b3SAngeloGioacchino Del Regno static const struct snd_soc_dapm_route
10646ed619b3SAngeloGioacchino Del Regno mt8186_mt6366_rt1019_rt5682s_routes[] = {
10656ed619b3SAngeloGioacchino Del Regno 	/* SPK */
10666ed619b3SAngeloGioacchino Del Regno 	{ "Speakers", NULL, "Speaker" },
10676ed619b3SAngeloGioacchino Del Regno 	/* Headset */
10686ed619b3SAngeloGioacchino Del Regno 	{ "Headphone", NULL, "HPOL" },
10696ed619b3SAngeloGioacchino Del Regno 	{ "Headphone", NULL, "HPOR" },
10706ed619b3SAngeloGioacchino Del Regno 	{ "IN1P", NULL, "Headset Mic" },
10716ed619b3SAngeloGioacchino Del Regno 	/* HDMI */
10726ed619b3SAngeloGioacchino Del Regno 	{ "HDMI1", NULL, "TX" },
10736ed619b3SAngeloGioacchino Del Regno 	/* SOF Uplink */
10746ed619b3SAngeloGioacchino Del Regno 	{SOF_DMA_UL1, NULL, "UL1_CH1"},
10756ed619b3SAngeloGioacchino Del Regno 	{SOF_DMA_UL1, NULL, "UL1_CH2"},
10766ed619b3SAngeloGioacchino Del Regno 	{SOF_DMA_UL2, NULL, "UL2_CH1"},
10776ed619b3SAngeloGioacchino Del Regno 	{SOF_DMA_UL2, NULL, "UL2_CH2"},
10786ed619b3SAngeloGioacchino Del Regno 	/* SOF Downlink */
10796ed619b3SAngeloGioacchino Del Regno 	{"DSP_DL1_VIRT", NULL, SOF_DMA_DL1},
10806ed619b3SAngeloGioacchino Del Regno 	{"DSP_DL2_VIRT", NULL, SOF_DMA_DL2},
10816ed619b3SAngeloGioacchino Del Regno };
10826ed619b3SAngeloGioacchino Del Regno 
10836ed619b3SAngeloGioacchino Del Regno static const struct snd_soc_dapm_route mt8186_mt6366_rt5650_routes[] = {
10846ed619b3SAngeloGioacchino Del Regno 	/* SPK */
10856ed619b3SAngeloGioacchino Del Regno 	{"Speakers", NULL, "SPOL"},
10866ed619b3SAngeloGioacchino Del Regno 	{"Speakers", NULL, "SPOR"},
10876ed619b3SAngeloGioacchino Del Regno 	/* Headset */
10886ed619b3SAngeloGioacchino Del Regno 	{ "Headphone", NULL, "HPOL" },
10896ed619b3SAngeloGioacchino Del Regno 	{ "Headphone", NULL, "HPOR" },
10906ed619b3SAngeloGioacchino Del Regno 	{ "IN1P", NULL, "Headset Mic" },
10916ed619b3SAngeloGioacchino Del Regno 	{ "IN1N", NULL, "Headset Mic"},
10926ed619b3SAngeloGioacchino Del Regno 	/* HDMI */
10936ed619b3SAngeloGioacchino Del Regno 	{ "HDMI1", NULL, "TX" },
10946ed619b3SAngeloGioacchino Del Regno 	/* SOF Uplink */
10956ed619b3SAngeloGioacchino Del Regno 	{SOF_DMA_UL1, NULL, "UL1_CH1"},
10966ed619b3SAngeloGioacchino Del Regno 	{SOF_DMA_UL1, NULL, "UL1_CH2"},
10976ed619b3SAngeloGioacchino Del Regno 	{SOF_DMA_UL2, NULL, "UL2_CH1"},
10986ed619b3SAngeloGioacchino Del Regno 	{SOF_DMA_UL2, NULL, "UL2_CH2"},
10996ed619b3SAngeloGioacchino Del Regno 	/* SOF Downlink */
11006ed619b3SAngeloGioacchino Del Regno 	{"DSP_DL1_VIRT", NULL, SOF_DMA_DL1},
11016ed619b3SAngeloGioacchino Del Regno 	{"DSP_DL2_VIRT", NULL, SOF_DMA_DL2},
11026ed619b3SAngeloGioacchino Del Regno };
11036ed619b3SAngeloGioacchino Del Regno 
11046ed619b3SAngeloGioacchino Del Regno static const struct snd_kcontrol_new mt8186_mt6366_da7219_max98357_controls[] = {
11056ed619b3SAngeloGioacchino Del Regno 	SOC_DAPM_PIN_SWITCH("Speakers"),
11066ed619b3SAngeloGioacchino Del Regno 	SOC_DAPM_PIN_SWITCH("Headphones"),
11076ed619b3SAngeloGioacchino Del Regno 	SOC_DAPM_PIN_SWITCH("Headset Mic"),
11086ed619b3SAngeloGioacchino Del Regno 	SOC_DAPM_PIN_SWITCH("Line Out"),
11096ed619b3SAngeloGioacchino Del Regno 	SOC_DAPM_PIN_SWITCH("HDMI1"),
11106ed619b3SAngeloGioacchino Del Regno };
11116ed619b3SAngeloGioacchino Del Regno 
11126ed619b3SAngeloGioacchino Del Regno static const struct snd_kcontrol_new
11136ed619b3SAngeloGioacchino Del Regno mt8186_mt6366_rt1019_rt5682s_controls[] = {
11146ed619b3SAngeloGioacchino Del Regno 	SOC_DAPM_PIN_SWITCH("Speakers"),
11156ed619b3SAngeloGioacchino Del Regno 	SOC_DAPM_PIN_SWITCH("Headphone"),
11166ed619b3SAngeloGioacchino Del Regno 	SOC_DAPM_PIN_SWITCH("Headset Mic"),
11176ed619b3SAngeloGioacchino Del Regno 	SOC_DAPM_PIN_SWITCH("HDMI1"),
11186ed619b3SAngeloGioacchino Del Regno };
11196ed619b3SAngeloGioacchino Del Regno 
11206ed619b3SAngeloGioacchino Del Regno static struct snd_soc_card mt8186_mt6366_da7219_max98357_soc_card = {
11216ed619b3SAngeloGioacchino Del Regno 	.name = "mt8186_da7219_max98357",
11226ed619b3SAngeloGioacchino Del Regno 	.owner = THIS_MODULE,
11236ed619b3SAngeloGioacchino Del Regno 	.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,
11246ed619b3SAngeloGioacchino Del Regno 	.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),
11256ed619b3SAngeloGioacchino Del Regno 	.controls = mt8186_mt6366_da7219_max98357_controls,
11266ed619b3SAngeloGioacchino Del Regno 	.num_controls = ARRAY_SIZE(mt8186_mt6366_da7219_max98357_controls),
11276ed619b3SAngeloGioacchino Del Regno 	.dapm_widgets = mt8186_mt6366_da7219_max98357_widgets,
11286ed619b3SAngeloGioacchino Del Regno 	.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_da7219_max98357_widgets),
11296ed619b3SAngeloGioacchino Del Regno 	.dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,
11306ed619b3SAngeloGioacchino Del Regno 	.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),
11316ed619b3SAngeloGioacchino Del Regno 	.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,
11326ed619b3SAngeloGioacchino Del Regno 	.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),
11336ed619b3SAngeloGioacchino Del Regno };
11346ed619b3SAngeloGioacchino Del Regno 
11356ed619b3SAngeloGioacchino Del Regno static struct snd_soc_card mt8186_mt6366_rt1019_rt5682s_soc_card = {
11366ed619b3SAngeloGioacchino Del Regno 	.name = "mt8186_rt1019_rt5682s",
11376ed619b3SAngeloGioacchino Del Regno 	.owner = THIS_MODULE,
11386ed619b3SAngeloGioacchino Del Regno 	.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,
11396ed619b3SAngeloGioacchino Del Regno 	.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),
11406ed619b3SAngeloGioacchino Del Regno 	.controls = mt8186_mt6366_rt1019_rt5682s_controls,
11416ed619b3SAngeloGioacchino Del Regno 	.num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),
11426ed619b3SAngeloGioacchino Del Regno 	.dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,
11436ed619b3SAngeloGioacchino Del Regno 	.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),
11446ed619b3SAngeloGioacchino Del Regno 	.dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,
11456ed619b3SAngeloGioacchino Del Regno 	.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),
11466ed619b3SAngeloGioacchino Del Regno 	.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,
11476ed619b3SAngeloGioacchino Del Regno 	.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),
11486ed619b3SAngeloGioacchino Del Regno };
11496ed619b3SAngeloGioacchino Del Regno 
11506ed619b3SAngeloGioacchino Del Regno static struct snd_soc_card mt8186_mt6366_rt5682s_max98360_soc_card = {
11516ed619b3SAngeloGioacchino Del Regno 	.name = "mt8186_rt5682s_max98360",
11526ed619b3SAngeloGioacchino Del Regno 	.owner = THIS_MODULE,
11536ed619b3SAngeloGioacchino Del Regno 	.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,
11546ed619b3SAngeloGioacchino Del Regno 	.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),
11556ed619b3SAngeloGioacchino Del Regno 	.controls = mt8186_mt6366_rt1019_rt5682s_controls,
11566ed619b3SAngeloGioacchino Del Regno 	.num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),
11576ed619b3SAngeloGioacchino Del Regno 	.dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,
11586ed619b3SAngeloGioacchino Del Regno 	.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),
11596ed619b3SAngeloGioacchino Del Regno 	.dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,
11606ed619b3SAngeloGioacchino Del Regno 	.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),
11616ed619b3SAngeloGioacchino Del Regno 	.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,
11626ed619b3SAngeloGioacchino Del Regno 	.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),
11636ed619b3SAngeloGioacchino Del Regno };
11646ed619b3SAngeloGioacchino Del Regno 
11656ed619b3SAngeloGioacchino Del Regno static struct snd_soc_card mt8186_mt6366_rt5650_soc_card = {
11666ed619b3SAngeloGioacchino Del Regno 	.name = "mt8186_rt5650",
11676ed619b3SAngeloGioacchino Del Regno 	.owner = THIS_MODULE,
11686ed619b3SAngeloGioacchino Del Regno 	.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,
11696ed619b3SAngeloGioacchino Del Regno 	.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),
11706ed619b3SAngeloGioacchino Del Regno 	.controls = mt8186_mt6366_rt1019_rt5682s_controls,
11716ed619b3SAngeloGioacchino Del Regno 	.num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),
11726ed619b3SAngeloGioacchino Del Regno 	.dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,
11736ed619b3SAngeloGioacchino Del Regno 	.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),
11746ed619b3SAngeloGioacchino Del Regno 	.dapm_routes = mt8186_mt6366_rt5650_routes,
11756ed619b3SAngeloGioacchino Del Regno 	.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt5650_routes),
11766ed619b3SAngeloGioacchino Del Regno 	.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,
11776ed619b3SAngeloGioacchino Del Regno 	.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),
11786ed619b3SAngeloGioacchino Del Regno };
11796ed619b3SAngeloGioacchino Del Regno 
mt8186_mt6366_legacy_probe(struct mtk_soc_card_data * soc_card_data)11806ed619b3SAngeloGioacchino Del Regno static int mt8186_mt6366_legacy_probe(struct mtk_soc_card_data *soc_card_data)
11816ed619b3SAngeloGioacchino Del Regno {
11826ed619b3SAngeloGioacchino Del Regno 	struct mtk_platform_card_data *card_data = soc_card_data->card_data;
11836ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_card *card = card_data->card;
11846ed619b3SAngeloGioacchino Del Regno 	struct device *dev = card->dev;
11856ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_dai_link *dai_link;
11866ed619b3SAngeloGioacchino Del Regno 	struct device_node *headset_codec, *playback_codec;
11876ed619b3SAngeloGioacchino Del Regno 	int ret, i;
11886ed619b3SAngeloGioacchino Del Regno 
11896ed619b3SAngeloGioacchino Del Regno 	playback_codec = of_get_child_by_name(dev->of_node, "playback-codecs");
11906ed619b3SAngeloGioacchino Del Regno 	if (!playback_codec)
11916ed619b3SAngeloGioacchino Del Regno 		return dev_err_probe(dev, -EINVAL,
11926ed619b3SAngeloGioacchino Del Regno 				     "Property 'playback-codecs' missing or invalid\n");
11936ed619b3SAngeloGioacchino Del Regno 
11946ed619b3SAngeloGioacchino Del Regno 	headset_codec = of_get_child_by_name(dev->of_node, "headset-codec");
11956ed619b3SAngeloGioacchino Del Regno 	if (!headset_codec) {
11966ed619b3SAngeloGioacchino Del Regno 		of_node_put(playback_codec);
11976ed619b3SAngeloGioacchino Del Regno 		return dev_err_probe(dev, -EINVAL,
11986ed619b3SAngeloGioacchino Del Regno 				     "Property 'headset-codec' missing or invalid\n");
11996ed619b3SAngeloGioacchino Del Regno 	}
12006ed619b3SAngeloGioacchino Del Regno 
12016ed619b3SAngeloGioacchino Del Regno 	for_each_card_prelinks(card, i, dai_link) {
12026ed619b3SAngeloGioacchino Del Regno 		ret = mt8186_mt6366_card_set_be_link(card, dai_link, playback_codec, "I2S3");
12036ed619b3SAngeloGioacchino Del Regno 		if (ret) {
12046ed619b3SAngeloGioacchino Del Regno 			dev_err_probe(dev, ret, "%s set playback_codec fail\n",
12056ed619b3SAngeloGioacchino Del Regno 				      dai_link->name);
12066ed619b3SAngeloGioacchino Del Regno 			break;
12076ed619b3SAngeloGioacchino Del Regno 		}
12086ed619b3SAngeloGioacchino Del Regno 
12096ed619b3SAngeloGioacchino Del Regno 		ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S0");
12106ed619b3SAngeloGioacchino Del Regno 		if (ret) {
12116ed619b3SAngeloGioacchino Del Regno 			dev_err_probe(dev, ret, "%s set headset_codec fail\n",
12126ed619b3SAngeloGioacchino Del Regno 				      dai_link->name);
12136ed619b3SAngeloGioacchino Del Regno 			break;
12146ed619b3SAngeloGioacchino Del Regno 		}
12156ed619b3SAngeloGioacchino Del Regno 
12166ed619b3SAngeloGioacchino Del Regno 		ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S1");
12176ed619b3SAngeloGioacchino Del Regno 		if (ret) {
12186ed619b3SAngeloGioacchino Del Regno 			dev_err_probe(dev, ret, "%s set headset_codec fail\n",
12196ed619b3SAngeloGioacchino Del Regno 				      dai_link->name);
12206ed619b3SAngeloGioacchino Del Regno 			break;
12216ed619b3SAngeloGioacchino Del Regno 		}
12226ed619b3SAngeloGioacchino Del Regno 	}
12236ed619b3SAngeloGioacchino Del Regno 	of_node_put(headset_codec);
12246ed619b3SAngeloGioacchino Del Regno 	of_node_put(playback_codec);
12256ed619b3SAngeloGioacchino Del Regno 
12266ed619b3SAngeloGioacchino Del Regno 	return ret;
12276ed619b3SAngeloGioacchino Del Regno }
12286ed619b3SAngeloGioacchino Del Regno 
mt8186_mt6366_soc_card_probe(struct mtk_soc_card_data * soc_card_data,bool legacy)12296ed619b3SAngeloGioacchino Del Regno static int mt8186_mt6366_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy)
12306ed619b3SAngeloGioacchino Del Regno {
12316ed619b3SAngeloGioacchino Del Regno 	struct mtk_platform_card_data *card_data = soc_card_data->card_data;
12326ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_card *card = card_data->card;
12336ed619b3SAngeloGioacchino Del Regno 	struct snd_soc_dai_link *dai_link;
12346ed619b3SAngeloGioacchino Del Regno 	struct mt8186_mt6366_rt1019_rt5682s_priv *mach_priv;
12356ed619b3SAngeloGioacchino Del Regno 	int i, ret;
12366ed619b3SAngeloGioacchino Del Regno 
12376ed619b3SAngeloGioacchino Del Regno 	mach_priv = devm_kzalloc(card->dev, sizeof(*mach_priv), GFP_KERNEL);
12386ed619b3SAngeloGioacchino Del Regno 	if (!mach_priv)
12396ed619b3SAngeloGioacchino Del Regno 		return -ENOMEM;
12406ed619b3SAngeloGioacchino Del Regno 
12416ed619b3SAngeloGioacchino Del Regno 	soc_card_data->mach_priv = mach_priv;
12426ed619b3SAngeloGioacchino Del Regno 
12436ed619b3SAngeloGioacchino Del Regno 	mach_priv->dmic_sel = devm_gpiod_get_optional(card->dev,
12446ed619b3SAngeloGioacchino Del Regno 						      "dmic", GPIOD_OUT_LOW);
12456ed619b3SAngeloGioacchino Del Regno 	if (IS_ERR(mach_priv->dmic_sel))
12466ed619b3SAngeloGioacchino Del Regno 		return dev_err_probe(card->dev, PTR_ERR(mach_priv->dmic_sel),
12476ed619b3SAngeloGioacchino Del Regno 				     "DMIC gpio failed\n");
12486ed619b3SAngeloGioacchino Del Regno 
12496ed619b3SAngeloGioacchino Del Regno 	for_each_card_prelinks(card, i, dai_link) {
12506ed619b3SAngeloGioacchino Del Regno 		if (strcmp(dai_link->name, "I2S0") == 0 ||
12516ed619b3SAngeloGioacchino Del Regno 		    strcmp(dai_link->name, "I2S1") == 0 ||
12526ed619b3SAngeloGioacchino Del Regno 		    strcmp(dai_link->name, "I2S2") == 0) {
12536ed619b3SAngeloGioacchino Del Regno 			if (card_data->flags & DA7219_CODEC_PRESENT) {
12546ed619b3SAngeloGioacchino Del Regno 				dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_32le_fixup;
12556ed619b3SAngeloGioacchino Del Regno 				dai_link->ops = &mt8186_da7219_i2s_ops;
12566ed619b3SAngeloGioacchino Del Regno 			} else {
12576ed619b3SAngeloGioacchino Del Regno 				dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_24le_fixup;
12586ed619b3SAngeloGioacchino Del Regno 				dai_link->ops = &mt8186_rt5682s_i2s_ops;
12596ed619b3SAngeloGioacchino Del Regno 			}
12606ed619b3SAngeloGioacchino Del Regno 		} else if (strcmp(dai_link->name, "I2S3") == 0) {
12616ed619b3SAngeloGioacchino Del Regno 			if (card_data->flags & DA7219_CODEC_PRESENT)
12626ed619b3SAngeloGioacchino Del Regno 				dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_24le_fixup;
12636ed619b3SAngeloGioacchino Del Regno 			else
12646ed619b3SAngeloGioacchino Del Regno 				dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_32le_fixup;
12656ed619b3SAngeloGioacchino Del Regno 		}
12666ed619b3SAngeloGioacchino Del Regno 	}
12676ed619b3SAngeloGioacchino Del Regno 
12686ed619b3SAngeloGioacchino Del Regno 	if (legacy) {
12696ed619b3SAngeloGioacchino Del Regno 		ret = mt8186_mt6366_legacy_probe(soc_card_data);
12706ed619b3SAngeloGioacchino Del Regno 		if (ret)
12716ed619b3SAngeloGioacchino Del Regno 			return ret;
12726ed619b3SAngeloGioacchino Del Regno 	}
12736ed619b3SAngeloGioacchino Del Regno 
12746ed619b3SAngeloGioacchino Del Regno 	ret = mt8186_afe_gpio_init(card->dev);
12756ed619b3SAngeloGioacchino Del Regno 	if (ret)
12766ed619b3SAngeloGioacchino Del Regno 		return dev_err_probe(card->dev, ret, "init AFE gpio error\n");
12776ed619b3SAngeloGioacchino Del Regno 
12786ed619b3SAngeloGioacchino Del Regno 	return 0;
12796ed619b3SAngeloGioacchino Del Regno }
12806ed619b3SAngeloGioacchino Del Regno 
12816ed619b3SAngeloGioacchino Del Regno static const unsigned int mt8186_pcm_playback_channels[] = { 2 };
12826ed619b3SAngeloGioacchino Del Regno static const unsigned int mt8186_pcm_capture_channels[] = { 1, 2 };
12836ed619b3SAngeloGioacchino Del Regno static const unsigned int mt8186_pcm_rates[] = { 48000 };
12846ed619b3SAngeloGioacchino Del Regno 
12856ed619b3SAngeloGioacchino Del Regno static const struct snd_pcm_hw_constraint_list mt8186_rate_constraint = {
12866ed619b3SAngeloGioacchino Del Regno 	.list = mt8186_pcm_rates,
12876ed619b3SAngeloGioacchino Del Regno 	.count = ARRAY_SIZE(mt8186_pcm_rates)
12886ed619b3SAngeloGioacchino Del Regno };
12896ed619b3SAngeloGioacchino Del Regno 
12906ed619b3SAngeloGioacchino Del Regno static const struct mtk_pcm_constraints_data mt8186_pcm_constraints[MTK_CONSTRAINT_CAPTURE + 1] = {
12916ed619b3SAngeloGioacchino Del Regno 	[MTK_CONSTRAINT_PLAYBACK] = {
12926ed619b3SAngeloGioacchino Del Regno 		.channels = &(const struct snd_pcm_hw_constraint_list) {
12936ed619b3SAngeloGioacchino Del Regno 			.list = mt8186_pcm_playback_channels,
12946ed619b3SAngeloGioacchino Del Regno 			.count = ARRAY_SIZE(mt8186_pcm_playback_channels)
12956ed619b3SAngeloGioacchino Del Regno 		},
12966ed619b3SAngeloGioacchino Del Regno 		.rates = &mt8186_rate_constraint,
12976ed619b3SAngeloGioacchino Del Regno 	},
12986ed619b3SAngeloGioacchino Del Regno 	[MTK_CONSTRAINT_CAPTURE] = {
12996ed619b3SAngeloGioacchino Del Regno 		.channels = &(const struct snd_pcm_hw_constraint_list) {
13006ed619b3SAngeloGioacchino Del Regno 			.list = mt8186_pcm_capture_channels,
13016ed619b3SAngeloGioacchino Del Regno 			.count = ARRAY_SIZE(mt8186_pcm_capture_channels)
13026ed619b3SAngeloGioacchino Del Regno 		},
13036ed619b3SAngeloGioacchino Del Regno 		.rates = &mt8186_rate_constraint,
13046ed619b3SAngeloGioacchino Del Regno 	}
13056ed619b3SAngeloGioacchino Del Regno };
13066ed619b3SAngeloGioacchino Del Regno 
13076ed619b3SAngeloGioacchino Del Regno static const struct mtk_sof_priv mt8186_sof_priv = {
13086ed619b3SAngeloGioacchino Del Regno 	.conn_streams = g_sof_conn_streams,
13096ed619b3SAngeloGioacchino Del Regno 	.num_streams = ARRAY_SIZE(g_sof_conn_streams),
13106ed619b3SAngeloGioacchino Del Regno 	.sof_dai_link_fixup = mt8186_sof_dai_link_fixup
13116ed619b3SAngeloGioacchino Del Regno };
13126ed619b3SAngeloGioacchino Del Regno 
13136ed619b3SAngeloGioacchino Del Regno static const struct mtk_soundcard_pdata mt8186_mt6366_da7219_max98357_pdata = {
13146ed619b3SAngeloGioacchino Del Regno 	.card_data = &(struct mtk_platform_card_data) {
13156ed619b3SAngeloGioacchino Del Regno 		.card = &mt8186_mt6366_da7219_max98357_soc_card,
13166ed619b3SAngeloGioacchino Del Regno 		.num_jacks = MT8186_JACK_MAX,
13176ed619b3SAngeloGioacchino Del Regno 		.pcm_constraints = mt8186_pcm_constraints,
13186ed619b3SAngeloGioacchino Del Regno 		.num_pcm_constraints = ARRAY_SIZE(mt8186_pcm_constraints),
13196ed619b3SAngeloGioacchino Del Regno 		.flags = DA7219_CODEC_PRESENT,
13206ed619b3SAngeloGioacchino Del Regno 	},
13216ed619b3SAngeloGioacchino Del Regno 	.sof_priv = &mt8186_sof_priv,
13226ed619b3SAngeloGioacchino Del Regno 	.soc_probe = mt8186_mt6366_soc_card_probe
13236ed619b3SAngeloGioacchino Del Regno };
13246ed619b3SAngeloGioacchino Del Regno 
13256ed619b3SAngeloGioacchino Del Regno static const struct mtk_soundcard_pdata mt8186_mt6366_rt1019_rt5682s_pdata = {
13266ed619b3SAngeloGioacchino Del Regno 	.card_data = &(struct mtk_platform_card_data) {
13276ed619b3SAngeloGioacchino Del Regno 		.card = &mt8186_mt6366_rt1019_rt5682s_soc_card,
13286ed619b3SAngeloGioacchino Del Regno 		.num_jacks = MT8186_JACK_MAX,
13296ed619b3SAngeloGioacchino Del Regno 		.pcm_constraints = mt8186_pcm_constraints,
13306ed619b3SAngeloGioacchino Del Regno 		.num_pcm_constraints = ARRAY_SIZE(mt8186_pcm_constraints),
13316ed619b3SAngeloGioacchino Del Regno 	},
13326ed619b3SAngeloGioacchino Del Regno 	.sof_priv = &mt8186_sof_priv,
13336ed619b3SAngeloGioacchino Del Regno 	.soc_probe = mt8186_mt6366_soc_card_probe
13346ed619b3SAngeloGioacchino Del Regno };
13356ed619b3SAngeloGioacchino Del Regno 
13366ed619b3SAngeloGioacchino Del Regno static const struct mtk_soundcard_pdata mt8186_mt6366_rt5682s_max98360_pdata = {
13376ed619b3SAngeloGioacchino Del Regno 	.card_data = &(struct mtk_platform_card_data) {
13386ed619b3SAngeloGioacchino Del Regno 		.card = &mt8186_mt6366_rt5682s_max98360_soc_card,
13396ed619b3SAngeloGioacchino Del Regno 		.num_jacks = MT8186_JACK_MAX,
13406ed619b3SAngeloGioacchino Del Regno 		.pcm_constraints = mt8186_pcm_constraints,
13416ed619b3SAngeloGioacchino Del Regno 		.num_pcm_constraints = ARRAY_SIZE(mt8186_pcm_constraints),
13426ed619b3SAngeloGioacchino Del Regno 	},
13436ed619b3SAngeloGioacchino Del Regno 	.sof_priv = &mt8186_sof_priv,
13446ed619b3SAngeloGioacchino Del Regno 	.soc_probe = mt8186_mt6366_soc_card_probe
13456ed619b3SAngeloGioacchino Del Regno };
13466ed619b3SAngeloGioacchino Del Regno 
13476ed619b3SAngeloGioacchino Del Regno static const struct mtk_soundcard_pdata mt8186_mt6366_rt5650_pdata = {
13486ed619b3SAngeloGioacchino Del Regno 	.card_data = &(struct mtk_platform_card_data) {
13496ed619b3SAngeloGioacchino Del Regno 		.card = &mt8186_mt6366_rt5650_soc_card,
13506ed619b3SAngeloGioacchino Del Regno 		.num_jacks = MT8186_JACK_MAX,
13516ed619b3SAngeloGioacchino Del Regno 		.pcm_constraints = mt8186_pcm_constraints,
13526ed619b3SAngeloGioacchino Del Regno 		.num_pcm_constraints = ARRAY_SIZE(mt8186_pcm_constraints),
13536ed619b3SAngeloGioacchino Del Regno 	},
13546ed619b3SAngeloGioacchino Del Regno 	.sof_priv = &mt8186_sof_priv,
13556ed619b3SAngeloGioacchino Del Regno 	.soc_probe = mt8186_mt6366_soc_card_probe
13566ed619b3SAngeloGioacchino Del Regno };
13576ed619b3SAngeloGioacchino Del Regno 
13586ed619b3SAngeloGioacchino Del Regno #if IS_ENABLED(CONFIG_OF)
13596ed619b3SAngeloGioacchino Del Regno static const struct of_device_id mt8186_mt6366_dt_match[] = {
13606ed619b3SAngeloGioacchino Del Regno 	{
13616ed619b3SAngeloGioacchino Del Regno 		.compatible = "mediatek,mt8186-mt6366-rt1019-rt5682s-sound",
13626ed619b3SAngeloGioacchino Del Regno 		.data = &mt8186_mt6366_rt1019_rt5682s_pdata,
13636ed619b3SAngeloGioacchino Del Regno 	},
13646ed619b3SAngeloGioacchino Del Regno 	{
13656ed619b3SAngeloGioacchino Del Regno 		.compatible = "mediatek,mt8186-mt6366-rt5682s-max98360-sound",
13666ed619b3SAngeloGioacchino Del Regno 		.data = &mt8186_mt6366_rt5682s_max98360_pdata,
13676ed619b3SAngeloGioacchino Del Regno 	},
13686ed619b3SAngeloGioacchino Del Regno 	{
13696ed619b3SAngeloGioacchino Del Regno 		.compatible = "mediatek,mt8186-mt6366-rt5650-sound",
13706ed619b3SAngeloGioacchino Del Regno 		.data = &mt8186_mt6366_rt5650_pdata,
13716ed619b3SAngeloGioacchino Del Regno 	},
13726ed619b3SAngeloGioacchino Del Regno 	{
13736ed619b3SAngeloGioacchino Del Regno 		.compatible = "mediatek,mt8186-mt6366-da7219-max98357-sound",
13746ed619b3SAngeloGioacchino Del Regno 		.data = &mt8186_mt6366_da7219_max98357_pdata,
13756ed619b3SAngeloGioacchino Del Regno 	},
13766ed619b3SAngeloGioacchino Del Regno 	{ /* sentinel */ }
13776ed619b3SAngeloGioacchino Del Regno };
13786ed619b3SAngeloGioacchino Del Regno MODULE_DEVICE_TABLE(of, mt8186_mt6366_dt_match);
13796ed619b3SAngeloGioacchino Del Regno #endif
13806ed619b3SAngeloGioacchino Del Regno 
13816ed619b3SAngeloGioacchino Del Regno static struct platform_driver mt8186_mt6366_driver = {
13826ed619b3SAngeloGioacchino Del Regno 	.driver = {
13836ed619b3SAngeloGioacchino Del Regno 		.name = "mt8186_mt6366",
13846ed619b3SAngeloGioacchino Del Regno #if IS_ENABLED(CONFIG_OF)
13856ed619b3SAngeloGioacchino Del Regno 		.of_match_table = mt8186_mt6366_dt_match,
13866ed619b3SAngeloGioacchino Del Regno #endif
13876ed619b3SAngeloGioacchino Del Regno 		.pm = &snd_soc_pm_ops,
13886ed619b3SAngeloGioacchino Del Regno 	},
13896ed619b3SAngeloGioacchino Del Regno 	.probe = mtk_soundcard_common_probe,
13906ed619b3SAngeloGioacchino Del Regno };
13916ed619b3SAngeloGioacchino Del Regno 
13926ed619b3SAngeloGioacchino Del Regno module_platform_driver(mt8186_mt6366_driver);
13936ed619b3SAngeloGioacchino Del Regno 
13946ed619b3SAngeloGioacchino Del Regno /* Module information */
13956ed619b3SAngeloGioacchino Del Regno MODULE_DESCRIPTION("MT8186-MT6366 ALSA SoC machine driver");
13966ed619b3SAngeloGioacchino Del Regno MODULE_AUTHOR("Jiaxin Yu <jiaxin.yu@mediatek.com>");
13976ed619b3SAngeloGioacchino Del Regno MODULE_LICENSE("GPL v2");
13986ed619b3SAngeloGioacchino Del Regno MODULE_ALIAS("mt8186_mt6366 soc card");
1399