xref: /openbmc/linux/sound/soc/mediatek/mt8192/mt8192-mt6359-rt1015-rt5682.c (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
118b13ff2SJiaxin Yu // SPDX-License-Identifier: GPL-2.0
218b13ff2SJiaxin Yu //
318b13ff2SJiaxin Yu // mt8192-mt6359-rt1015-rt5682.c  --
418b13ff2SJiaxin Yu //	MT8192-MT6359-RT1015-RT6358 ALSA SoC machine driver
518b13ff2SJiaxin Yu //
618b13ff2SJiaxin Yu // Copyright (c) 2020 MediaTek Inc.
718b13ff2SJiaxin Yu // Author: Jiaxin Yu <jiaxin.yu@mediatek.com>
818b13ff2SJiaxin Yu //
918b13ff2SJiaxin Yu 
1018b13ff2SJiaxin Yu #include <linux/input.h>
1118b13ff2SJiaxin Yu #include <linux/module.h>
122b53d2e1STzung-Bi Shih #include <linux/of_device.h>
1318b13ff2SJiaxin Yu #include <linux/pm_runtime.h>
1418b13ff2SJiaxin Yu #include <sound/jack.h>
1518b13ff2SJiaxin Yu #include <sound/pcm_params.h>
1618b13ff2SJiaxin Yu #include <sound/rt5682.h>
1718b13ff2SJiaxin Yu #include <sound/soc.h>
1818b13ff2SJiaxin Yu 
1918b13ff2SJiaxin Yu #include "../../codecs/mt6359.h"
2018b13ff2SJiaxin Yu #include "../../codecs/rt1015.h"
2118b13ff2SJiaxin Yu #include "../../codecs/rt5682.h"
2218b13ff2SJiaxin Yu #include "../common/mtk-afe-platform-driver.h"
2318b13ff2SJiaxin Yu #include "mt8192-afe-common.h"
2418b13ff2SJiaxin Yu #include "mt8192-afe-clk.h"
2518b13ff2SJiaxin Yu #include "mt8192-afe-gpio.h"
2618b13ff2SJiaxin Yu 
274674284aSNícolas F. R. A. Prado #define DRIVER_NAME "mt8192_mt6359"
284674284aSNícolas F. R. A. Prado 
2918b13ff2SJiaxin Yu #define RT1015_CODEC_DAI	"rt1015-aif"
3018b13ff2SJiaxin Yu #define RT1015_DEV0_NAME	"rt1015.1-0028"
3118b13ff2SJiaxin Yu #define RT1015_DEV1_NAME	"rt1015.1-0029"
3218b13ff2SJiaxin Yu 
336181ab31SJiaxin Yu #define RT1015_RT5682_CARD_NAME "mt8192_mt6359_rt1015_rt5682"
346181ab31SJiaxin Yu #define RT1015P_RT5682_CARD_NAME "mt8192_mt6359_rt1015p_rt5682"
356181ab31SJiaxin Yu #define RT1015P_RT5682S_CARD_NAME "mt8192_mt6359_rt1015p_rt5682s"
366181ab31SJiaxin Yu 
376181ab31SJiaxin Yu #define RT1015_RT5682_OF_NAME "mediatek,mt8192_mt6359_rt1015_rt5682"
386181ab31SJiaxin Yu #define RT1015P_RT5682_OF_NAME "mediatek,mt8192_mt6359_rt1015p_rt5682"
396181ab31SJiaxin Yu #define RT1015P_RT5682S_OF_NAME "mediatek,mt8192_mt6359_rt1015p_rt5682s"
406181ab31SJiaxin Yu 
414e37528aSTzung-Bi Shih struct mt8192_mt6359_priv {
424e37528aSTzung-Bi Shih 	struct snd_soc_jack headset_jack;
430d80c48cSTzung-Bi Shih 	struct snd_soc_jack hdmi_jack;
444e37528aSTzung-Bi Shih };
4518b13ff2SJiaxin Yu 
46194ff8dbSNícolas F. R. A. Prado /* Headset jack detection DAPM pins */
47194ff8dbSNícolas F. R. A. Prado static struct snd_soc_jack_pin mt8192_jack_pins[] = {
48194ff8dbSNícolas F. R. A. Prado 	{
49194ff8dbSNícolas F. R. A. Prado 		.pin = "Headphone Jack",
50194ff8dbSNícolas F. R. A. Prado 		.mask = SND_JACK_HEADPHONE,
51194ff8dbSNícolas F. R. A. Prado 	},
52194ff8dbSNícolas F. R. A. Prado 	{
53194ff8dbSNícolas F. R. A. Prado 		.pin = "Headset Mic",
54194ff8dbSNícolas F. R. A. Prado 		.mask = SND_JACK_MICROPHONE,
55194ff8dbSNícolas F. R. A. Prado 	},
56194ff8dbSNícolas F. R. A. Prado };
57194ff8dbSNícolas F. R. A. Prado 
mt8192_rt1015_i2s_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params)5818b13ff2SJiaxin Yu static int mt8192_rt1015_i2s_hw_params(struct snd_pcm_substream *substream,
5918b13ff2SJiaxin Yu 				       struct snd_pcm_hw_params *params)
6018b13ff2SJiaxin Yu {
618e59cf94STzung-Bi Shih 	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
6218b13ff2SJiaxin Yu 	struct snd_soc_card *card = rtd->card;
6318b13ff2SJiaxin Yu 	struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
6418b13ff2SJiaxin Yu 	struct snd_soc_dai *codec_dai;
6518b13ff2SJiaxin Yu 	unsigned int rate = params_rate(params);
6618b13ff2SJiaxin Yu 	unsigned int mclk_fs_ratio = 128;
6718b13ff2SJiaxin Yu 	unsigned int mclk_fs = rate * mclk_fs_ratio;
6818b13ff2SJiaxin Yu 	int ret, i;
6918b13ff2SJiaxin Yu 
7018b13ff2SJiaxin Yu 	for_each_rtd_codec_dais(rtd, i, codec_dai) {
7118b13ff2SJiaxin Yu 		ret = snd_soc_dai_set_pll(codec_dai, 0,
7218b13ff2SJiaxin Yu 					  RT1015_PLL_S_BCLK,
7318b13ff2SJiaxin Yu 					  params_rate(params) * 64,
7418b13ff2SJiaxin Yu 					  params_rate(params) * 256);
7518b13ff2SJiaxin Yu 		if (ret) {
7618b13ff2SJiaxin Yu 			dev_err(card->dev, "failed to set pll\n");
7718b13ff2SJiaxin Yu 			return ret;
7818b13ff2SJiaxin Yu 		}
7918b13ff2SJiaxin Yu 
8018b13ff2SJiaxin Yu 		ret = snd_soc_dai_set_sysclk(codec_dai,
8118b13ff2SJiaxin Yu 					     RT1015_SCLK_S_PLL,
8218b13ff2SJiaxin Yu 					     params_rate(params) * 256,
8318b13ff2SJiaxin Yu 					     SND_SOC_CLOCK_IN);
8418b13ff2SJiaxin Yu 		if (ret) {
8518b13ff2SJiaxin Yu 			dev_err(card->dev, "failed to set sysclk\n");
8618b13ff2SJiaxin Yu 			return ret;
8718b13ff2SJiaxin Yu 		}
8818b13ff2SJiaxin Yu 	}
8918b13ff2SJiaxin Yu 
9018b13ff2SJiaxin Yu 	return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
9118b13ff2SJiaxin Yu }
9218b13ff2SJiaxin Yu 
mt8192_rt5682x_i2s_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params)936181ab31SJiaxin Yu static int mt8192_rt5682x_i2s_hw_params(struct snd_pcm_substream *substream,
9418b13ff2SJiaxin Yu 					struct snd_pcm_hw_params *params)
9518b13ff2SJiaxin Yu {
968e59cf94STzung-Bi Shih 	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
9718b13ff2SJiaxin Yu 	struct snd_soc_card *card = rtd->card;
9818b13ff2SJiaxin Yu 	struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
9918b13ff2SJiaxin Yu 	struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
10018b13ff2SJiaxin Yu 	unsigned int rate = params_rate(params);
10118b13ff2SJiaxin Yu 	unsigned int mclk_fs_ratio = 128;
10218b13ff2SJiaxin Yu 	unsigned int mclk_fs = rate * mclk_fs_ratio;
10318b13ff2SJiaxin Yu 	int bitwidth;
10418b13ff2SJiaxin Yu 	int ret;
10518b13ff2SJiaxin Yu 
10618b13ff2SJiaxin Yu 	bitwidth = snd_pcm_format_width(params_format(params));
10718b13ff2SJiaxin Yu 	if (bitwidth < 0) {
10818b13ff2SJiaxin Yu 		dev_err(card->dev, "invalid bit width: %d\n", bitwidth);
10918b13ff2SJiaxin Yu 		return bitwidth;
11018b13ff2SJiaxin Yu 	}
11118b13ff2SJiaxin Yu 
11218b13ff2SJiaxin Yu 	ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);
11318b13ff2SJiaxin Yu 	if (ret) {
11418b13ff2SJiaxin Yu 		dev_err(card->dev, "failed to set tdm slot\n");
11518b13ff2SJiaxin Yu 		return ret;
11618b13ff2SJiaxin Yu 	}
11718b13ff2SJiaxin Yu 
11818b13ff2SJiaxin Yu 	ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1,
11918b13ff2SJiaxin Yu 				  RT5682_PLL1_S_BCLK1,
12018b13ff2SJiaxin Yu 				  params_rate(params) * 64,
12118b13ff2SJiaxin Yu 				  params_rate(params) * 512);
12218b13ff2SJiaxin Yu 	if (ret) {
12318b13ff2SJiaxin Yu 		dev_err(card->dev, "failed to set pll\n");
12418b13ff2SJiaxin Yu 		return ret;
12518b13ff2SJiaxin Yu 	}
12618b13ff2SJiaxin Yu 
12718b13ff2SJiaxin Yu 	ret = snd_soc_dai_set_sysclk(codec_dai,
12818b13ff2SJiaxin Yu 				     RT5682_SCLK_S_PLL1,
12918b13ff2SJiaxin Yu 				     params_rate(params) * 512,
13018b13ff2SJiaxin Yu 				     SND_SOC_CLOCK_IN);
13118b13ff2SJiaxin Yu 	if (ret) {
13218b13ff2SJiaxin Yu 		dev_err(card->dev, "failed to set sysclk\n");
13318b13ff2SJiaxin Yu 		return ret;
13418b13ff2SJiaxin Yu 	}
13518b13ff2SJiaxin Yu 
13618b13ff2SJiaxin Yu 	return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
13718b13ff2SJiaxin Yu }
13818b13ff2SJiaxin Yu 
13918b13ff2SJiaxin Yu static const struct snd_soc_ops mt8192_rt1015_i2s_ops = {
14018b13ff2SJiaxin Yu 	.hw_params = mt8192_rt1015_i2s_hw_params,
14118b13ff2SJiaxin Yu };
14218b13ff2SJiaxin Yu 
1436181ab31SJiaxin Yu static const struct snd_soc_ops mt8192_rt5682x_i2s_ops = {
1446181ab31SJiaxin Yu 	.hw_params = mt8192_rt5682x_i2s_hw_params,
14518b13ff2SJiaxin Yu };
14618b13ff2SJiaxin Yu 
mt8192_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime * rtd)14718b13ff2SJiaxin Yu static int mt8192_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd)
14818b13ff2SJiaxin Yu {
14918b13ff2SJiaxin Yu 	struct snd_soc_component *cmpnt_afe =
15018b13ff2SJiaxin Yu 		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
15118b13ff2SJiaxin Yu 	struct snd_soc_component *cmpnt_codec =
15218b13ff2SJiaxin Yu 		asoc_rtd_to_codec(rtd, 0)->component;
15318b13ff2SJiaxin Yu 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
15418b13ff2SJiaxin Yu 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
15518b13ff2SJiaxin Yu 	int phase;
15618b13ff2SJiaxin Yu 	unsigned int monitor;
15718b13ff2SJiaxin Yu 	int test_done_1, test_done_2, test_done_3;
15818b13ff2SJiaxin Yu 	int cycle_1, cycle_2, cycle_3;
15918b13ff2SJiaxin Yu 	int prev_cycle_1, prev_cycle_2, prev_cycle_3;
16018b13ff2SJiaxin Yu 	int chosen_phase_1, chosen_phase_2, chosen_phase_3;
16118b13ff2SJiaxin Yu 	int counter;
16218b13ff2SJiaxin Yu 	int mtkaif_calib_ok;
16318b13ff2SJiaxin Yu 
16418b13ff2SJiaxin Yu 	pm_runtime_get_sync(afe->dev);
16518b13ff2SJiaxin Yu 	mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 1);
16618b13ff2SJiaxin Yu 	mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 0);
16718b13ff2SJiaxin Yu 	mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34, 1);
16818b13ff2SJiaxin Yu 	mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34, 0);
16918b13ff2SJiaxin Yu 
17018b13ff2SJiaxin Yu 	mt6359_mtkaif_calibration_enable(cmpnt_codec);
17118b13ff2SJiaxin Yu 
17218b13ff2SJiaxin Yu 	/* set clock protocol 2 */
17318b13ff2SJiaxin Yu 	regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x38);
17418b13ff2SJiaxin Yu 	regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x39);
17518b13ff2SJiaxin Yu 
17618b13ff2SJiaxin Yu 	/* set test type to synchronizer pulse */
17718b13ff2SJiaxin Yu 	regmap_update_bits(afe_priv->topckgen,
17818b13ff2SJiaxin Yu 			   CKSYS_AUD_TOP_CFG, 0xffff, 0x4);
17918b13ff2SJiaxin Yu 
18018b13ff2SJiaxin Yu 	mtkaif_calib_ok = true;
18118b13ff2SJiaxin Yu 	afe_priv->mtkaif_calibration_num_phase = 42;	/* mt6359: 0 ~ 42 */
18218b13ff2SJiaxin Yu 	afe_priv->mtkaif_chosen_phase[0] = -1;
18318b13ff2SJiaxin Yu 	afe_priv->mtkaif_chosen_phase[1] = -1;
18418b13ff2SJiaxin Yu 	afe_priv->mtkaif_chosen_phase[2] = -1;
18518b13ff2SJiaxin Yu 
18618b13ff2SJiaxin Yu 	for (phase = 0;
18718b13ff2SJiaxin Yu 	     phase <= afe_priv->mtkaif_calibration_num_phase &&
18818b13ff2SJiaxin Yu 	     mtkaif_calib_ok;
18918b13ff2SJiaxin Yu 	     phase++) {
19018b13ff2SJiaxin Yu 		mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
19118b13ff2SJiaxin Yu 						    phase, phase, phase);
19218b13ff2SJiaxin Yu 
19318b13ff2SJiaxin Yu 		regmap_update_bits(afe_priv->topckgen,
19418b13ff2SJiaxin Yu 				   CKSYS_AUD_TOP_CFG, 0x1, 0x1);
19518b13ff2SJiaxin Yu 
19618b13ff2SJiaxin Yu 		test_done_1 = 0;
19718b13ff2SJiaxin Yu 		test_done_2 = 0;
19818b13ff2SJiaxin Yu 		test_done_3 = 0;
19918b13ff2SJiaxin Yu 		cycle_1 = -1;
20018b13ff2SJiaxin Yu 		cycle_2 = -1;
20118b13ff2SJiaxin Yu 		cycle_3 = -1;
20218b13ff2SJiaxin Yu 		counter = 0;
20318b13ff2SJiaxin Yu 		while (test_done_1 == 0 ||
20418b13ff2SJiaxin Yu 		       test_done_2 == 0 ||
20518b13ff2SJiaxin Yu 		       test_done_3 == 0) {
20618b13ff2SJiaxin Yu 			regmap_read(afe_priv->topckgen,
20718b13ff2SJiaxin Yu 				    CKSYS_AUD_TOP_MON, &monitor);
20818b13ff2SJiaxin Yu 
20918b13ff2SJiaxin Yu 			test_done_1 = (monitor >> 28) & 0x1;
21018b13ff2SJiaxin Yu 			test_done_2 = (monitor >> 29) & 0x1;
21118b13ff2SJiaxin Yu 			test_done_3 = (monitor >> 30) & 0x1;
21218b13ff2SJiaxin Yu 			if (test_done_1 == 1)
21318b13ff2SJiaxin Yu 				cycle_1 = monitor & 0xf;
21418b13ff2SJiaxin Yu 
21518b13ff2SJiaxin Yu 			if (test_done_2 == 1)
21618b13ff2SJiaxin Yu 				cycle_2 = (monitor >> 4) & 0xf;
21718b13ff2SJiaxin Yu 
21818b13ff2SJiaxin Yu 			if (test_done_3 == 1)
21918b13ff2SJiaxin Yu 				cycle_3 = (monitor >> 8) & 0xf;
22018b13ff2SJiaxin Yu 
22118b13ff2SJiaxin Yu 			/* handle if never test done */
22218b13ff2SJiaxin Yu 			if (++counter > 10000) {
22318b13ff2SJiaxin Yu 				dev_err(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, cycle_3 %d, monitor 0x%x\n",
22418b13ff2SJiaxin Yu 					__func__,
22518b13ff2SJiaxin Yu 					cycle_1, cycle_2, cycle_3, monitor);
22618b13ff2SJiaxin Yu 				mtkaif_calib_ok = false;
22718b13ff2SJiaxin Yu 				break;
22818b13ff2SJiaxin Yu 			}
22918b13ff2SJiaxin Yu 		}
23018b13ff2SJiaxin Yu 
23118b13ff2SJiaxin Yu 		if (phase == 0) {
23218b13ff2SJiaxin Yu 			prev_cycle_1 = cycle_1;
23318b13ff2SJiaxin Yu 			prev_cycle_2 = cycle_2;
23418b13ff2SJiaxin Yu 			prev_cycle_3 = cycle_3;
23518b13ff2SJiaxin Yu 		}
23618b13ff2SJiaxin Yu 
23718b13ff2SJiaxin Yu 		if (cycle_1 != prev_cycle_1 &&
23818b13ff2SJiaxin Yu 		    afe_priv->mtkaif_chosen_phase[0] < 0) {
23918b13ff2SJiaxin Yu 			afe_priv->mtkaif_chosen_phase[0] = phase - 1;
24018b13ff2SJiaxin Yu 			afe_priv->mtkaif_phase_cycle[0] = prev_cycle_1;
24118b13ff2SJiaxin Yu 		}
24218b13ff2SJiaxin Yu 
24318b13ff2SJiaxin Yu 		if (cycle_2 != prev_cycle_2 &&
24418b13ff2SJiaxin Yu 		    afe_priv->mtkaif_chosen_phase[1] < 0) {
24518b13ff2SJiaxin Yu 			afe_priv->mtkaif_chosen_phase[1] = phase - 1;
24618b13ff2SJiaxin Yu 			afe_priv->mtkaif_phase_cycle[1] = prev_cycle_2;
24718b13ff2SJiaxin Yu 		}
24818b13ff2SJiaxin Yu 
24918b13ff2SJiaxin Yu 		if (cycle_3 != prev_cycle_3 &&
25018b13ff2SJiaxin Yu 		    afe_priv->mtkaif_chosen_phase[2] < 0) {
25118b13ff2SJiaxin Yu 			afe_priv->mtkaif_chosen_phase[2] = phase - 1;
25218b13ff2SJiaxin Yu 			afe_priv->mtkaif_phase_cycle[2] = prev_cycle_3;
25318b13ff2SJiaxin Yu 		}
25418b13ff2SJiaxin Yu 
25518b13ff2SJiaxin Yu 		regmap_update_bits(afe_priv->topckgen,
25618b13ff2SJiaxin Yu 				   CKSYS_AUD_TOP_CFG, 0x1, 0x0);
25718b13ff2SJiaxin Yu 
25818b13ff2SJiaxin Yu 		if (afe_priv->mtkaif_chosen_phase[0] >= 0 &&
25918b13ff2SJiaxin Yu 		    afe_priv->mtkaif_chosen_phase[1] >= 0 &&
26018b13ff2SJiaxin Yu 		    afe_priv->mtkaif_chosen_phase[2] >= 0)
26118b13ff2SJiaxin Yu 			break;
26218b13ff2SJiaxin Yu 	}
26318b13ff2SJiaxin Yu 
26418b13ff2SJiaxin Yu 	if (afe_priv->mtkaif_chosen_phase[0] < 0)
26518b13ff2SJiaxin Yu 		chosen_phase_1 = 0;
26618b13ff2SJiaxin Yu 	else
26718b13ff2SJiaxin Yu 		chosen_phase_1 = afe_priv->mtkaif_chosen_phase[0];
26818b13ff2SJiaxin Yu 
26918b13ff2SJiaxin Yu 	if (afe_priv->mtkaif_chosen_phase[1] < 0)
27018b13ff2SJiaxin Yu 		chosen_phase_2 = 0;
27118b13ff2SJiaxin Yu 	else
27218b13ff2SJiaxin Yu 		chosen_phase_2 = afe_priv->mtkaif_chosen_phase[1];
27318b13ff2SJiaxin Yu 
27418b13ff2SJiaxin Yu 	if (afe_priv->mtkaif_chosen_phase[2] < 0)
27518b13ff2SJiaxin Yu 		chosen_phase_3 = 0;
27618b13ff2SJiaxin Yu 	else
27718b13ff2SJiaxin Yu 		chosen_phase_3 = afe_priv->mtkaif_chosen_phase[2];
27818b13ff2SJiaxin Yu 
27918b13ff2SJiaxin Yu 	mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
28018b13ff2SJiaxin Yu 					    chosen_phase_1,
28118b13ff2SJiaxin Yu 					    chosen_phase_2,
28218b13ff2SJiaxin Yu 					    chosen_phase_3);
28318b13ff2SJiaxin Yu 
28418b13ff2SJiaxin Yu 	/* disable rx fifo */
28518b13ff2SJiaxin Yu 	regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x38);
28618b13ff2SJiaxin Yu 
28718b13ff2SJiaxin Yu 	mt6359_mtkaif_calibration_disable(cmpnt_codec);
28818b13ff2SJiaxin Yu 
28918b13ff2SJiaxin Yu 	mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 1);
29018b13ff2SJiaxin Yu 	mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 0);
29118b13ff2SJiaxin Yu 	mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34, 1);
29218b13ff2SJiaxin Yu 	mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34, 0);
29318b13ff2SJiaxin Yu 	pm_runtime_put(afe->dev);
29418b13ff2SJiaxin Yu 
295*5f2a53c0SNícolas F. R. A. Prado 	dev_dbg(afe->dev, "%s(), mtkaif_chosen_phase[0/1/2]:%d/%d/%d\n",
29618b13ff2SJiaxin Yu 		__func__,
29718b13ff2SJiaxin Yu 		afe_priv->mtkaif_chosen_phase[0],
29818b13ff2SJiaxin Yu 		afe_priv->mtkaif_chosen_phase[1],
29918b13ff2SJiaxin Yu 		afe_priv->mtkaif_chosen_phase[2]);
30018b13ff2SJiaxin Yu 
30118b13ff2SJiaxin Yu 	return 0;
30218b13ff2SJiaxin Yu }
30318b13ff2SJiaxin Yu 
mt8192_mt6359_init(struct snd_soc_pcm_runtime * rtd)30418b13ff2SJiaxin Yu static int mt8192_mt6359_init(struct snd_soc_pcm_runtime *rtd)
30518b13ff2SJiaxin Yu {
30618b13ff2SJiaxin Yu 	struct snd_soc_component *cmpnt_afe =
30718b13ff2SJiaxin Yu 		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
30818b13ff2SJiaxin Yu 	struct snd_soc_component *cmpnt_codec =
30918b13ff2SJiaxin Yu 		asoc_rtd_to_codec(rtd, 0)->component;
31018b13ff2SJiaxin Yu 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
31118b13ff2SJiaxin Yu 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
31218b13ff2SJiaxin Yu 
31318b13ff2SJiaxin Yu 	/* set mtkaif protocol */
31418b13ff2SJiaxin Yu 	mt6359_set_mtkaif_protocol(cmpnt_codec,
31518b13ff2SJiaxin Yu 				   MT6359_MTKAIF_PROTOCOL_2_CLK_P2);
31618b13ff2SJiaxin Yu 	afe_priv->mtkaif_protocol = MTKAIF_PROTOCOL_2_CLK_P2;
31718b13ff2SJiaxin Yu 
31818b13ff2SJiaxin Yu 	/* mtkaif calibration */
31918b13ff2SJiaxin Yu 	mt8192_mt6359_mtkaif_calibration(rtd);
32018b13ff2SJiaxin Yu 
32118b13ff2SJiaxin Yu 	return 0;
32218b13ff2SJiaxin Yu }
32318b13ff2SJiaxin Yu 
mt8192_rt5682_init(struct snd_soc_pcm_runtime * rtd)32418b13ff2SJiaxin Yu static int mt8192_rt5682_init(struct snd_soc_pcm_runtime *rtd)
32518b13ff2SJiaxin Yu {
3263ffb9fa3SNícolas F. R. A. Prado 	struct snd_soc_component *cmpnt_afe =
3273ffb9fa3SNícolas F. R. A. Prado 		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
3283ffb9fa3SNícolas F. R. A. Prado 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
32918b13ff2SJiaxin Yu 	struct snd_soc_component *cmpnt_codec =
33018b13ff2SJiaxin Yu 		asoc_rtd_to_codec(rtd, 0)->component;
3314e37528aSTzung-Bi Shih 	struct mt8192_mt6359_priv *priv = snd_soc_card_get_drvdata(rtd->card);
3324e37528aSTzung-Bi Shih 	struct snd_soc_jack *jack = &priv->headset_jack;
33318b13ff2SJiaxin Yu 	int ret;
33418b13ff2SJiaxin Yu 
3353ffb9fa3SNícolas F. R. A. Prado 	ret = mt8192_dai_i2s_set_share(afe, "I2S8", "I2S9");
3363ffb9fa3SNícolas F. R. A. Prado 	if (ret) {
3373ffb9fa3SNícolas F. R. A. Prado 		dev_err(rtd->dev, "Failed to set up shared clocks\n");
3383ffb9fa3SNícolas F. R. A. Prado 		return ret;
3393ffb9fa3SNícolas F. R. A. Prado 	}
3403ffb9fa3SNícolas F. R. A. Prado 
341194ff8dbSNícolas F. R. A. Prado 	ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
34218b13ff2SJiaxin Yu 				    SND_JACK_HEADSET | SND_JACK_BTN_0 |
34318b13ff2SJiaxin Yu 				    SND_JACK_BTN_1 | SND_JACK_BTN_2 |
34418b13ff2SJiaxin Yu 				    SND_JACK_BTN_3,
345194ff8dbSNícolas F. R. A. Prado 				    jack, mt8192_jack_pins,
346194ff8dbSNícolas F. R. A. Prado 				    ARRAY_SIZE(mt8192_jack_pins));
34718b13ff2SJiaxin Yu 	if (ret) {
34818b13ff2SJiaxin Yu 		dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
34918b13ff2SJiaxin Yu 		return ret;
35018b13ff2SJiaxin Yu 	}
35118b13ff2SJiaxin Yu 
35218b13ff2SJiaxin Yu 	snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
35318b13ff2SJiaxin Yu 	snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
35418b13ff2SJiaxin Yu 	snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
35518b13ff2SJiaxin Yu 	snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
35618b13ff2SJiaxin Yu 
35712295ef9STzung-Bi Shih 	return snd_soc_component_set_jack(cmpnt_codec, jack, NULL);
35818b13ff2SJiaxin Yu };
35918b13ff2SJiaxin Yu 
mt8192_mt6359_hdmi_init(struct snd_soc_pcm_runtime * rtd)3600d80c48cSTzung-Bi Shih static int mt8192_mt6359_hdmi_init(struct snd_soc_pcm_runtime *rtd)
3610d80c48cSTzung-Bi Shih {
3620d80c48cSTzung-Bi Shih 	struct snd_soc_component *cmpnt_codec =
3630d80c48cSTzung-Bi Shih 		asoc_rtd_to_codec(rtd, 0)->component;
3640d80c48cSTzung-Bi Shih 	struct mt8192_mt6359_priv *priv = snd_soc_card_get_drvdata(rtd->card);
3650d80c48cSTzung-Bi Shih 	int ret;
3660d80c48cSTzung-Bi Shih 
3670d80c48cSTzung-Bi Shih 	ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT,
36819aed2d6SAkihiko Odaki 				    &priv->hdmi_jack);
3690d80c48cSTzung-Bi Shih 	if (ret) {
3700d80c48cSTzung-Bi Shih 		dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret);
3710d80c48cSTzung-Bi Shih 		return ret;
3720d80c48cSTzung-Bi Shih 	}
3730d80c48cSTzung-Bi Shih 
3740d80c48cSTzung-Bi Shih 	return snd_soc_component_set_jack(cmpnt_codec, &priv->hdmi_jack, NULL);
3750d80c48cSTzung-Bi Shih }
3760d80c48cSTzung-Bi Shih 
mt8192_i2s_hw_params_fixup(struct snd_soc_pcm_runtime * rtd,struct snd_pcm_hw_params * params)37718b13ff2SJiaxin Yu static int mt8192_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
37818b13ff2SJiaxin Yu 				      struct snd_pcm_hw_params *params)
37918b13ff2SJiaxin Yu {
38003c2192aSJiaxin Yu 	/* fix BE i2s format to S24_LE, clean param mask first */
38118b13ff2SJiaxin Yu 	snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
38203c2192aSJiaxin Yu 			     0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
38318b13ff2SJiaxin Yu 
38418b13ff2SJiaxin Yu 	params_set_format(params, SNDRV_PCM_FORMAT_S24_LE);
38518b13ff2SJiaxin Yu 
38618b13ff2SJiaxin Yu 	return 0;
38718b13ff2SJiaxin Yu }
38818b13ff2SJiaxin Yu 
38918b13ff2SJiaxin Yu static int
mt8192_mt6359_cap1_startup(struct snd_pcm_substream * substream)3904cceb42fSTzung-Bi Shih mt8192_mt6359_cap1_startup(struct snd_pcm_substream *substream)
39118b13ff2SJiaxin Yu {
39218b13ff2SJiaxin Yu 	static const unsigned int channels[] = {
39318b13ff2SJiaxin Yu 		1, 2, 4
39418b13ff2SJiaxin Yu 	};
39518b13ff2SJiaxin Yu 	static const struct snd_pcm_hw_constraint_list constraints_channels = {
39618b13ff2SJiaxin Yu 		.count = ARRAY_SIZE(channels),
39718b13ff2SJiaxin Yu 		.list = channels,
39818b13ff2SJiaxin Yu 		.mask = 0,
39918b13ff2SJiaxin Yu 	};
40018b13ff2SJiaxin Yu 	static const unsigned int rates[] = {
40118b13ff2SJiaxin Yu 		8000, 16000, 32000, 48000, 96000, 192000
40218b13ff2SJiaxin Yu 	};
40318b13ff2SJiaxin Yu 	static const struct snd_pcm_hw_constraint_list constraints_rates = {
40418b13ff2SJiaxin Yu 		.count = ARRAY_SIZE(rates),
40518b13ff2SJiaxin Yu 		.list  = rates,
40618b13ff2SJiaxin Yu 		.mask = 0,
40718b13ff2SJiaxin Yu 	};
40818b13ff2SJiaxin Yu 
4094cceb42fSTzung-Bi Shih 	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
41018b13ff2SJiaxin Yu 	struct snd_pcm_runtime *runtime = substream->runtime;
4114cceb42fSTzung-Bi Shih 	int ret;
41218b13ff2SJiaxin Yu 
41318b13ff2SJiaxin Yu 	ret = snd_pcm_hw_constraint_list(runtime, 0,
41418b13ff2SJiaxin Yu 					 SNDRV_PCM_HW_PARAM_CHANNELS,
41518b13ff2SJiaxin Yu 					 &constraints_channels);
41618b13ff2SJiaxin Yu 	if (ret < 0) {
4174cceb42fSTzung-Bi Shih 		dev_err(rtd->dev, "hw_constraint_list channels failed\n");
41818b13ff2SJiaxin Yu 		return ret;
41918b13ff2SJiaxin Yu 	}
42018b13ff2SJiaxin Yu 
42118b13ff2SJiaxin Yu 	ret = snd_pcm_hw_constraint_list(runtime, 0,
42218b13ff2SJiaxin Yu 					 SNDRV_PCM_HW_PARAM_RATE,
42318b13ff2SJiaxin Yu 					 &constraints_rates);
42418b13ff2SJiaxin Yu 	if (ret < 0) {
4254cceb42fSTzung-Bi Shih 		dev_err(rtd->dev, "hw_constraint_list rate failed\n");
42618b13ff2SJiaxin Yu 		return ret;
42718b13ff2SJiaxin Yu 	}
42818b13ff2SJiaxin Yu 
42918b13ff2SJiaxin Yu 	return 0;
43018b13ff2SJiaxin Yu }
43118b13ff2SJiaxin Yu 
4324cceb42fSTzung-Bi Shih static const struct snd_soc_ops mt8192_mt6359_capture1_ops = {
4334cceb42fSTzung-Bi Shih 	.startup = mt8192_mt6359_cap1_startup,
43418b13ff2SJiaxin Yu };
43518b13ff2SJiaxin Yu 
436339f6c73STzung-Bi Shih static int
mt8192_mt6359_rt5682_startup(struct snd_pcm_substream * substream)437339f6c73STzung-Bi Shih mt8192_mt6359_rt5682_startup(struct snd_pcm_substream *substream)
438339f6c73STzung-Bi Shih {
439339f6c73STzung-Bi Shih 	static const unsigned int channels[] = {
440339f6c73STzung-Bi Shih 		1, 2
441339f6c73STzung-Bi Shih 	};
442339f6c73STzung-Bi Shih 	static const struct snd_pcm_hw_constraint_list constraints_channels = {
443339f6c73STzung-Bi Shih 		.count = ARRAY_SIZE(channels),
444339f6c73STzung-Bi Shih 		.list = channels,
445339f6c73STzung-Bi Shih 		.mask = 0,
446339f6c73STzung-Bi Shih 	};
447339f6c73STzung-Bi Shih 	static const unsigned int rates[] = {
448339f6c73STzung-Bi Shih 		48000
449339f6c73STzung-Bi Shih 	};
450339f6c73STzung-Bi Shih 	static const struct snd_pcm_hw_constraint_list constraints_rates = {
451339f6c73STzung-Bi Shih 		.count = ARRAY_SIZE(rates),
452339f6c73STzung-Bi Shih 		.list  = rates,
453339f6c73STzung-Bi Shih 		.mask = 0,
454339f6c73STzung-Bi Shih 	};
455339f6c73STzung-Bi Shih 
456339f6c73STzung-Bi Shih 	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
457339f6c73STzung-Bi Shih 	struct snd_pcm_runtime *runtime = substream->runtime;
458339f6c73STzung-Bi Shih 	int ret;
459339f6c73STzung-Bi Shih 
460339f6c73STzung-Bi Shih 	ret = snd_pcm_hw_constraint_list(runtime, 0,
461339f6c73STzung-Bi Shih 					 SNDRV_PCM_HW_PARAM_CHANNELS,
462339f6c73STzung-Bi Shih 					 &constraints_channels);
463339f6c73STzung-Bi Shih 	if (ret < 0) {
464339f6c73STzung-Bi Shih 		dev_err(rtd->dev, "hw_constraint_list channels failed\n");
465339f6c73STzung-Bi Shih 		return ret;
466339f6c73STzung-Bi Shih 	}
467339f6c73STzung-Bi Shih 
468339f6c73STzung-Bi Shih 	ret = snd_pcm_hw_constraint_list(runtime, 0,
469339f6c73STzung-Bi Shih 					 SNDRV_PCM_HW_PARAM_RATE,
470339f6c73STzung-Bi Shih 					 &constraints_rates);
471339f6c73STzung-Bi Shih 	if (ret < 0) {
472339f6c73STzung-Bi Shih 		dev_err(rtd->dev, "hw_constraint_list rate failed\n");
473339f6c73STzung-Bi Shih 		return ret;
474339f6c73STzung-Bi Shih 	}
475339f6c73STzung-Bi Shih 
476339f6c73STzung-Bi Shih 	return 0;
477339f6c73STzung-Bi Shih }
478339f6c73STzung-Bi Shih 
479339f6c73STzung-Bi Shih static const struct snd_soc_ops mt8192_mt6359_rt5682_ops = {
480339f6c73STzung-Bi Shih 	.startup = mt8192_mt6359_rt5682_startup,
481339f6c73STzung-Bi Shih };
482339f6c73STzung-Bi Shih 
48318b13ff2SJiaxin Yu /* FE */
48418b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(playback1,
48518b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("DL1")),
48618b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
48718b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
48818b13ff2SJiaxin Yu 
48918b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(playback12,
49018b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("DL12")),
49118b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
49218b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
49318b13ff2SJiaxin Yu 
49418b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(playback2,
49518b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
49618b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
49718b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
49818b13ff2SJiaxin Yu 
49918b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(playback3,
50018b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
50118b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
50218b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
50318b13ff2SJiaxin Yu 
50418b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(playback4,
50518b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("DL4")),
50618b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
50718b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
50818b13ff2SJiaxin Yu 
50918b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(playback5,
51018b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("DL5")),
51118b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
51218b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
51318b13ff2SJiaxin Yu 
51418b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(playback6,
51518b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("DL6")),
51618b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
51718b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
51818b13ff2SJiaxin Yu 
51918b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(playback7,
52018b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("DL7")),
52118b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
52218b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
52318b13ff2SJiaxin Yu 
52418b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(playback8,
52518b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("DL8")),
52618b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
52718b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
52818b13ff2SJiaxin Yu 
52918b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(playback9,
53018b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("DL9")),
53118b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
53218b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
53318b13ff2SJiaxin Yu 
53418b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(capture1,
53518b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
53618b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
53718b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
53818b13ff2SJiaxin Yu 
53918b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(capture2,
54018b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
54118b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
54218b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
54318b13ff2SJiaxin Yu 
54418b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(capture3,
54518b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
54618b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
54718b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
54818b13ff2SJiaxin Yu 
54918b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(capture4,
55018b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("UL4")),
55118b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
55218b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
55318b13ff2SJiaxin Yu 
55418b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(capture5,
55518b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("UL5")),
55618b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
55718b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
55818b13ff2SJiaxin Yu 
55918b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(capture6,
56018b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("UL6")),
56118b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
56218b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
56318b13ff2SJiaxin Yu 
56418b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(capture7,
56518b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("UL7")),
56618b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
56718b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
56818b13ff2SJiaxin Yu 
56918b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(capture8,
57018b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("UL8")),
57118b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
57218b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
57318b13ff2SJiaxin Yu 
57418b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(capture_mono1,
57518b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_1")),
57618b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
57718b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
57818b13ff2SJiaxin Yu 
57918b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(capture_mono2,
58018b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_2")),
58118b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
58218b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
58318b13ff2SJiaxin Yu 
58418b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(capture_mono3,
58518b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_3")),
58618b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
58718b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
58818b13ff2SJiaxin Yu 
58918b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(playback_hdmi,
59018b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("HDMI")),
59118b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
59218b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
59318b13ff2SJiaxin Yu 
59418b13ff2SJiaxin Yu /* BE */
59518b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(primary_codec,
59618b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),
59718b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
5982aff94e4SJiaxin Yu 						   "mt6359-snd-codec-aif1"),
5992aff94e4SJiaxin Yu 					COMP_CODEC("dmic-codec",
6002aff94e4SJiaxin Yu 						   "dmic-hifi")),
60118b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
60218b13ff2SJiaxin Yu 
60318b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(primary_codec_ch34,
60418b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("ADDA_CH34")),
60518b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
60618b13ff2SJiaxin Yu 						   "mt6359-snd-codec-aif2")),
60718b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
60818b13ff2SJiaxin Yu 
60918b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(ap_dmic,
61018b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("AP_DMIC")),
61118b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
61218b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
61318b13ff2SJiaxin Yu 
61418b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(ap_dmic_ch34,
61518b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("AP_DMIC_CH34")),
61618b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
61718b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
61818b13ff2SJiaxin Yu 
61918b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(i2s0,
62018b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S0")),
62118b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
62218b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
62318b13ff2SJiaxin Yu 
62418b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(i2s1,
62518b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S1")),
62618b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
62718b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
62818b13ff2SJiaxin Yu 
62918b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(i2s2,
63018b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S2")),
63118b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
63218b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
63318b13ff2SJiaxin Yu 
634e1e408e6SJiaxin Yu SND_SOC_DAILINK_DEFS(i2s3,
63518b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S3")),
636e1e408e6SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()),
637cfd8bb25STzung-Bi Shih 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
638cfd8bb25STzung-Bi Shih 
63918b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(i2s5,
64018b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S5")),
64118b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
64218b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
64318b13ff2SJiaxin Yu 
64418b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(i2s6,
64518b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S6")),
64618b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
64718b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
64818b13ff2SJiaxin Yu 
64918b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(i2s7,
65018b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S7")),
65118b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
65218b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
65318b13ff2SJiaxin Yu 
65418b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(i2s8,
65518b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S8")),
656f8910fb4SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()),
65718b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
65818b13ff2SJiaxin Yu 
65918b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(i2s9,
66018b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S9")),
661f8910fb4SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()),
66218b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
66318b13ff2SJiaxin Yu 
66418b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(connsys_i2s,
66518b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("CONNSYS_I2S")),
66618b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
66718b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
66818b13ff2SJiaxin Yu 
66918b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(pcm1,
67018b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")),
67118b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
67218b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
67318b13ff2SJiaxin Yu 
67418b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(pcm2,
67518b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("PCM 2")),
67618b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
67718b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
67818b13ff2SJiaxin Yu 
67918b13ff2SJiaxin Yu SND_SOC_DAILINK_DEFS(tdm,
68018b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_CPU("TDM")),
6810d80c48cSTzung-Bi Shih 		     DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "i2s-hifi")),
68218b13ff2SJiaxin Yu 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
68318b13ff2SJiaxin Yu 
684a5f80375STzung-Bi Shih static struct snd_soc_dai_link mt8192_mt6359_dai_links[] = {
68518b13ff2SJiaxin Yu 	/* Front End DAI links */
68618b13ff2SJiaxin Yu 	{
68718b13ff2SJiaxin Yu 		.name = "Playback_1",
68818b13ff2SJiaxin Yu 		.stream_name = "Playback_1",
68918b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
69018b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
69118b13ff2SJiaxin Yu 		.dynamic = 1,
69218b13ff2SJiaxin Yu 		.dpcm_playback = 1,
69318b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(playback1),
69418b13ff2SJiaxin Yu 	},
69518b13ff2SJiaxin Yu 	{
69618b13ff2SJiaxin Yu 		.name = "Playback_12",
69718b13ff2SJiaxin Yu 		.stream_name = "Playback_12",
69818b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
69918b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
70018b13ff2SJiaxin Yu 		.dynamic = 1,
70118b13ff2SJiaxin Yu 		.dpcm_playback = 1,
70218b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(playback12),
70318b13ff2SJiaxin Yu 	},
70418b13ff2SJiaxin Yu 	{
70518b13ff2SJiaxin Yu 		.name = "Playback_2",
70618b13ff2SJiaxin Yu 		.stream_name = "Playback_2",
70718b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
70818b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
70918b13ff2SJiaxin Yu 		.dynamic = 1,
71018b13ff2SJiaxin Yu 		.dpcm_playback = 1,
71118b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(playback2),
71218b13ff2SJiaxin Yu 	},
71318b13ff2SJiaxin Yu 	{
71418b13ff2SJiaxin Yu 		.name = "Playback_3",
71518b13ff2SJiaxin Yu 		.stream_name = "Playback_3",
71618b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
71718b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
71818b13ff2SJiaxin Yu 		.dynamic = 1,
71918b13ff2SJiaxin Yu 		.dpcm_playback = 1,
720339f6c73STzung-Bi Shih 		.ops = &mt8192_mt6359_rt5682_ops,
72118b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(playback3),
72218b13ff2SJiaxin Yu 	},
72318b13ff2SJiaxin Yu 	{
72418b13ff2SJiaxin Yu 		.name = "Playback_4",
72518b13ff2SJiaxin Yu 		.stream_name = "Playback_4",
72618b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
72718b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
72818b13ff2SJiaxin Yu 		.dynamic = 1,
72918b13ff2SJiaxin Yu 		.dpcm_playback = 1,
73018b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(playback4),
73118b13ff2SJiaxin Yu 	},
73218b13ff2SJiaxin Yu 	{
73318b13ff2SJiaxin Yu 		.name = "Playback_5",
73418b13ff2SJiaxin Yu 		.stream_name = "Playback_5",
73518b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
73618b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
73718b13ff2SJiaxin Yu 		.dynamic = 1,
73818b13ff2SJiaxin Yu 		.dpcm_playback = 1,
73918b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(playback5),
74018b13ff2SJiaxin Yu 	},
74118b13ff2SJiaxin Yu 	{
74218b13ff2SJiaxin Yu 		.name = "Playback_6",
74318b13ff2SJiaxin Yu 		.stream_name = "Playback_6",
74418b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
74518b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
74618b13ff2SJiaxin Yu 		.dynamic = 1,
74718b13ff2SJiaxin Yu 		.dpcm_playback = 1,
74818b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(playback6),
74918b13ff2SJiaxin Yu 	},
75018b13ff2SJiaxin Yu 	{
75118b13ff2SJiaxin Yu 		.name = "Playback_7",
75218b13ff2SJiaxin Yu 		.stream_name = "Playback_7",
75318b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
75418b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
75518b13ff2SJiaxin Yu 		.dynamic = 1,
75618b13ff2SJiaxin Yu 		.dpcm_playback = 1,
75718b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(playback7),
75818b13ff2SJiaxin Yu 	},
75918b13ff2SJiaxin Yu 	{
76018b13ff2SJiaxin Yu 		.name = "Playback_8",
76118b13ff2SJiaxin Yu 		.stream_name = "Playback_8",
76218b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
76318b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
76418b13ff2SJiaxin Yu 		.dynamic = 1,
76518b13ff2SJiaxin Yu 		.dpcm_playback = 1,
76618b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(playback8),
76718b13ff2SJiaxin Yu 	},
76818b13ff2SJiaxin Yu 	{
76918b13ff2SJiaxin Yu 		.name = "Playback_9",
77018b13ff2SJiaxin Yu 		.stream_name = "Playback_9",
77118b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
77218b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
77318b13ff2SJiaxin Yu 		.dynamic = 1,
77418b13ff2SJiaxin Yu 		.dpcm_playback = 1,
77518b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(playback9),
77618b13ff2SJiaxin Yu 	},
77718b13ff2SJiaxin Yu 	{
77818b13ff2SJiaxin Yu 		.name = "Capture_1",
77918b13ff2SJiaxin Yu 		.stream_name = "Capture_1",
78018b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
78118b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
78218b13ff2SJiaxin Yu 		.dynamic = 1,
78318b13ff2SJiaxin Yu 		.dpcm_capture = 1,
7844cceb42fSTzung-Bi Shih 		.ops = &mt8192_mt6359_capture1_ops,
78518b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(capture1),
78618b13ff2SJiaxin Yu 	},
78718b13ff2SJiaxin Yu 	{
78818b13ff2SJiaxin Yu 		.name = "Capture_2",
78918b13ff2SJiaxin Yu 		.stream_name = "Capture_2",
79018b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
79118b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
79218b13ff2SJiaxin Yu 		.dynamic = 1,
79318b13ff2SJiaxin Yu 		.dpcm_capture = 1,
794339f6c73STzung-Bi Shih 		.ops = &mt8192_mt6359_rt5682_ops,
79518b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(capture2),
79618b13ff2SJiaxin Yu 	},
79718b13ff2SJiaxin Yu 	{
79818b13ff2SJiaxin Yu 		.name = "Capture_3",
79918b13ff2SJiaxin Yu 		.stream_name = "Capture_3",
80018b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
80118b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
80218b13ff2SJiaxin Yu 		.dynamic = 1,
80318b13ff2SJiaxin Yu 		.dpcm_capture = 1,
80418b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(capture3),
80518b13ff2SJiaxin Yu 	},
80618b13ff2SJiaxin Yu 	{
80718b13ff2SJiaxin Yu 		.name = "Capture_4",
80818b13ff2SJiaxin Yu 		.stream_name = "Capture_4",
80918b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
81018b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
81118b13ff2SJiaxin Yu 		.dynamic = 1,
81218b13ff2SJiaxin Yu 		.dpcm_capture = 1,
81318b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(capture4),
81418b13ff2SJiaxin Yu 	},
81518b13ff2SJiaxin Yu 	{
81618b13ff2SJiaxin Yu 		.name = "Capture_5",
81718b13ff2SJiaxin Yu 		.stream_name = "Capture_5",
81818b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
81918b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
82018b13ff2SJiaxin Yu 		.dynamic = 1,
82118b13ff2SJiaxin Yu 		.dpcm_capture = 1,
82218b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(capture5),
82318b13ff2SJiaxin Yu 	},
82418b13ff2SJiaxin Yu 	{
82518b13ff2SJiaxin Yu 		.name = "Capture_6",
82618b13ff2SJiaxin Yu 		.stream_name = "Capture_6",
82718b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
82818b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
82918b13ff2SJiaxin Yu 		.dynamic = 1,
83018b13ff2SJiaxin Yu 		.dpcm_capture = 1,
83118b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(capture6),
83218b13ff2SJiaxin Yu 	},
83318b13ff2SJiaxin Yu 	{
83418b13ff2SJiaxin Yu 		.name = "Capture_7",
83518b13ff2SJiaxin Yu 		.stream_name = "Capture_7",
83618b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
83718b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
83818b13ff2SJiaxin Yu 		.dynamic = 1,
83918b13ff2SJiaxin Yu 		.dpcm_capture = 1,
84018b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(capture7),
84118b13ff2SJiaxin Yu 	},
84218b13ff2SJiaxin Yu 	{
84318b13ff2SJiaxin Yu 		.name = "Capture_8",
84418b13ff2SJiaxin Yu 		.stream_name = "Capture_8",
84518b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
84618b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
84718b13ff2SJiaxin Yu 		.dynamic = 1,
84818b13ff2SJiaxin Yu 		.dpcm_capture = 1,
84918b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(capture8),
85018b13ff2SJiaxin Yu 	},
85118b13ff2SJiaxin Yu 	{
85218b13ff2SJiaxin Yu 		.name = "Capture_Mono_1",
85318b13ff2SJiaxin Yu 		.stream_name = "Capture_Mono_1",
85418b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
85518b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
85618b13ff2SJiaxin Yu 		.dynamic = 1,
85718b13ff2SJiaxin Yu 		.dpcm_capture = 1,
85818b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(capture_mono1),
85918b13ff2SJiaxin Yu 	},
86018b13ff2SJiaxin Yu 	{
86118b13ff2SJiaxin Yu 		.name = "Capture_Mono_2",
86218b13ff2SJiaxin Yu 		.stream_name = "Capture_Mono_2",
86318b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
86418b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
86518b13ff2SJiaxin Yu 		.dynamic = 1,
86618b13ff2SJiaxin Yu 		.dpcm_capture = 1,
86718b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(capture_mono2),
86818b13ff2SJiaxin Yu 	},
86918b13ff2SJiaxin Yu 	{
87018b13ff2SJiaxin Yu 		.name = "Capture_Mono_3",
87118b13ff2SJiaxin Yu 		.stream_name = "Capture_Mono_3",
87218b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
87318b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
87418b13ff2SJiaxin Yu 		.dynamic = 1,
87518b13ff2SJiaxin Yu 		.dpcm_capture = 1,
87618b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(capture_mono3),
87718b13ff2SJiaxin Yu 	},
87818b13ff2SJiaxin Yu 	{
87918b13ff2SJiaxin Yu 		.name = "playback_hdmi",
88018b13ff2SJiaxin Yu 		.stream_name = "Playback_HDMI",
88118b13ff2SJiaxin Yu 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
88218b13ff2SJiaxin Yu 			    SND_SOC_DPCM_TRIGGER_PRE},
88318b13ff2SJiaxin Yu 		.dynamic = 1,
88418b13ff2SJiaxin Yu 		.dpcm_playback = 1,
88518b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(playback_hdmi),
88618b13ff2SJiaxin Yu 	},
88718b13ff2SJiaxin Yu 	/* Back End DAI links */
88818b13ff2SJiaxin Yu 	{
88918b13ff2SJiaxin Yu 		.name = "Primary Codec",
89018b13ff2SJiaxin Yu 		.no_pcm = 1,
89118b13ff2SJiaxin Yu 		.dpcm_playback = 1,
89218b13ff2SJiaxin Yu 		.dpcm_capture = 1,
89318b13ff2SJiaxin Yu 		.ignore_suspend = 1,
89418b13ff2SJiaxin Yu 		.init = mt8192_mt6359_init,
89518b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(primary_codec),
89618b13ff2SJiaxin Yu 	},
89718b13ff2SJiaxin Yu 	{
89818b13ff2SJiaxin Yu 		.name = "Primary Codec CH34",
89918b13ff2SJiaxin Yu 		.no_pcm = 1,
90018b13ff2SJiaxin Yu 		.dpcm_playback = 1,
90118b13ff2SJiaxin Yu 		.dpcm_capture = 1,
90218b13ff2SJiaxin Yu 		.ignore_suspend = 1,
90318b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(primary_codec_ch34),
90418b13ff2SJiaxin Yu 	},
90518b13ff2SJiaxin Yu 	{
90618b13ff2SJiaxin Yu 		.name = "AP_DMIC",
90718b13ff2SJiaxin Yu 		.no_pcm = 1,
90818b13ff2SJiaxin Yu 		.dpcm_capture = 1,
90918b13ff2SJiaxin Yu 		.ignore_suspend = 1,
91018b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(ap_dmic),
91118b13ff2SJiaxin Yu 	},
91218b13ff2SJiaxin Yu 	{
91318b13ff2SJiaxin Yu 		.name = "AP_DMIC_CH34",
91418b13ff2SJiaxin Yu 		.no_pcm = 1,
91518b13ff2SJiaxin Yu 		.dpcm_capture = 1,
91618b13ff2SJiaxin Yu 		.ignore_suspend = 1,
91718b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(ap_dmic_ch34),
91818b13ff2SJiaxin Yu 	},
91918b13ff2SJiaxin Yu 	{
92018b13ff2SJiaxin Yu 		.name = "I2S0",
92118b13ff2SJiaxin Yu 		.no_pcm = 1,
92218b13ff2SJiaxin Yu 		.dpcm_capture = 1,
92318b13ff2SJiaxin Yu 		.ignore_suspend = 1,
92418b13ff2SJiaxin Yu 		.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
92518b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(i2s0),
92618b13ff2SJiaxin Yu 	},
92718b13ff2SJiaxin Yu 	{
92818b13ff2SJiaxin Yu 		.name = "I2S1",
92918b13ff2SJiaxin Yu 		.no_pcm = 1,
93018b13ff2SJiaxin Yu 		.dpcm_playback = 1,
93118b13ff2SJiaxin Yu 		.ignore_suspend = 1,
93218b13ff2SJiaxin Yu 		.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
93318b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(i2s1),
93418b13ff2SJiaxin Yu 	},
93518b13ff2SJiaxin Yu 	{
93618b13ff2SJiaxin Yu 		.name = "I2S2",
93718b13ff2SJiaxin Yu 		.no_pcm = 1,
93818b13ff2SJiaxin Yu 		.dpcm_capture = 1,
93918b13ff2SJiaxin Yu 		.ignore_suspend = 1,
94018b13ff2SJiaxin Yu 		.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
94118b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(i2s2),
94218b13ff2SJiaxin Yu 	},
94318b13ff2SJiaxin Yu 	{
94418b13ff2SJiaxin Yu 		.name = "I2S3",
94518b13ff2SJiaxin Yu 		.no_pcm = 1,
94618b13ff2SJiaxin Yu 		.dpcm_playback = 1,
94718b13ff2SJiaxin Yu 		.ignore_suspend = 1,
94818b13ff2SJiaxin Yu 		.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
949e1e408e6SJiaxin Yu 		SND_SOC_DAILINK_REG(i2s3),
95018b13ff2SJiaxin Yu 	},
95118b13ff2SJiaxin Yu 	{
95218b13ff2SJiaxin Yu 		.name = "I2S5",
95318b13ff2SJiaxin Yu 		.no_pcm = 1,
95418b13ff2SJiaxin Yu 		.dpcm_playback = 1,
95518b13ff2SJiaxin Yu 		.ignore_suspend = 1,
95618b13ff2SJiaxin Yu 		.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
95718b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(i2s5),
95818b13ff2SJiaxin Yu 	},
95918b13ff2SJiaxin Yu 	{
96018b13ff2SJiaxin Yu 		.name = "I2S6",
96118b13ff2SJiaxin Yu 		.no_pcm = 1,
96218b13ff2SJiaxin Yu 		.dpcm_capture = 1,
96318b13ff2SJiaxin Yu 		.ignore_suspend = 1,
96418b13ff2SJiaxin Yu 		.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
96518b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(i2s6),
96618b13ff2SJiaxin Yu 	},
96718b13ff2SJiaxin Yu 	{
96818b13ff2SJiaxin Yu 		.name = "I2S7",
96918b13ff2SJiaxin Yu 		.no_pcm = 1,
97018b13ff2SJiaxin Yu 		.dpcm_playback = 1,
97118b13ff2SJiaxin Yu 		.ignore_suspend = 1,
97218b13ff2SJiaxin Yu 		.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
97318b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(i2s7),
97418b13ff2SJiaxin Yu 	},
97518b13ff2SJiaxin Yu 	{
97618b13ff2SJiaxin Yu 		.name = "I2S8",
97718b13ff2SJiaxin Yu 		.no_pcm = 1,
97818b13ff2SJiaxin Yu 		.dpcm_capture = 1,
97918b13ff2SJiaxin Yu 		.ignore_suspend = 1,
98018b13ff2SJiaxin Yu 		.init = mt8192_rt5682_init,
98118b13ff2SJiaxin Yu 		.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
98218b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(i2s8),
9836181ab31SJiaxin Yu 		.ops = &mt8192_rt5682x_i2s_ops,
98418b13ff2SJiaxin Yu 	},
98518b13ff2SJiaxin Yu 	{
98618b13ff2SJiaxin Yu 		.name = "I2S9",
98718b13ff2SJiaxin Yu 		.no_pcm = 1,
98818b13ff2SJiaxin Yu 		.dpcm_playback = 1,
98918b13ff2SJiaxin Yu 		.ignore_suspend = 1,
99018b13ff2SJiaxin Yu 		.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
99118b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(i2s9),
9926181ab31SJiaxin Yu 		.ops = &mt8192_rt5682x_i2s_ops,
99318b13ff2SJiaxin Yu 	},
99418b13ff2SJiaxin Yu 	{
99518b13ff2SJiaxin Yu 		.name = "CONNSYS_I2S",
99618b13ff2SJiaxin Yu 		.no_pcm = 1,
99718b13ff2SJiaxin Yu 		.dpcm_capture = 1,
99818b13ff2SJiaxin Yu 		.ignore_suspend = 1,
99918b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(connsys_i2s),
100018b13ff2SJiaxin Yu 	},
100118b13ff2SJiaxin Yu 	{
100218b13ff2SJiaxin Yu 		.name = "PCM 1",
100318b13ff2SJiaxin Yu 		.no_pcm = 1,
100418b13ff2SJiaxin Yu 		.dpcm_playback = 1,
100518b13ff2SJiaxin Yu 		.dpcm_capture = 1,
100618b13ff2SJiaxin Yu 		.ignore_suspend = 1,
100718b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(pcm1),
100818b13ff2SJiaxin Yu 	},
100918b13ff2SJiaxin Yu 	{
101018b13ff2SJiaxin Yu 		.name = "PCM 2",
101118b13ff2SJiaxin Yu 		.no_pcm = 1,
101218b13ff2SJiaxin Yu 		.dpcm_playback = 1,
101318b13ff2SJiaxin Yu 		.dpcm_capture = 1,
101418b13ff2SJiaxin Yu 		.ignore_suspend = 1,
101518b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(pcm2),
101618b13ff2SJiaxin Yu 	},
101718b13ff2SJiaxin Yu 	{
101818b13ff2SJiaxin Yu 		.name = "TDM",
101918b13ff2SJiaxin Yu 		.no_pcm = 1,
10200d80c48cSTzung-Bi Shih 		.dai_fmt = SND_SOC_DAIFMT_DSP_A |
10210d80c48cSTzung-Bi Shih 			   SND_SOC_DAIFMT_IB_NF |
10220d80c48cSTzung-Bi Shih 			   SND_SOC_DAIFMT_CBM_CFM,
102318b13ff2SJiaxin Yu 		.dpcm_playback = 1,
102418b13ff2SJiaxin Yu 		.ignore_suspend = 1,
10250d80c48cSTzung-Bi Shih 		.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
10260d80c48cSTzung-Bi Shih 		.ignore = 1,
10270d80c48cSTzung-Bi Shih 		.init = mt8192_mt6359_hdmi_init,
102818b13ff2SJiaxin Yu 		SND_SOC_DAILINK_REG(tdm),
102918b13ff2SJiaxin Yu 	},
103018b13ff2SJiaxin Yu };
103118b13ff2SJiaxin Yu 
1032ba499c36STzung-Bi Shih static const struct snd_soc_dapm_widget
1033ba499c36STzung-Bi Shih mt8192_mt6359_rt1015_rt5682_widgets[] = {
1034ba499c36STzung-Bi Shih 	SND_SOC_DAPM_SPK("Left Spk", NULL),
1035ba499c36STzung-Bi Shih 	SND_SOC_DAPM_SPK("Right Spk", NULL),
1036ba499c36STzung-Bi Shih 	SND_SOC_DAPM_HP("Headphone Jack", NULL),
1037ba499c36STzung-Bi Shih 	SND_SOC_DAPM_MIC("Headset Mic", NULL),
10380d80c48cSTzung-Bi Shih 	SND_SOC_DAPM_OUTPUT("TDM Out"),
1039ba499c36STzung-Bi Shih };
1040ba499c36STzung-Bi Shih 
1041ba499c36STzung-Bi Shih static const struct snd_soc_dapm_route mt8192_mt6359_rt1015_rt5682_routes[] = {
1042ba499c36STzung-Bi Shih 	/* speaker */
1043ba499c36STzung-Bi Shih 	{ "Left Spk", NULL, "Left SPO" },
1044ba499c36STzung-Bi Shih 	{ "Right Spk", NULL, "Right SPO" },
1045ba499c36STzung-Bi Shih 	/* headset */
1046ba499c36STzung-Bi Shih 	{ "Headphone Jack", NULL, "HPOL" },
1047ba499c36STzung-Bi Shih 	{ "Headphone Jack", NULL, "HPOR" },
1048ba499c36STzung-Bi Shih 	{ "IN1P", NULL, "Headset Mic" },
10490d80c48cSTzung-Bi Shih 	/* TDM */
10500d80c48cSTzung-Bi Shih 	{ "TDM Out", NULL, "TDM" },
1051ba499c36STzung-Bi Shih };
1052ba499c36STzung-Bi Shih 
1053ba499c36STzung-Bi Shih static const struct snd_kcontrol_new mt8192_mt6359_rt1015_rt5682_controls[] = {
1054ba499c36STzung-Bi Shih 	SOC_DAPM_PIN_SWITCH("Left Spk"),
1055ba499c36STzung-Bi Shih 	SOC_DAPM_PIN_SWITCH("Right Spk"),
1056ba499c36STzung-Bi Shih 	SOC_DAPM_PIN_SWITCH("Headphone Jack"),
1057ba499c36STzung-Bi Shih 	SOC_DAPM_PIN_SWITCH("Headset Mic"),
1058ba499c36STzung-Bi Shih };
1059ba499c36STzung-Bi Shih 
106018b13ff2SJiaxin Yu static struct snd_soc_codec_conf rt1015_amp_conf[] = {
106118b13ff2SJiaxin Yu 	{
106218b13ff2SJiaxin Yu 		.dlc = COMP_CODEC_CONF(RT1015_DEV0_NAME),
106318b13ff2SJiaxin Yu 		.name_prefix = "Left",
106418b13ff2SJiaxin Yu 	},
106518b13ff2SJiaxin Yu 	{
106618b13ff2SJiaxin Yu 		.dlc = COMP_CODEC_CONF(RT1015_DEV1_NAME),
106718b13ff2SJiaxin Yu 		.name_prefix = "Right",
106818b13ff2SJiaxin Yu 	},
106918b13ff2SJiaxin Yu };
107018b13ff2SJiaxin Yu 
10712b53d2e1STzung-Bi Shih static struct snd_soc_card mt8192_mt6359_rt1015_rt5682_card = {
10726181ab31SJiaxin Yu 	.name = RT1015_RT5682_CARD_NAME,
10734674284aSNícolas F. R. A. Prado 	.driver_name = DRIVER_NAME,
107418b13ff2SJiaxin Yu 	.owner = THIS_MODULE,
1075a5f80375STzung-Bi Shih 	.dai_link = mt8192_mt6359_dai_links,
1076a5f80375STzung-Bi Shih 	.num_links = ARRAY_SIZE(mt8192_mt6359_dai_links),
107718b13ff2SJiaxin Yu 	.controls = mt8192_mt6359_rt1015_rt5682_controls,
107818b13ff2SJiaxin Yu 	.num_controls = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_controls),
107918b13ff2SJiaxin Yu 	.dapm_widgets = mt8192_mt6359_rt1015_rt5682_widgets,
108018b13ff2SJiaxin Yu 	.num_dapm_widgets = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_widgets),
108118b13ff2SJiaxin Yu 	.dapm_routes = mt8192_mt6359_rt1015_rt5682_routes,
108218b13ff2SJiaxin Yu 	.num_dapm_routes = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_routes),
108318b13ff2SJiaxin Yu 	.codec_conf = rt1015_amp_conf,
108418b13ff2SJiaxin Yu 	.num_configs = ARRAY_SIZE(rt1015_amp_conf),
108518b13ff2SJiaxin Yu };
108618b13ff2SJiaxin Yu 
10876181ab31SJiaxin Yu static const struct snd_soc_dapm_widget mt8192_mt6359_rt1015p_rt5682x_widgets[] = {
1088cfd8bb25STzung-Bi Shih 	SND_SOC_DAPM_SPK("Speakers", NULL),
1089cfd8bb25STzung-Bi Shih 	SND_SOC_DAPM_HP("Headphone Jack", NULL),
1090cfd8bb25STzung-Bi Shih 	SND_SOC_DAPM_MIC("Headset Mic", NULL),
1091cfd8bb25STzung-Bi Shih };
1092cfd8bb25STzung-Bi Shih 
10936181ab31SJiaxin Yu static const struct snd_soc_dapm_route mt8192_mt6359_rt1015p_rt5682x_routes[] = {
1094cfd8bb25STzung-Bi Shih 	/* speaker */
1095cfd8bb25STzung-Bi Shih 	{ "Speakers", NULL, "Speaker" },
1096cfd8bb25STzung-Bi Shih 	/* headset */
1097cfd8bb25STzung-Bi Shih 	{ "Headphone Jack", NULL, "HPOL" },
1098cfd8bb25STzung-Bi Shih 	{ "Headphone Jack", NULL, "HPOR" },
1099cfd8bb25STzung-Bi Shih 	{ "IN1P", NULL, "Headset Mic" },
1100cfd8bb25STzung-Bi Shih };
1101cfd8bb25STzung-Bi Shih 
11026181ab31SJiaxin Yu static const struct snd_kcontrol_new mt8192_mt6359_rt1015p_rt5682x_controls[] = {
1103cfd8bb25STzung-Bi Shih 	SOC_DAPM_PIN_SWITCH("Speakers"),
1104cfd8bb25STzung-Bi Shih 	SOC_DAPM_PIN_SWITCH("Headphone Jack"),
1105cfd8bb25STzung-Bi Shih 	SOC_DAPM_PIN_SWITCH("Headset Mic"),
1106cfd8bb25STzung-Bi Shih };
1107cfd8bb25STzung-Bi Shih 
11086181ab31SJiaxin Yu static struct snd_soc_card mt8192_mt6359_rt1015p_rt5682x_card = {
11094674284aSNícolas F. R. A. Prado 	.driver_name = DRIVER_NAME,
1110cfd8bb25STzung-Bi Shih 	.owner = THIS_MODULE,
1111cfd8bb25STzung-Bi Shih 	.dai_link = mt8192_mt6359_dai_links,
1112cfd8bb25STzung-Bi Shih 	.num_links = ARRAY_SIZE(mt8192_mt6359_dai_links),
11136181ab31SJiaxin Yu 	.controls = mt8192_mt6359_rt1015p_rt5682x_controls,
11146181ab31SJiaxin Yu 	.num_controls = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_controls),
11156181ab31SJiaxin Yu 	.dapm_widgets = mt8192_mt6359_rt1015p_rt5682x_widgets,
11166181ab31SJiaxin Yu 	.num_dapm_widgets = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_widgets),
11176181ab31SJiaxin Yu 	.dapm_routes = mt8192_mt6359_rt1015p_rt5682x_routes,
11186181ab31SJiaxin Yu 	.num_dapm_routes = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_routes),
1119cfd8bb25STzung-Bi Shih };
1120cfd8bb25STzung-Bi Shih 
mt8192_mt6359_card_set_be_link(struct snd_soc_card * card,struct snd_soc_dai_link * link,struct device_node * node,char * link_name)1121e1e408e6SJiaxin Yu static int mt8192_mt6359_card_set_be_link(struct snd_soc_card *card,
1122e1e408e6SJiaxin Yu 					  struct snd_soc_dai_link *link,
1123e1e408e6SJiaxin Yu 					  struct device_node *node,
1124e1e408e6SJiaxin Yu 					  char *link_name)
1125e1e408e6SJiaxin Yu {
1126e1e408e6SJiaxin Yu 	int ret;
1127e1e408e6SJiaxin Yu 
1128e1e408e6SJiaxin Yu 	if (node && strcmp(link->name, link_name) == 0) {
1129e1e408e6SJiaxin Yu 		ret = snd_soc_of_get_dai_link_codecs(card->dev, node, link);
1130e1e408e6SJiaxin Yu 		if (ret < 0) {
1131e1e408e6SJiaxin Yu 			dev_err_probe(card->dev, ret, "get dai link codecs fail\n");
1132e1e408e6SJiaxin Yu 			return ret;
1133e1e408e6SJiaxin Yu 		}
1134e1e408e6SJiaxin Yu 	}
1135e1e408e6SJiaxin Yu 
1136e1e408e6SJiaxin Yu 	return 0;
1137e1e408e6SJiaxin Yu }
1138e1e408e6SJiaxin Yu 
mt8192_mt6359_dev_probe(struct platform_device * pdev)1139a5f80375STzung-Bi Shih static int mt8192_mt6359_dev_probe(struct platform_device *pdev)
114018b13ff2SJiaxin Yu {
11412b53d2e1STzung-Bi Shih 	struct snd_soc_card *card;
1142f8910fb4SJiaxin Yu 	struct device_node *platform_node, *hdmi_codec, *headset_codec, *speaker_codec;
114318b13ff2SJiaxin Yu 	int ret, i;
114418b13ff2SJiaxin Yu 	struct snd_soc_dai_link *dai_link;
11454e37528aSTzung-Bi Shih 	struct mt8192_mt6359_priv *priv;
114618b13ff2SJiaxin Yu 
11473667a037STzung-Bi Shih 	card = (struct snd_soc_card *)of_device_get_match_data(&pdev->dev);
1148e1e408e6SJiaxin Yu 	if (!card)
1149e1e408e6SJiaxin Yu 		return -EINVAL;
11502b53d2e1STzung-Bi Shih 	card->dev = &pdev->dev;
11512b53d2e1STzung-Bi Shih 
11526181ab31SJiaxin Yu 	if (of_device_is_compatible(pdev->dev.of_node, RT1015P_RT5682_OF_NAME))
11536181ab31SJiaxin Yu 		card->name = RT1015P_RT5682_CARD_NAME;
11546181ab31SJiaxin Yu 	else if (of_device_is_compatible(pdev->dev.of_node, RT1015P_RT5682S_OF_NAME))
11556181ab31SJiaxin Yu 		card->name = RT1015P_RT5682S_CARD_NAME;
11566181ab31SJiaxin Yu 	else
11576181ab31SJiaxin Yu 		dev_dbg(&pdev->dev, "No need to set card name\n");
11586181ab31SJiaxin Yu 
1159e1e408e6SJiaxin Yu 	hdmi_codec = of_parse_phandle(pdev->dev.of_node, "mediatek,hdmi-codec", 0);
1160e1e408e6SJiaxin Yu 	if (!hdmi_codec)
1161e1e408e6SJiaxin Yu 		dev_dbg(&pdev->dev, "The machine has no hdmi-codec\n");
1162e1e408e6SJiaxin Yu 
1163e1e408e6SJiaxin Yu 	platform_node = of_parse_phandle(pdev->dev.of_node, "mediatek,platform", 0);
1164e1e408e6SJiaxin Yu 	if (!platform_node) {
1165e1e408e6SJiaxin Yu 		ret = -EINVAL;
1166e1e408e6SJiaxin Yu 		dev_err_probe(&pdev->dev, ret, "Property 'platform' missing or invalid\n");
1167e1e408e6SJiaxin Yu 		goto err_platform_node;
1168e1e408e6SJiaxin Yu 	}
1169e1e408e6SJiaxin Yu 
1170e1e408e6SJiaxin Yu 	speaker_codec = of_get_child_by_name(pdev->dev.of_node, "speaker-codecs");
1171e1e408e6SJiaxin Yu 	if (!speaker_codec) {
1172e1e408e6SJiaxin Yu 		ret = -EINVAL;
1173e1e408e6SJiaxin Yu 		dev_err_probe(&pdev->dev, ret, "Property 'speaker-codecs' missing or invalid\n");
1174e1e408e6SJiaxin Yu 		goto err_speaker_codec;
1175e1e408e6SJiaxin Yu 	}
11760d80c48cSTzung-Bi Shih 
1177f8910fb4SJiaxin Yu 	headset_codec = of_get_child_by_name(pdev->dev.of_node, "headset-codec");
1178f8910fb4SJiaxin Yu 	if (!headset_codec) {
1179f8910fb4SJiaxin Yu 		ret = -EINVAL;
1180f8910fb4SJiaxin Yu 		dev_err_probe(&pdev->dev, ret, "Property 'headset-codec' missing or invalid\n");
1181f8910fb4SJiaxin Yu 		goto err_headset_codec;
1182f8910fb4SJiaxin Yu 	}
1183f8910fb4SJiaxin Yu 
118418b13ff2SJiaxin Yu 	for_each_card_prelinks(card, i, dai_link) {
1185e1e408e6SJiaxin Yu 		ret = mt8192_mt6359_card_set_be_link(card, dai_link, speaker_codec, "I2S3");
1186e1e408e6SJiaxin Yu 		if (ret) {
1187e1e408e6SJiaxin Yu 			dev_err_probe(&pdev->dev, ret, "%s set speaker_codec fail\n",
1188e1e408e6SJiaxin Yu 				      dai_link->name);
1189e1e408e6SJiaxin Yu 			goto err_probe;
11902b53d2e1STzung-Bi Shih 		}
11912b53d2e1STzung-Bi Shih 
1192f8910fb4SJiaxin Yu 		ret = mt8192_mt6359_card_set_be_link(card, dai_link, headset_codec, "I2S8");
1193f8910fb4SJiaxin Yu 		if (ret) {
1194f8910fb4SJiaxin Yu 			dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n",
1195f8910fb4SJiaxin Yu 				      dai_link->name);
1196f8910fb4SJiaxin Yu 			goto err_probe;
1197f8910fb4SJiaxin Yu 		}
1198f8910fb4SJiaxin Yu 
1199f8910fb4SJiaxin Yu 		ret = mt8192_mt6359_card_set_be_link(card, dai_link, headset_codec, "I2S9");
1200f8910fb4SJiaxin Yu 		if (ret) {
1201f8910fb4SJiaxin Yu 			dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n",
1202f8910fb4SJiaxin Yu 				      dai_link->name);
1203f8910fb4SJiaxin Yu 			goto err_probe;
1204f8910fb4SJiaxin Yu 		}
1205f8910fb4SJiaxin Yu 
12060d80c48cSTzung-Bi Shih 		if (hdmi_codec && strcmp(dai_link->name, "TDM") == 0) {
12070d80c48cSTzung-Bi Shih 			dai_link->codecs->of_node = hdmi_codec;
12080d80c48cSTzung-Bi Shih 			dai_link->ignore = 0;
12090d80c48cSTzung-Bi Shih 		}
12100d80c48cSTzung-Bi Shih 
1211e1e408e6SJiaxin Yu 		if (strcmp(dai_link->codecs[0].dai_name, RT1015_CODEC_DAI) == 0)
1212e1e408e6SJiaxin Yu 			dai_link->ops = &mt8192_rt1015_i2s_ops;
1213e1e408e6SJiaxin Yu 
121418b13ff2SJiaxin Yu 		if (!dai_link->platforms->name)
121518b13ff2SJiaxin Yu 			dai_link->platforms->of_node = platform_node;
121618b13ff2SJiaxin Yu 	}
121718b13ff2SJiaxin Yu 
12184e37528aSTzung-Bi Shih 	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
1219e45ac783SMiaoqian Lin 	if (!priv) {
1220e45ac783SMiaoqian Lin 		ret = -ENOMEM;
1221e1e408e6SJiaxin Yu 		goto err_probe;
1222e45ac783SMiaoqian Lin 	}
12234e37528aSTzung-Bi Shih 	snd_soc_card_set_drvdata(card, priv);
12244e37528aSTzung-Bi Shih 
122518b13ff2SJiaxin Yu 	ret = mt8192_afe_gpio_init(&pdev->dev);
122618b13ff2SJiaxin Yu 	if (ret) {
1227e1e408e6SJiaxin Yu 		dev_err_probe(&pdev->dev, ret, "%s init gpio error\n", __func__);
1228e1e408e6SJiaxin Yu 		goto err_probe;
122918b13ff2SJiaxin Yu 	}
123018b13ff2SJiaxin Yu 
12314e28491aSTzung-Bi Shih 	ret = devm_snd_soc_register_card(&pdev->dev, card);
1232e1e408e6SJiaxin Yu 	if (ret)
1233e1e408e6SJiaxin Yu 		dev_err_probe(&pdev->dev, ret, "%s snd_soc_register_card fail\n", __func__);
12344e28491aSTzung-Bi Shih 
1235e1e408e6SJiaxin Yu err_probe:
1236f8910fb4SJiaxin Yu 	of_node_put(headset_codec);
1237f8910fb4SJiaxin Yu err_headset_codec:
1238e1e408e6SJiaxin Yu 	of_node_put(speaker_codec);
1239e1e408e6SJiaxin Yu err_speaker_codec:
1240e45ac783SMiaoqian Lin 	of_node_put(platform_node);
1241e1e408e6SJiaxin Yu err_platform_node:
1242e1e408e6SJiaxin Yu 	of_node_put(hdmi_codec);
12434e28491aSTzung-Bi Shih 	return ret;
124418b13ff2SJiaxin Yu }
124518b13ff2SJiaxin Yu 
124618b13ff2SJiaxin Yu #ifdef CONFIG_OF
1247a5f80375STzung-Bi Shih static const struct of_device_id mt8192_mt6359_dt_match[] = {
12482b53d2e1STzung-Bi Shih 	{
12496181ab31SJiaxin Yu 		.compatible = RT1015_RT5682_OF_NAME,
12502b53d2e1STzung-Bi Shih 		.data = &mt8192_mt6359_rt1015_rt5682_card,
12512b53d2e1STzung-Bi Shih 	},
1252cfd8bb25STzung-Bi Shih 	{
12536181ab31SJiaxin Yu 		.compatible = RT1015P_RT5682_OF_NAME,
12546181ab31SJiaxin Yu 		.data = &mt8192_mt6359_rt1015p_rt5682x_card,
12556181ab31SJiaxin Yu 	},
12566181ab31SJiaxin Yu 	{
12576181ab31SJiaxin Yu 		.compatible = RT1015P_RT5682S_OF_NAME,
12586181ab31SJiaxin Yu 		.data = &mt8192_mt6359_rt1015p_rt5682x_card,
1259cfd8bb25STzung-Bi Shih 	},
126018b13ff2SJiaxin Yu 	{}
126118b13ff2SJiaxin Yu };
12622d32a3e5SNícolas F. R. A. Prado MODULE_DEVICE_TABLE(of, mt8192_mt6359_dt_match);
126318b13ff2SJiaxin Yu #endif
126418b13ff2SJiaxin Yu 
1265a5f80375STzung-Bi Shih static const struct dev_pm_ops mt8192_mt6359_pm_ops = {
126618b13ff2SJiaxin Yu 	.poweroff = snd_soc_poweroff,
126718b13ff2SJiaxin Yu 	.restore = snd_soc_resume,
126818b13ff2SJiaxin Yu };
126918b13ff2SJiaxin Yu 
1270a5f80375STzung-Bi Shih static struct platform_driver mt8192_mt6359_driver = {
127118b13ff2SJiaxin Yu 	.driver = {
12724674284aSNícolas F. R. A. Prado 		.name = DRIVER_NAME,
127318b13ff2SJiaxin Yu #ifdef CONFIG_OF
1274a5f80375STzung-Bi Shih 		.of_match_table = mt8192_mt6359_dt_match,
127518b13ff2SJiaxin Yu #endif
1276a5f80375STzung-Bi Shih 		.pm = &mt8192_mt6359_pm_ops,
127718b13ff2SJiaxin Yu 	},
1278a5f80375STzung-Bi Shih 	.probe = mt8192_mt6359_dev_probe,
127918b13ff2SJiaxin Yu };
128018b13ff2SJiaxin Yu 
1281a5f80375STzung-Bi Shih module_platform_driver(mt8192_mt6359_driver);
128218b13ff2SJiaxin Yu 
128318b13ff2SJiaxin Yu /* Module information */
1284a5f80375STzung-Bi Shih MODULE_DESCRIPTION("MT8192-MT6359 ALSA SoC machine driver");
128518b13ff2SJiaxin Yu MODULE_AUTHOR("Jiaxin Yu <jiaxin.yu@mediatek.com>");
128618b13ff2SJiaxin Yu MODULE_LICENSE("GPL v2");
1287a5f80375STzung-Bi Shih MODULE_ALIAS("mt8192_mt6359 soc card");
1288