1607ac485SJiaxin Yu // SPDX-License-Identifier: GPL-2.0
2607ac485SJiaxin Yu //
3607ac485SJiaxin Yu // MediaTek ALSA SoC Audio DAI ADDA Control
4607ac485SJiaxin Yu //
5607ac485SJiaxin Yu // Copyright (c) 2020 MediaTek Inc.
6607ac485SJiaxin Yu // Author: Shane Chien <shane.chien@mediatek.com>
7607ac485SJiaxin Yu //
8607ac485SJiaxin Yu 
9607ac485SJiaxin Yu #include <linux/delay.h>
10607ac485SJiaxin Yu #include <linux/regmap.h>
11607ac485SJiaxin Yu 
12607ac485SJiaxin Yu #include "mt8192-afe-clk.h"
13607ac485SJiaxin Yu #include "mt8192-afe-common.h"
14607ac485SJiaxin Yu #include "mt8192-afe-gpio.h"
15607ac485SJiaxin Yu #include "mt8192-interconnection.h"
16607ac485SJiaxin Yu 
17607ac485SJiaxin Yu enum {
18607ac485SJiaxin Yu 	UL_IIR_SW = 0,
19607ac485SJiaxin Yu 	UL_IIR_5HZ,
20607ac485SJiaxin Yu 	UL_IIR_10HZ,
21607ac485SJiaxin Yu 	UL_IIR_25HZ,
22607ac485SJiaxin Yu 	UL_IIR_50HZ,
23607ac485SJiaxin Yu 	UL_IIR_75HZ,
24607ac485SJiaxin Yu };
25607ac485SJiaxin Yu 
26607ac485SJiaxin Yu enum {
27607ac485SJiaxin Yu 	AUDIO_SDM_LEVEL_MUTE = 0,
28607ac485SJiaxin Yu 	AUDIO_SDM_LEVEL_NORMAL = 0x1d,
29607ac485SJiaxin Yu 	/* if you change level normal */
30607ac485SJiaxin Yu 	/* you need to change formula of hp impedance and dc trim too */
31607ac485SJiaxin Yu };
32607ac485SJiaxin Yu 
33607ac485SJiaxin Yu enum {
34607ac485SJiaxin Yu 	AUDIO_SDM_2ND = 0,
35607ac485SJiaxin Yu 	AUDIO_SDM_3RD,
36607ac485SJiaxin Yu };
37607ac485SJiaxin Yu 
38607ac485SJiaxin Yu enum {
39607ac485SJiaxin Yu 	DELAY_DATA_MISO1 = 0,
40607ac485SJiaxin Yu 	DELAY_DATA_MISO2,
41607ac485SJiaxin Yu };
42607ac485SJiaxin Yu 
43607ac485SJiaxin Yu enum {
44607ac485SJiaxin Yu 	MTK_AFE_ADDA_DL_RATE_8K = 0,
45607ac485SJiaxin Yu 	MTK_AFE_ADDA_DL_RATE_11K = 1,
46607ac485SJiaxin Yu 	MTK_AFE_ADDA_DL_RATE_12K = 2,
47607ac485SJiaxin Yu 	MTK_AFE_ADDA_DL_RATE_16K = 3,
48607ac485SJiaxin Yu 	MTK_AFE_ADDA_DL_RATE_22K = 4,
49607ac485SJiaxin Yu 	MTK_AFE_ADDA_DL_RATE_24K = 5,
50607ac485SJiaxin Yu 	MTK_AFE_ADDA_DL_RATE_32K = 6,
51607ac485SJiaxin Yu 	MTK_AFE_ADDA_DL_RATE_44K = 7,
52607ac485SJiaxin Yu 	MTK_AFE_ADDA_DL_RATE_48K = 8,
53607ac485SJiaxin Yu 	MTK_AFE_ADDA_DL_RATE_96K = 9,
54607ac485SJiaxin Yu 	MTK_AFE_ADDA_DL_RATE_192K = 10,
55607ac485SJiaxin Yu };
56607ac485SJiaxin Yu 
57607ac485SJiaxin Yu enum {
58607ac485SJiaxin Yu 	MTK_AFE_ADDA_UL_RATE_8K = 0,
59607ac485SJiaxin Yu 	MTK_AFE_ADDA_UL_RATE_16K = 1,
60607ac485SJiaxin Yu 	MTK_AFE_ADDA_UL_RATE_32K = 2,
61607ac485SJiaxin Yu 	MTK_AFE_ADDA_UL_RATE_48K = 3,
62607ac485SJiaxin Yu 	MTK_AFE_ADDA_UL_RATE_96K = 4,
63607ac485SJiaxin Yu 	MTK_AFE_ADDA_UL_RATE_192K = 5,
64607ac485SJiaxin Yu 	MTK_AFE_ADDA_UL_RATE_48K_HD = 6,
65607ac485SJiaxin Yu };
66607ac485SJiaxin Yu 
67607ac485SJiaxin Yu #define SDM_AUTO_RESET_THRESHOLD 0x190000
68607ac485SJiaxin Yu 
adda_dl_rate_transform(struct mtk_base_afe * afe,unsigned int rate)69607ac485SJiaxin Yu static unsigned int adda_dl_rate_transform(struct mtk_base_afe *afe,
70607ac485SJiaxin Yu 					   unsigned int rate)
71607ac485SJiaxin Yu {
72607ac485SJiaxin Yu 	switch (rate) {
73607ac485SJiaxin Yu 	case 8000:
74607ac485SJiaxin Yu 		return MTK_AFE_ADDA_DL_RATE_8K;
75607ac485SJiaxin Yu 	case 11025:
76607ac485SJiaxin Yu 		return MTK_AFE_ADDA_DL_RATE_11K;
77607ac485SJiaxin Yu 	case 12000:
78607ac485SJiaxin Yu 		return MTK_AFE_ADDA_DL_RATE_12K;
79607ac485SJiaxin Yu 	case 16000:
80607ac485SJiaxin Yu 		return MTK_AFE_ADDA_DL_RATE_16K;
81607ac485SJiaxin Yu 	case 22050:
82607ac485SJiaxin Yu 		return MTK_AFE_ADDA_DL_RATE_22K;
83607ac485SJiaxin Yu 	case 24000:
84607ac485SJiaxin Yu 		return MTK_AFE_ADDA_DL_RATE_24K;
85607ac485SJiaxin Yu 	case 32000:
86607ac485SJiaxin Yu 		return MTK_AFE_ADDA_DL_RATE_32K;
87607ac485SJiaxin Yu 	case 44100:
88607ac485SJiaxin Yu 		return MTK_AFE_ADDA_DL_RATE_44K;
89607ac485SJiaxin Yu 	case 48000:
90607ac485SJiaxin Yu 		return MTK_AFE_ADDA_DL_RATE_48K;
91607ac485SJiaxin Yu 	case 96000:
92607ac485SJiaxin Yu 		return MTK_AFE_ADDA_DL_RATE_96K;
93607ac485SJiaxin Yu 	case 192000:
94607ac485SJiaxin Yu 		return MTK_AFE_ADDA_DL_RATE_192K;
95607ac485SJiaxin Yu 	default:
96607ac485SJiaxin Yu 		dev_warn(afe->dev, "%s(), rate %d invalid, use 48kHz!!!\n",
97607ac485SJiaxin Yu 			 __func__, rate);
98607ac485SJiaxin Yu 		return MTK_AFE_ADDA_DL_RATE_48K;
99607ac485SJiaxin Yu 	}
100607ac485SJiaxin Yu }
101607ac485SJiaxin Yu 
adda_ul_rate_transform(struct mtk_base_afe * afe,unsigned int rate)102607ac485SJiaxin Yu static unsigned int adda_ul_rate_transform(struct mtk_base_afe *afe,
103607ac485SJiaxin Yu 					   unsigned int rate)
104607ac485SJiaxin Yu {
105607ac485SJiaxin Yu 	switch (rate) {
106607ac485SJiaxin Yu 	case 8000:
107607ac485SJiaxin Yu 		return MTK_AFE_ADDA_UL_RATE_8K;
108607ac485SJiaxin Yu 	case 16000:
109607ac485SJiaxin Yu 		return MTK_AFE_ADDA_UL_RATE_16K;
110607ac485SJiaxin Yu 	case 32000:
111607ac485SJiaxin Yu 		return MTK_AFE_ADDA_UL_RATE_32K;
112607ac485SJiaxin Yu 	case 48000:
113607ac485SJiaxin Yu 		return MTK_AFE_ADDA_UL_RATE_48K;
114607ac485SJiaxin Yu 	case 96000:
115607ac485SJiaxin Yu 		return MTK_AFE_ADDA_UL_RATE_96K;
116607ac485SJiaxin Yu 	case 192000:
117607ac485SJiaxin Yu 		return MTK_AFE_ADDA_UL_RATE_192K;
118607ac485SJiaxin Yu 	default:
119607ac485SJiaxin Yu 		dev_warn(afe->dev, "%s(), rate %d invalid, use 48kHz!!!\n",
120607ac485SJiaxin Yu 			 __func__, rate);
121607ac485SJiaxin Yu 		return MTK_AFE_ADDA_UL_RATE_48K;
122607ac485SJiaxin Yu 	}
123607ac485SJiaxin Yu }
124607ac485SJiaxin Yu 
125607ac485SJiaxin Yu /* dai component */
126607ac485SJiaxin Yu static const struct snd_kcontrol_new mtk_adda_dl_ch1_mix[] = {
127607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN3, I_DL1_CH1, 1, 0),
128607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN3, I_DL12_CH1, 1, 0),
129607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN3, I_DL2_CH1, 1, 0),
130607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN3, I_DL3_CH1, 1, 0),
131607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN3_1, I_DL4_CH1, 1, 0),
132607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN3_1, I_DL5_CH1, 1, 0),
133607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN3_1, I_DL6_CH1, 1, 0),
134607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN3_1, I_DL8_CH1, 1, 0),
135607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN3,
136607ac485SJiaxin Yu 				    I_ADDA_UL_CH3, 1, 0),
137607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN3,
138607ac485SJiaxin Yu 				    I_ADDA_UL_CH2, 1, 0),
139607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN3,
140607ac485SJiaxin Yu 				    I_ADDA_UL_CH1, 1, 0),
141607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN3,
142607ac485SJiaxin Yu 				    I_GAIN1_OUT_CH1, 1, 0),
143607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN3,
144607ac485SJiaxin Yu 				    I_PCM_1_CAP_CH1, 1, 0),
145607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN3,
146607ac485SJiaxin Yu 				    I_PCM_2_CAP_CH1, 1, 0),
147607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH1", AFE_CONN3_1,
148607ac485SJiaxin Yu 				    I_SRC_1_OUT_CH1, 1, 0),
149607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("SRC_2_OUT_CH1", AFE_CONN3_1,
150607ac485SJiaxin Yu 				    I_SRC_2_OUT_CH1, 1, 0),
151607ac485SJiaxin Yu };
152607ac485SJiaxin Yu 
153607ac485SJiaxin Yu static const struct snd_kcontrol_new mtk_adda_dl_ch2_mix[] = {
154607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN4, I_DL1_CH1, 1, 0),
155607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN4, I_DL1_CH2, 1, 0),
156607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN4, I_DL12_CH2, 1, 0),
157607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN4, I_DL2_CH1, 1, 0),
158607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN4, I_DL2_CH2, 1, 0),
159607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN4, I_DL3_CH1, 1, 0),
160607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN4, I_DL3_CH2, 1, 0),
161607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN4_1, I_DL4_CH2, 1, 0),
162607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN4_1, I_DL5_CH2, 1, 0),
163607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN4_1, I_DL6_CH2, 1, 0),
164607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN4_1, I_DL8_CH2, 1, 0),
165607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN4,
166607ac485SJiaxin Yu 				    I_ADDA_UL_CH3, 1, 0),
167607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN4,
168607ac485SJiaxin Yu 				    I_ADDA_UL_CH2, 1, 0),
169607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN4,
170607ac485SJiaxin Yu 				    I_ADDA_UL_CH1, 1, 0),
171607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN4,
172607ac485SJiaxin Yu 				    I_GAIN1_OUT_CH2, 1, 0),
173607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN4,
174607ac485SJiaxin Yu 				    I_PCM_1_CAP_CH1, 1, 0),
175607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN4,
176607ac485SJiaxin Yu 				    I_PCM_2_CAP_CH1, 1, 0),
177607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN4,
178607ac485SJiaxin Yu 				    I_PCM_1_CAP_CH2, 1, 0),
179607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN4,
180607ac485SJiaxin Yu 				    I_PCM_2_CAP_CH2, 1, 0),
181607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH2", AFE_CONN4_1,
182607ac485SJiaxin Yu 				    I_SRC_1_OUT_CH2, 1, 0),
183607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("SRC_2_OUT_CH2", AFE_CONN4_1,
184607ac485SJiaxin Yu 				    I_SRC_2_OUT_CH2, 1, 0),
185607ac485SJiaxin Yu };
186607ac485SJiaxin Yu 
187607ac485SJiaxin Yu static const struct snd_kcontrol_new mtk_adda_dl_ch3_mix[] = {
188607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN52, I_DL1_CH1, 1, 0),
189607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN52, I_DL12_CH1, 1, 0),
190607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN52, I_DL2_CH1, 1, 0),
191607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN52, I_DL3_CH1, 1, 0),
192607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN52_1, I_DL4_CH1, 1, 0),
193607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN52_1, I_DL5_CH1, 1, 0),
194607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN52_1, I_DL6_CH1, 1, 0),
195607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN52,
196607ac485SJiaxin Yu 				    I_ADDA_UL_CH3, 1, 0),
197607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN52,
198607ac485SJiaxin Yu 				    I_ADDA_UL_CH2, 1, 0),
199607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN52,
200607ac485SJiaxin Yu 				    I_ADDA_UL_CH1, 1, 0),
201607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN52,
202607ac485SJiaxin Yu 				    I_GAIN1_OUT_CH1, 1, 0),
203607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN52,
204607ac485SJiaxin Yu 				    I_PCM_1_CAP_CH1, 1, 0),
205607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN52,
206607ac485SJiaxin Yu 				    I_PCM_2_CAP_CH1, 1, 0),
207607ac485SJiaxin Yu };
208607ac485SJiaxin Yu 
209607ac485SJiaxin Yu static const struct snd_kcontrol_new mtk_adda_dl_ch4_mix[] = {
210607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN53, I_DL1_CH1, 1, 0),
211607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN53, I_DL1_CH2, 1, 0),
212607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN53, I_DL12_CH2, 1, 0),
213607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN53, I_DL2_CH1, 1, 0),
214607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN53, I_DL2_CH2, 1, 0),
215607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN53, I_DL3_CH1, 1, 0),
216607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN53, I_DL3_CH2, 1, 0),
217607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN53_1, I_DL4_CH2, 1, 0),
218607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN53_1, I_DL5_CH2, 1, 0),
219607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN53_1, I_DL6_CH1, 1, 0),
220607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN53,
221607ac485SJiaxin Yu 				    I_ADDA_UL_CH3, 1, 0),
222607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN53,
223607ac485SJiaxin Yu 				    I_ADDA_UL_CH2, 1, 0),
224607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN53,
225607ac485SJiaxin Yu 				    I_ADDA_UL_CH1, 1, 0),
226607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN53,
227607ac485SJiaxin Yu 				    I_GAIN1_OUT_CH2, 1, 0),
228607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN53,
229607ac485SJiaxin Yu 				    I_PCM_1_CAP_CH1, 1, 0),
230607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN53,
231607ac485SJiaxin Yu 				    I_PCM_2_CAP_CH1, 1, 0),
232607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN53,
233607ac485SJiaxin Yu 				    I_PCM_1_CAP_CH2, 1, 0),
234607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN53,
235607ac485SJiaxin Yu 				    I_PCM_2_CAP_CH2, 1, 0),
236607ac485SJiaxin Yu };
237607ac485SJiaxin Yu 
238607ac485SJiaxin Yu static const struct snd_kcontrol_new mtk_stf_ch1_mix[] = {
239607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN19,
240607ac485SJiaxin Yu 				    I_ADDA_UL_CH1, 1, 0),
241607ac485SJiaxin Yu };
242607ac485SJiaxin Yu 
243607ac485SJiaxin Yu static const struct snd_kcontrol_new mtk_stf_ch2_mix[] = {
244607ac485SJiaxin Yu 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN20,
245607ac485SJiaxin Yu 				    I_ADDA_UL_CH2, 1, 0),
246607ac485SJiaxin Yu };
247607ac485SJiaxin Yu 
248607ac485SJiaxin Yu enum {
249607ac485SJiaxin Yu 	SUPPLY_SEQ_ADDA_AFE_ON,
250607ac485SJiaxin Yu 	SUPPLY_SEQ_ADDA_DL_ON,
251607ac485SJiaxin Yu 	SUPPLY_SEQ_ADDA_AUD_PAD_TOP,
252607ac485SJiaxin Yu 	SUPPLY_SEQ_ADDA_MTKAIF_CFG,
253607ac485SJiaxin Yu 	SUPPLY_SEQ_ADDA6_MTKAIF_CFG,
254607ac485SJiaxin Yu 	SUPPLY_SEQ_ADDA_FIFO,
255607ac485SJiaxin Yu 	SUPPLY_SEQ_ADDA_AP_DMIC,
256607ac485SJiaxin Yu 	SUPPLY_SEQ_ADDA_UL_ON,
257607ac485SJiaxin Yu };
258607ac485SJiaxin Yu 
mtk_adda_ul_src_dmic(struct mtk_base_afe * afe,int id)259607ac485SJiaxin Yu static int mtk_adda_ul_src_dmic(struct mtk_base_afe *afe, int id)
260607ac485SJiaxin Yu {
261607ac485SJiaxin Yu 	unsigned int reg;
262607ac485SJiaxin Yu 
263607ac485SJiaxin Yu 	switch (id) {
264607ac485SJiaxin Yu 	case MT8192_DAI_ADDA:
265607ac485SJiaxin Yu 	case MT8192_DAI_AP_DMIC:
266607ac485SJiaxin Yu 		reg = AFE_ADDA_UL_SRC_CON0;
267607ac485SJiaxin Yu 		break;
268607ac485SJiaxin Yu 	case MT8192_DAI_ADDA_CH34:
269607ac485SJiaxin Yu 	case MT8192_DAI_AP_DMIC_CH34:
270607ac485SJiaxin Yu 		reg = AFE_ADDA6_UL_SRC_CON0;
271607ac485SJiaxin Yu 		break;
272607ac485SJiaxin Yu 	default:
273607ac485SJiaxin Yu 		return -EINVAL;
274607ac485SJiaxin Yu 	}
275607ac485SJiaxin Yu 
276607ac485SJiaxin Yu 	/* dmic mode, 3.25M*/
277607ac485SJiaxin Yu 	regmap_update_bits(afe->regmap, reg,
278607ac485SJiaxin Yu 			   DIGMIC_3P25M_1P625M_SEL_CTL_MASK_SFT,
279607ac485SJiaxin Yu 			   0x0);
280607ac485SJiaxin Yu 	regmap_update_bits(afe->regmap, reg,
281607ac485SJiaxin Yu 			   DMIC_LOW_POWER_MODE_CTL_MASK_SFT,
282607ac485SJiaxin Yu 			   0x0);
283607ac485SJiaxin Yu 
284607ac485SJiaxin Yu 	/* turn on dmic, ch1, ch2 */
285607ac485SJiaxin Yu 	regmap_update_bits(afe->regmap, reg,
286607ac485SJiaxin Yu 			   UL_SDM_3_LEVEL_CTL_MASK_SFT,
287607ac485SJiaxin Yu 			   0x1 << UL_SDM_3_LEVEL_CTL_SFT);
288607ac485SJiaxin Yu 	regmap_update_bits(afe->regmap, reg,
289607ac485SJiaxin Yu 			   UL_MODE_3P25M_CH1_CTL_MASK_SFT,
290607ac485SJiaxin Yu 			   0x1 << UL_MODE_3P25M_CH1_CTL_SFT);
291607ac485SJiaxin Yu 	regmap_update_bits(afe->regmap, reg,
292607ac485SJiaxin Yu 			   UL_MODE_3P25M_CH2_CTL_MASK_SFT,
293607ac485SJiaxin Yu 			   0x1 << UL_MODE_3P25M_CH2_CTL_SFT);
294607ac485SJiaxin Yu 	return 0;
295607ac485SJiaxin Yu }
296607ac485SJiaxin Yu 
mtk_adda_ul_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)297607ac485SJiaxin Yu static int mtk_adda_ul_event(struct snd_soc_dapm_widget *w,
298607ac485SJiaxin Yu 			     struct snd_kcontrol *kcontrol,
299607ac485SJiaxin Yu 			     int event)
300607ac485SJiaxin Yu {
301607ac485SJiaxin Yu 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
302607ac485SJiaxin Yu 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
303607ac485SJiaxin Yu 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
304607ac485SJiaxin Yu 	int mtkaif_dmic = afe_priv->mtkaif_dmic;
305607ac485SJiaxin Yu 
306607ac485SJiaxin Yu 	switch (event) {
307607ac485SJiaxin Yu 	case SND_SOC_DAPM_PRE_PMU:
308607ac485SJiaxin Yu 		mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 1);
309607ac485SJiaxin Yu 
310607ac485SJiaxin Yu 		/* update setting to dmic */
311607ac485SJiaxin Yu 		if (mtkaif_dmic) {
312607ac485SJiaxin Yu 			/* mtkaif_rxif_data_mode = 1, dmic */
313607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_RX_CFG0,
314607ac485SJiaxin Yu 					   0x1, 0x1);
315607ac485SJiaxin Yu 
316607ac485SJiaxin Yu 			/* dmic mode, 3.25M*/
317607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_RX_CFG0,
318607ac485SJiaxin Yu 					   MTKAIF_RXIF_VOICE_MODE_MASK_SFT,
319607ac485SJiaxin Yu 					   0x0);
320607ac485SJiaxin Yu 			mtk_adda_ul_src_dmic(afe, MT8192_DAI_ADDA);
321607ac485SJiaxin Yu 		}
322607ac485SJiaxin Yu 		break;
323607ac485SJiaxin Yu 	case SND_SOC_DAPM_POST_PMD:
324607ac485SJiaxin Yu 		/* should delayed 1/fs(smallest is 8k) = 125us before afe off */
325607ac485SJiaxin Yu 		usleep_range(125, 135);
326607ac485SJiaxin Yu 		mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 1);
327607ac485SJiaxin Yu 		break;
328607ac485SJiaxin Yu 	default:
329607ac485SJiaxin Yu 		break;
330607ac485SJiaxin Yu 	}
331607ac485SJiaxin Yu 
332607ac485SJiaxin Yu 	return 0;
333607ac485SJiaxin Yu }
334607ac485SJiaxin Yu 
mtk_adda_ch34_ul_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)335607ac485SJiaxin Yu static int mtk_adda_ch34_ul_event(struct snd_soc_dapm_widget *w,
336607ac485SJiaxin Yu 				  struct snd_kcontrol *kcontrol,
337607ac485SJiaxin Yu 				  int event)
338607ac485SJiaxin Yu {
339607ac485SJiaxin Yu 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
340607ac485SJiaxin Yu 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
341607ac485SJiaxin Yu 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
342607ac485SJiaxin Yu 	int mtkaif_dmic = afe_priv->mtkaif_dmic_ch34;
343607ac485SJiaxin Yu 	int mtkaif_adda6_only = afe_priv->mtkaif_adda6_only;
344607ac485SJiaxin Yu 
345607ac485SJiaxin Yu 	switch (event) {
346607ac485SJiaxin Yu 	case SND_SOC_DAPM_PRE_PMU:
347607ac485SJiaxin Yu 		mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34,
348607ac485SJiaxin Yu 					1);
349607ac485SJiaxin Yu 
350607ac485SJiaxin Yu 		/* update setting to dmic */
351607ac485SJiaxin Yu 		if (mtkaif_dmic) {
352607ac485SJiaxin Yu 			/* mtkaif_rxif_data_mode = 1, dmic */
353607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap,
354607ac485SJiaxin Yu 					   AFE_ADDA6_MTKAIF_RX_CFG0,
355607ac485SJiaxin Yu 					   0x1, 0x1);
356607ac485SJiaxin Yu 
357607ac485SJiaxin Yu 			/* dmic mode, 3.25M*/
358607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap,
359607ac485SJiaxin Yu 					   AFE_ADDA6_MTKAIF_RX_CFG0,
360607ac485SJiaxin Yu 					   MTKAIF_RXIF_VOICE_MODE_MASK_SFT,
361607ac485SJiaxin Yu 					   0x0);
362607ac485SJiaxin Yu 			mtk_adda_ul_src_dmic(afe, MT8192_DAI_ADDA_CH34);
363607ac485SJiaxin Yu 		}
364607ac485SJiaxin Yu 
365607ac485SJiaxin Yu 		/* when using adda6 without adda enabled,
366607ac485SJiaxin Yu 		 * RG_ADDA6_MTKAIF_RX_SYNC_WORD2_DISABLE_SFT need to be set or
367607ac485SJiaxin Yu 		 * data cannot be received.
368607ac485SJiaxin Yu 		 */
369607ac485SJiaxin Yu 		if (mtkaif_adda6_only) {
370607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap,
371607ac485SJiaxin Yu 					   AFE_ADDA_MTKAIF_SYNCWORD_CFG,
372607ac485SJiaxin Yu 					   0x1 << 23, 0x1 << 23);
373607ac485SJiaxin Yu 		}
374607ac485SJiaxin Yu 		break;
375607ac485SJiaxin Yu 	case SND_SOC_DAPM_POST_PMD:
376607ac485SJiaxin Yu 		/* should delayed 1/fs(smallest is 8k) = 125us before afe off */
377607ac485SJiaxin Yu 		usleep_range(125, 135);
378607ac485SJiaxin Yu 		mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34,
379607ac485SJiaxin Yu 					1);
380607ac485SJiaxin Yu 
381607ac485SJiaxin Yu 		/* reset dmic */
382607ac485SJiaxin Yu 		afe_priv->mtkaif_dmic_ch34 = 0;
383607ac485SJiaxin Yu 
384607ac485SJiaxin Yu 		if (mtkaif_adda6_only) {
385607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap,
386607ac485SJiaxin Yu 					   AFE_ADDA_MTKAIF_SYNCWORD_CFG,
387607ac485SJiaxin Yu 					   0x1 << 23, 0x0 << 23);
388607ac485SJiaxin Yu 		}
389607ac485SJiaxin Yu 		break;
390607ac485SJiaxin Yu 	default:
391607ac485SJiaxin Yu 		break;
392607ac485SJiaxin Yu 	}
393607ac485SJiaxin Yu 
394607ac485SJiaxin Yu 	return 0;
395607ac485SJiaxin Yu }
396607ac485SJiaxin Yu 
mtk_adda_pad_top_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)397607ac485SJiaxin Yu static int mtk_adda_pad_top_event(struct snd_soc_dapm_widget *w,
398607ac485SJiaxin Yu 				  struct snd_kcontrol *kcontrol,
399607ac485SJiaxin Yu 				  int event)
400607ac485SJiaxin Yu {
401607ac485SJiaxin Yu 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
402607ac485SJiaxin Yu 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
403607ac485SJiaxin Yu 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
404607ac485SJiaxin Yu 
405607ac485SJiaxin Yu 	switch (event) {
406607ac485SJiaxin Yu 	case SND_SOC_DAPM_PRE_PMU:
407607ac485SJiaxin Yu 		if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2_CLK_P2)
408607ac485SJiaxin Yu 			regmap_write(afe->regmap, AFE_AUD_PAD_TOP, 0x38);
409607ac485SJiaxin Yu 		else
410607ac485SJiaxin Yu 			regmap_write(afe->regmap, AFE_AUD_PAD_TOP, 0x30);
411607ac485SJiaxin Yu 		break;
412607ac485SJiaxin Yu 	default:
413607ac485SJiaxin Yu 		break;
414607ac485SJiaxin Yu 	}
415607ac485SJiaxin Yu 
416607ac485SJiaxin Yu 	return 0;
417607ac485SJiaxin Yu }
418607ac485SJiaxin Yu 
mtk_adda_mtkaif_cfg_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)419607ac485SJiaxin Yu static int mtk_adda_mtkaif_cfg_event(struct snd_soc_dapm_widget *w,
420607ac485SJiaxin Yu 				     struct snd_kcontrol *kcontrol,
421607ac485SJiaxin Yu 				     int event)
422607ac485SJiaxin Yu {
423607ac485SJiaxin Yu 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
424607ac485SJiaxin Yu 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
425607ac485SJiaxin Yu 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
426607ac485SJiaxin Yu 	int delay_data;
427607ac485SJiaxin Yu 	int delay_cycle;
428607ac485SJiaxin Yu 
429607ac485SJiaxin Yu 	switch (event) {
430607ac485SJiaxin Yu 	case SND_SOC_DAPM_PRE_PMU:
431607ac485SJiaxin Yu 		if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2_CLK_P2) {
432607ac485SJiaxin Yu 			/* set protocol 2 */
433607ac485SJiaxin Yu 			regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
434607ac485SJiaxin Yu 				     0x00010000);
435607ac485SJiaxin Yu 			regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
436607ac485SJiaxin Yu 				     0x00010000);
437607ac485SJiaxin Yu 
438607ac485SJiaxin Yu 			if (strcmp(w->name, "ADDA_MTKAIF_CFG") == 0 &&
439607ac485SJiaxin Yu 			    (afe_priv->mtkaif_chosen_phase[0] < 0 ||
440607ac485SJiaxin Yu 			     afe_priv->mtkaif_chosen_phase[1] < 0)) {
441607ac485SJiaxin Yu 				dev_warn(afe->dev,
442607ac485SJiaxin Yu 					 "%s(), mtkaif_chosen_phase[0/1]:%d/%d\n",
443607ac485SJiaxin Yu 					 __func__,
444607ac485SJiaxin Yu 					 afe_priv->mtkaif_chosen_phase[0],
445607ac485SJiaxin Yu 					 afe_priv->mtkaif_chosen_phase[1]);
446607ac485SJiaxin Yu 				break;
447607ac485SJiaxin Yu 			} else if (strcmp(w->name, "ADDA6_MTKAIF_CFG") == 0 &&
448607ac485SJiaxin Yu 				   afe_priv->mtkaif_chosen_phase[2] < 0) {
449607ac485SJiaxin Yu 				dev_warn(afe->dev,
450607ac485SJiaxin Yu 					 "%s(), mtkaif_chosen_phase[2]:%d\n",
451607ac485SJiaxin Yu 					 __func__,
452607ac485SJiaxin Yu 					 afe_priv->mtkaif_chosen_phase[2]);
453607ac485SJiaxin Yu 				break;
454607ac485SJiaxin Yu 			}
455607ac485SJiaxin Yu 
456607ac485SJiaxin Yu 			/* mtkaif_rxif_clkinv_adc inverse for calibration */
457607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
458607ac485SJiaxin Yu 					   MTKAIF_RXIF_CLKINV_ADC_MASK_SFT,
459607ac485SJiaxin Yu 					   0x1 << MTKAIF_RXIF_CLKINV_ADC_SFT);
460607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
461607ac485SJiaxin Yu 					   MTKAIF_RXIF_CLKINV_ADC_MASK_SFT,
462607ac485SJiaxin Yu 					   0x1 << MTKAIF_RXIF_CLKINV_ADC_SFT);
463607ac485SJiaxin Yu 
464607ac485SJiaxin Yu 			/* set delay for ch12 */
465607ac485SJiaxin Yu 			if (afe_priv->mtkaif_phase_cycle[0] >=
466607ac485SJiaxin Yu 			    afe_priv->mtkaif_phase_cycle[1]) {
467607ac485SJiaxin Yu 				delay_data = DELAY_DATA_MISO1;
468607ac485SJiaxin Yu 				delay_cycle = afe_priv->mtkaif_phase_cycle[0] -
469607ac485SJiaxin Yu 					      afe_priv->mtkaif_phase_cycle[1];
470607ac485SJiaxin Yu 			} else {
471607ac485SJiaxin Yu 				delay_data = DELAY_DATA_MISO2;
472607ac485SJiaxin Yu 				delay_cycle = afe_priv->mtkaif_phase_cycle[1] -
473607ac485SJiaxin Yu 					      afe_priv->mtkaif_phase_cycle[0];
474607ac485SJiaxin Yu 			}
475607ac485SJiaxin Yu 
476607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap,
477607ac485SJiaxin Yu 					   AFE_ADDA_MTKAIF_RX_CFG2,
478607ac485SJiaxin Yu 					   MTKAIF_RXIF_DELAY_DATA_MASK_SFT,
479607ac485SJiaxin Yu 					   delay_data <<
480607ac485SJiaxin Yu 					   MTKAIF_RXIF_DELAY_DATA_SFT);
481607ac485SJiaxin Yu 
482607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap,
483607ac485SJiaxin Yu 					   AFE_ADDA_MTKAIF_RX_CFG2,
484607ac485SJiaxin Yu 					   MTKAIF_RXIF_DELAY_CYCLE_MASK_SFT,
485607ac485SJiaxin Yu 					   delay_cycle <<
486607ac485SJiaxin Yu 					   MTKAIF_RXIF_DELAY_CYCLE_SFT);
487607ac485SJiaxin Yu 
488607ac485SJiaxin Yu 			/* set delay between ch3 and ch2 */
489607ac485SJiaxin Yu 			if (afe_priv->mtkaif_phase_cycle[2] >=
490607ac485SJiaxin Yu 			    afe_priv->mtkaif_phase_cycle[1]) {
491607ac485SJiaxin Yu 				delay_data = DELAY_DATA_MISO1;	/* ch3 */
492607ac485SJiaxin Yu 				delay_cycle = afe_priv->mtkaif_phase_cycle[2] -
493607ac485SJiaxin Yu 					      afe_priv->mtkaif_phase_cycle[1];
494607ac485SJiaxin Yu 			} else {
495607ac485SJiaxin Yu 				delay_data = DELAY_DATA_MISO2;	/* ch2 */
496607ac485SJiaxin Yu 				delay_cycle = afe_priv->mtkaif_phase_cycle[1] -
497607ac485SJiaxin Yu 					      afe_priv->mtkaif_phase_cycle[2];
498607ac485SJiaxin Yu 			}
499607ac485SJiaxin Yu 
500607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap,
501607ac485SJiaxin Yu 					   AFE_ADDA6_MTKAIF_RX_CFG2,
502607ac485SJiaxin Yu 					   MTKAIF_RXIF_DELAY_DATA_MASK_SFT,
503607ac485SJiaxin Yu 					   delay_data <<
504607ac485SJiaxin Yu 					   MTKAIF_RXIF_DELAY_DATA_SFT);
505607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap,
506607ac485SJiaxin Yu 					   AFE_ADDA6_MTKAIF_RX_CFG2,
507607ac485SJiaxin Yu 					   MTKAIF_RXIF_DELAY_CYCLE_MASK_SFT,
508607ac485SJiaxin Yu 					   delay_cycle <<
509607ac485SJiaxin Yu 					   MTKAIF_RXIF_DELAY_CYCLE_SFT);
510607ac485SJiaxin Yu 		} else if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2) {
511607ac485SJiaxin Yu 			regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
512607ac485SJiaxin Yu 				     0x00010000);
513607ac485SJiaxin Yu 			regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
514607ac485SJiaxin Yu 				     0x00010000);
515607ac485SJiaxin Yu 		} else {
516607ac485SJiaxin Yu 			regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0, 0x0);
517607ac485SJiaxin Yu 			regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0, 0x0);
518607ac485SJiaxin Yu 		}
519607ac485SJiaxin Yu 		break;
520607ac485SJiaxin Yu 	default:
521607ac485SJiaxin Yu 		break;
522607ac485SJiaxin Yu 	}
523607ac485SJiaxin Yu 
524607ac485SJiaxin Yu 	return 0;
525607ac485SJiaxin Yu }
526607ac485SJiaxin Yu 
mtk_adda_dl_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)527607ac485SJiaxin Yu static int mtk_adda_dl_event(struct snd_soc_dapm_widget *w,
528607ac485SJiaxin Yu 			     struct snd_kcontrol *kcontrol,
529607ac485SJiaxin Yu 			     int event)
530607ac485SJiaxin Yu {
531607ac485SJiaxin Yu 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
532607ac485SJiaxin Yu 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
533607ac485SJiaxin Yu 
534607ac485SJiaxin Yu 	switch (event) {
535607ac485SJiaxin Yu 	case SND_SOC_DAPM_PRE_PMU:
536607ac485SJiaxin Yu 		mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 0);
537607ac485SJiaxin Yu 		break;
538607ac485SJiaxin Yu 	case SND_SOC_DAPM_POST_PMD:
539607ac485SJiaxin Yu 		/* should delayed 1/fs(smallest is 8k) = 125us before afe off */
540607ac485SJiaxin Yu 		usleep_range(125, 135);
541607ac485SJiaxin Yu 		mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 0);
542607ac485SJiaxin Yu 		break;
543607ac485SJiaxin Yu 	default:
544607ac485SJiaxin Yu 		break;
545607ac485SJiaxin Yu 	}
546607ac485SJiaxin Yu 
547607ac485SJiaxin Yu 	return 0;
548607ac485SJiaxin Yu }
549607ac485SJiaxin Yu 
mtk_adda_ch34_dl_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)550607ac485SJiaxin Yu static int mtk_adda_ch34_dl_event(struct snd_soc_dapm_widget *w,
551607ac485SJiaxin Yu 				  struct snd_kcontrol *kcontrol,
552607ac485SJiaxin Yu 				  int event)
553607ac485SJiaxin Yu {
554607ac485SJiaxin Yu 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
555607ac485SJiaxin Yu 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
556607ac485SJiaxin Yu 
557607ac485SJiaxin Yu 	switch (event) {
558607ac485SJiaxin Yu 	case SND_SOC_DAPM_PRE_PMU:
559607ac485SJiaxin Yu 		mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34,
560607ac485SJiaxin Yu 					0);
561607ac485SJiaxin Yu 		break;
562607ac485SJiaxin Yu 	case SND_SOC_DAPM_POST_PMD:
563607ac485SJiaxin Yu 		/* should delayed 1/fs(smallest is 8k) = 125us before afe off */
564607ac485SJiaxin Yu 		usleep_range(125, 135);
565607ac485SJiaxin Yu 		mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34,
566607ac485SJiaxin Yu 					0);
567607ac485SJiaxin Yu 		break;
568607ac485SJiaxin Yu 	default:
569607ac485SJiaxin Yu 		break;
570607ac485SJiaxin Yu 	}
571607ac485SJiaxin Yu 
572607ac485SJiaxin Yu 	return 0;
573607ac485SJiaxin Yu }
574607ac485SJiaxin Yu 
575607ac485SJiaxin Yu /* stf */
stf_positive_gain_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)576607ac485SJiaxin Yu static int stf_positive_gain_get(struct snd_kcontrol *kcontrol,
577607ac485SJiaxin Yu 				 struct snd_ctl_elem_value *ucontrol)
578607ac485SJiaxin Yu {
579607ac485SJiaxin Yu 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
580607ac485SJiaxin Yu 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
581607ac485SJiaxin Yu 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
582607ac485SJiaxin Yu 
583607ac485SJiaxin Yu 	ucontrol->value.integer.value[0] = afe_priv->stf_positive_gain_db;
584607ac485SJiaxin Yu 	return 0;
585607ac485SJiaxin Yu }
586607ac485SJiaxin Yu 
stf_positive_gain_set(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)587607ac485SJiaxin Yu static int stf_positive_gain_set(struct snd_kcontrol *kcontrol,
588607ac485SJiaxin Yu 				 struct snd_ctl_elem_value *ucontrol)
589607ac485SJiaxin Yu {
590607ac485SJiaxin Yu 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
591607ac485SJiaxin Yu 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
592607ac485SJiaxin Yu 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
593607ac485SJiaxin Yu 	int gain_db = ucontrol->value.integer.value[0];
594b373076fSMark Brown 	bool change = false;
595607ac485SJiaxin Yu 
596607ac485SJiaxin Yu 	afe_priv->stf_positive_gain_db = gain_db;
597607ac485SJiaxin Yu 
598607ac485SJiaxin Yu 	if (gain_db >= 0 && gain_db <= 24) {
599b373076fSMark Brown 		regmap_update_bits_check(afe->regmap,
600607ac485SJiaxin Yu 					 AFE_SIDETONE_GAIN,
601607ac485SJiaxin Yu 					 POSITIVE_GAIN_MASK_SFT,
602b373076fSMark Brown 					 (gain_db / 6) << POSITIVE_GAIN_SFT,
603b373076fSMark Brown 					 &change);
60405437a91SMark Brown 	} else {
60505437a91SMark Brown 		return -EINVAL;
606607ac485SJiaxin Yu 	}
607b373076fSMark Brown 
608b373076fSMark Brown 	return change;
609607ac485SJiaxin Yu }
610607ac485SJiaxin Yu 
mt8192_adda_dmic_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)611607ac485SJiaxin Yu static int mt8192_adda_dmic_get(struct snd_kcontrol *kcontrol,
612607ac485SJiaxin Yu 				struct snd_ctl_elem_value *ucontrol)
613607ac485SJiaxin Yu {
614607ac485SJiaxin Yu 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
615607ac485SJiaxin Yu 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
616607ac485SJiaxin Yu 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
617607ac485SJiaxin Yu 
618607ac485SJiaxin Yu 	ucontrol->value.integer.value[0] = afe_priv->mtkaif_dmic;
619607ac485SJiaxin Yu 	return 0;
620607ac485SJiaxin Yu }
621607ac485SJiaxin Yu 
mt8192_adda_dmic_set(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)622607ac485SJiaxin Yu static int mt8192_adda_dmic_set(struct snd_kcontrol *kcontrol,
623607ac485SJiaxin Yu 				struct snd_ctl_elem_value *ucontrol)
624607ac485SJiaxin Yu {
625607ac485SJiaxin Yu 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
626607ac485SJiaxin Yu 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
627607ac485SJiaxin Yu 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
628607ac485SJiaxin Yu 	int dmic_on;
629b373076fSMark Brown 	bool change;
630607ac485SJiaxin Yu 
631607ac485SJiaxin Yu 	dmic_on = ucontrol->value.integer.value[0];
632607ac485SJiaxin Yu 
633b373076fSMark Brown 	change = (afe_priv->mtkaif_dmic != dmic_on) ||
634b373076fSMark Brown 		(afe_priv->mtkaif_dmic_ch34 != dmic_on);
635b373076fSMark Brown 
636607ac485SJiaxin Yu 	afe_priv->mtkaif_dmic = dmic_on;
637607ac485SJiaxin Yu 	afe_priv->mtkaif_dmic_ch34 = dmic_on;
638b373076fSMark Brown 
639b373076fSMark Brown 	return change;
640607ac485SJiaxin Yu }
641607ac485SJiaxin Yu 
mt8192_adda6_only_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)642607ac485SJiaxin Yu static int mt8192_adda6_only_get(struct snd_kcontrol *kcontrol,
643607ac485SJiaxin Yu 				 struct snd_ctl_elem_value *ucontrol)
644607ac485SJiaxin Yu {
645607ac485SJiaxin Yu 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
646607ac485SJiaxin Yu 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
647607ac485SJiaxin Yu 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
648607ac485SJiaxin Yu 
649607ac485SJiaxin Yu 	ucontrol->value.integer.value[0] = afe_priv->mtkaif_adda6_only;
650607ac485SJiaxin Yu 	return 0;
651607ac485SJiaxin Yu }
652607ac485SJiaxin Yu 
mt8192_adda6_only_set(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)653607ac485SJiaxin Yu static int mt8192_adda6_only_set(struct snd_kcontrol *kcontrol,
654607ac485SJiaxin Yu 				 struct snd_ctl_elem_value *ucontrol)
655607ac485SJiaxin Yu {
656607ac485SJiaxin Yu 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
657607ac485SJiaxin Yu 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
658607ac485SJiaxin Yu 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
659607ac485SJiaxin Yu 	int mtkaif_adda6_only;
660b373076fSMark Brown 	bool change;
661607ac485SJiaxin Yu 
662607ac485SJiaxin Yu 	mtkaif_adda6_only = ucontrol->value.integer.value[0];
663607ac485SJiaxin Yu 
664b373076fSMark Brown 	change = afe_priv->mtkaif_adda6_only != mtkaif_adda6_only;
665607ac485SJiaxin Yu 	afe_priv->mtkaif_adda6_only = mtkaif_adda6_only;
666b373076fSMark Brown 
667b373076fSMark Brown 	return change;
668607ac485SJiaxin Yu }
669607ac485SJiaxin Yu 
670607ac485SJiaxin Yu static const struct snd_kcontrol_new mtk_adda_controls[] = {
671607ac485SJiaxin Yu 	SOC_SINGLE("Sidetone_Gain", AFE_SIDETONE_GAIN,
672607ac485SJiaxin Yu 		   SIDE_TONE_GAIN_SFT, SIDE_TONE_GAIN_MASK, 0),
673*ce40d93bSMark Brown 	SOC_SINGLE_EXT("Sidetone_Positive_Gain_dB", SND_SOC_NOPM, 0, 24, 0,
674607ac485SJiaxin Yu 		       stf_positive_gain_get, stf_positive_gain_set),
675607ac485SJiaxin Yu 	SOC_SINGLE("ADDA_DL_GAIN", AFE_ADDA_DL_SRC2_CON1,
676607ac485SJiaxin Yu 		   DL_2_GAIN_CTL_PRE_SFT, DL_2_GAIN_CTL_PRE_MASK, 0),
677607ac485SJiaxin Yu 	SOC_SINGLE_BOOL_EXT("MTKAIF_DMIC Switch", 0,
678607ac485SJiaxin Yu 			    mt8192_adda_dmic_get, mt8192_adda_dmic_set),
679607ac485SJiaxin Yu 	SOC_SINGLE_BOOL_EXT("MTKAIF_ADDA6_ONLY Switch", 0,
680607ac485SJiaxin Yu 			    mt8192_adda6_only_get, mt8192_adda6_only_set),
681607ac485SJiaxin Yu };
682607ac485SJiaxin Yu 
683607ac485SJiaxin Yu static const struct snd_kcontrol_new stf_ctl =
684607ac485SJiaxin Yu 	SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0);
685607ac485SJiaxin Yu 
686607ac485SJiaxin Yu static const u16 stf_coeff_table_16k[] = {
687607ac485SJiaxin Yu 	0x049C, 0x09E8, 0x09E0, 0x089C,
688607ac485SJiaxin Yu 	0xFF54, 0xF488, 0xEAFC, 0xEBAC,
689607ac485SJiaxin Yu 	0xfA40, 0x17AC, 0x3D1C, 0x6028,
690607ac485SJiaxin Yu 	0x7538
691607ac485SJiaxin Yu };
692607ac485SJiaxin Yu 
693607ac485SJiaxin Yu static const u16 stf_coeff_table_32k[] = {
694607ac485SJiaxin Yu 	0xFE52, 0x0042, 0x00C5, 0x0194,
695607ac485SJiaxin Yu 	0x029A, 0x03B7, 0x04BF, 0x057D,
696607ac485SJiaxin Yu 	0x05BE, 0x0555, 0x0426, 0x0230,
697607ac485SJiaxin Yu 	0xFF92, 0xFC89, 0xF973, 0xF6C6,
698607ac485SJiaxin Yu 	0xF500, 0xF49D, 0xF603, 0xF970,
699607ac485SJiaxin Yu 	0xFEF3, 0x065F, 0x0F4F, 0x1928,
700607ac485SJiaxin Yu 	0x2329, 0x2C80, 0x345E, 0x3A0D,
701607ac485SJiaxin Yu 	0x3D08
702607ac485SJiaxin Yu };
703607ac485SJiaxin Yu 
704607ac485SJiaxin Yu static const u16 stf_coeff_table_48k[] = {
705607ac485SJiaxin Yu 	0x0401, 0xFFB0, 0xFF5A, 0xFECE,
706607ac485SJiaxin Yu 	0xFE10, 0xFD28, 0xFC21, 0xFB08,
707607ac485SJiaxin Yu 	0xF9EF, 0xF8E8, 0xF80A, 0xF76C,
708607ac485SJiaxin Yu 	0xF724, 0xF746, 0xF7E6, 0xF90F,
709607ac485SJiaxin Yu 	0xFACC, 0xFD1E, 0xFFFF, 0x0364,
710607ac485SJiaxin Yu 	0x0737, 0x0B62, 0x0FC1, 0x1431,
711607ac485SJiaxin Yu 	0x188A, 0x1CA4, 0x2056, 0x237D,
712607ac485SJiaxin Yu 	0x25F9, 0x27B0, 0x2890
713607ac485SJiaxin Yu };
714607ac485SJiaxin Yu 
mtk_stf_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)715607ac485SJiaxin Yu static int mtk_stf_event(struct snd_soc_dapm_widget *w,
716607ac485SJiaxin Yu 			 struct snd_kcontrol *kcontrol,
717607ac485SJiaxin Yu 			 int event)
718607ac485SJiaxin Yu {
719607ac485SJiaxin Yu 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
720607ac485SJiaxin Yu 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
721607ac485SJiaxin Yu 
722607ac485SJiaxin Yu 	size_t half_tap_num;
723607ac485SJiaxin Yu 	const u16 *stf_coeff_table;
724607ac485SJiaxin Yu 	unsigned int ul_rate, reg_value;
725607ac485SJiaxin Yu 	size_t coef_addr;
726607ac485SJiaxin Yu 
727607ac485SJiaxin Yu 	regmap_read(afe->regmap, AFE_ADDA_UL_SRC_CON0, &ul_rate);
728607ac485SJiaxin Yu 	ul_rate = ul_rate >> UL_VOICE_MODE_CH1_CH2_CTL_SFT;
729607ac485SJiaxin Yu 	ul_rate = ul_rate & UL_VOICE_MODE_CH1_CH2_CTL_MASK;
730607ac485SJiaxin Yu 
731607ac485SJiaxin Yu 	if (ul_rate == MTK_AFE_ADDA_UL_RATE_48K) {
732607ac485SJiaxin Yu 		half_tap_num = ARRAY_SIZE(stf_coeff_table_48k);
733607ac485SJiaxin Yu 		stf_coeff_table = stf_coeff_table_48k;
734607ac485SJiaxin Yu 	} else if (ul_rate == MTK_AFE_ADDA_UL_RATE_32K) {
735607ac485SJiaxin Yu 		half_tap_num = ARRAY_SIZE(stf_coeff_table_32k);
736607ac485SJiaxin Yu 		stf_coeff_table = stf_coeff_table_32k;
737607ac485SJiaxin Yu 	} else {
738607ac485SJiaxin Yu 		half_tap_num = ARRAY_SIZE(stf_coeff_table_16k);
739607ac485SJiaxin Yu 		stf_coeff_table = stf_coeff_table_16k;
740607ac485SJiaxin Yu 	}
741607ac485SJiaxin Yu 
742607ac485SJiaxin Yu 	regmap_read(afe->regmap, AFE_SIDETONE_CON1, &reg_value);
743607ac485SJiaxin Yu 
744607ac485SJiaxin Yu 	switch (event) {
745607ac485SJiaxin Yu 	case SND_SOC_DAPM_PRE_PMU:
746607ac485SJiaxin Yu 		/* set side tone gain = 0 */
747607ac485SJiaxin Yu 		regmap_update_bits(afe->regmap,
748607ac485SJiaxin Yu 				   AFE_SIDETONE_GAIN,
749607ac485SJiaxin Yu 				   SIDE_TONE_GAIN_MASK_SFT,
750607ac485SJiaxin Yu 				   0);
751607ac485SJiaxin Yu 		regmap_update_bits(afe->regmap,
752607ac485SJiaxin Yu 				   AFE_SIDETONE_GAIN,
753607ac485SJiaxin Yu 				   POSITIVE_GAIN_MASK_SFT,
754607ac485SJiaxin Yu 				   0);
755607ac485SJiaxin Yu 		/* don't bypass stf */
756607ac485SJiaxin Yu 		regmap_update_bits(afe->regmap,
757607ac485SJiaxin Yu 				   AFE_SIDETONE_CON1,
758607ac485SJiaxin Yu 				   0x1f << 27,
759607ac485SJiaxin Yu 				   0x0);
760607ac485SJiaxin Yu 		/* set stf half tap num */
761607ac485SJiaxin Yu 		regmap_update_bits(afe->regmap,
762607ac485SJiaxin Yu 				   AFE_SIDETONE_CON1,
763607ac485SJiaxin Yu 				   SIDE_TONE_HALF_TAP_NUM_MASK_SFT,
764607ac485SJiaxin Yu 				   half_tap_num << SIDE_TONE_HALF_TAP_NUM_SFT);
765607ac485SJiaxin Yu 
766607ac485SJiaxin Yu 		/* set side tone coefficient */
767607ac485SJiaxin Yu 		regmap_read(afe->regmap, AFE_SIDETONE_CON0, &reg_value);
768607ac485SJiaxin Yu 		for (coef_addr = 0; coef_addr < half_tap_num; coef_addr++) {
769607ac485SJiaxin Yu 			bool old_w_ready = (reg_value >> W_RDY_SFT) & 0x1;
770607ac485SJiaxin Yu 			bool new_w_ready = 0;
771607ac485SJiaxin Yu 			int try_cnt = 0;
772607ac485SJiaxin Yu 
773607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap,
774607ac485SJiaxin Yu 					   AFE_SIDETONE_CON0,
775607ac485SJiaxin Yu 					   0x39FFFFF,
776607ac485SJiaxin Yu 					   (1 << R_W_EN_SFT) |
777607ac485SJiaxin Yu 					   (1 << R_W_SEL_SFT) |
778607ac485SJiaxin Yu 					   (0 << SEL_CH2_SFT) |
779607ac485SJiaxin Yu 					   (coef_addr <<
780607ac485SJiaxin Yu 					   SIDE_TONE_COEFFICIENT_ADDR_SFT) |
781607ac485SJiaxin Yu 					   stf_coeff_table[coef_addr]);
782607ac485SJiaxin Yu 
783607ac485SJiaxin Yu 			/* wait until flag write_ready changed */
784607ac485SJiaxin Yu 			for (try_cnt = 0; try_cnt < 10; try_cnt++) {
785607ac485SJiaxin Yu 				regmap_read(afe->regmap,
786607ac485SJiaxin Yu 					    AFE_SIDETONE_CON0, &reg_value);
787607ac485SJiaxin Yu 				new_w_ready = (reg_value >> W_RDY_SFT) & 0x1;
788607ac485SJiaxin Yu 
789607ac485SJiaxin Yu 				/* flip => ok */
790607ac485SJiaxin Yu 				if (new_w_ready == old_w_ready) {
791607ac485SJiaxin Yu 					udelay(3);
792607ac485SJiaxin Yu 					if (try_cnt == 9) {
793607ac485SJiaxin Yu 						dev_warn(afe->dev,
794607ac485SJiaxin Yu 							 "%s(), write coeff not ready",
795607ac485SJiaxin Yu 							 __func__);
796607ac485SJiaxin Yu 					}
797607ac485SJiaxin Yu 				} else {
798607ac485SJiaxin Yu 					break;
799607ac485SJiaxin Yu 				}
800607ac485SJiaxin Yu 			}
801607ac485SJiaxin Yu 			/* need write -> read -> write to write next coeff */
802607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap,
803607ac485SJiaxin Yu 					   AFE_SIDETONE_CON0,
804607ac485SJiaxin Yu 					   R_W_SEL_MASK_SFT,
805607ac485SJiaxin Yu 					   0x0);
806607ac485SJiaxin Yu 		}
807607ac485SJiaxin Yu 		break;
808607ac485SJiaxin Yu 	case SND_SOC_DAPM_POST_PMD:
809607ac485SJiaxin Yu 		/* bypass stf */
810607ac485SJiaxin Yu 		regmap_update_bits(afe->regmap,
811607ac485SJiaxin Yu 				   AFE_SIDETONE_CON1,
812607ac485SJiaxin Yu 				   0x1f << 27,
813607ac485SJiaxin Yu 				   0x1f << 27);
814607ac485SJiaxin Yu 
815607ac485SJiaxin Yu 		/* set side tone gain = 0 */
816607ac485SJiaxin Yu 		regmap_update_bits(afe->regmap,
817607ac485SJiaxin Yu 				   AFE_SIDETONE_GAIN,
818607ac485SJiaxin Yu 				   SIDE_TONE_GAIN_MASK_SFT,
819607ac485SJiaxin Yu 				   0);
820607ac485SJiaxin Yu 		regmap_update_bits(afe->regmap,
821607ac485SJiaxin Yu 				   AFE_SIDETONE_GAIN,
822607ac485SJiaxin Yu 				   POSITIVE_GAIN_MASK_SFT,
823607ac485SJiaxin Yu 				   0);
824607ac485SJiaxin Yu 		break;
825607ac485SJiaxin Yu 	default:
826607ac485SJiaxin Yu 		break;
827607ac485SJiaxin Yu 	}
828607ac485SJiaxin Yu 
829607ac485SJiaxin Yu 	return 0;
830607ac485SJiaxin Yu }
831607ac485SJiaxin Yu 
832607ac485SJiaxin Yu /* stf mux */
833607ac485SJiaxin Yu enum {
834607ac485SJiaxin Yu 	STF_SRC_ADDA_ADDA6 = 0,
835607ac485SJiaxin Yu 	STF_SRC_O19O20,
836607ac485SJiaxin Yu };
837607ac485SJiaxin Yu 
838607ac485SJiaxin Yu static const char *const stf_o19o20_mux_map[] = {
839607ac485SJiaxin Yu 	"ADDA_ADDA6",
840607ac485SJiaxin Yu 	"O19O20",
841607ac485SJiaxin Yu };
842607ac485SJiaxin Yu 
843607ac485SJiaxin Yu static int stf_o19o20_mux_map_value[] = {
844607ac485SJiaxin Yu 	STF_SRC_ADDA_ADDA6,
845607ac485SJiaxin Yu 	STF_SRC_O19O20,
846607ac485SJiaxin Yu };
847607ac485SJiaxin Yu 
848607ac485SJiaxin Yu static SOC_VALUE_ENUM_SINGLE_DECL(stf_o19o20_mux_map_enum,
849607ac485SJiaxin Yu 				  AFE_SIDETONE_CON1,
850607ac485SJiaxin Yu 				  STF_SOURCE_FROM_O19O20_SFT,
851607ac485SJiaxin Yu 				  STF_SOURCE_FROM_O19O20_MASK,
852607ac485SJiaxin Yu 				  stf_o19o20_mux_map,
853607ac485SJiaxin Yu 				  stf_o19o20_mux_map_value);
854607ac485SJiaxin Yu 
855607ac485SJiaxin Yu static const struct snd_kcontrol_new stf_o19O20_mux_control =
856607ac485SJiaxin Yu 	SOC_DAPM_ENUM("STF_O19O20_MUX", stf_o19o20_mux_map_enum);
857607ac485SJiaxin Yu 
858607ac485SJiaxin Yu enum {
859607ac485SJiaxin Yu 	STF_SRC_ADDA = 0,
860607ac485SJiaxin Yu 	STF_SRC_ADDA6,
861607ac485SJiaxin Yu };
862607ac485SJiaxin Yu 
863607ac485SJiaxin Yu static const char *const stf_adda_mux_map[] = {
864607ac485SJiaxin Yu 	"ADDA",
865607ac485SJiaxin Yu 	"ADDA6",
866607ac485SJiaxin Yu };
867607ac485SJiaxin Yu 
868607ac485SJiaxin Yu static int stf_adda_mux_map_value[] = {
869607ac485SJiaxin Yu 	STF_SRC_ADDA,
870607ac485SJiaxin Yu 	STF_SRC_ADDA6,
871607ac485SJiaxin Yu };
872607ac485SJiaxin Yu 
873607ac485SJiaxin Yu static SOC_VALUE_ENUM_SINGLE_DECL(stf_adda_mux_map_enum,
874607ac485SJiaxin Yu 				  AFE_SIDETONE_CON1,
875607ac485SJiaxin Yu 				  STF_O19O20_OUT_EN_SEL_SFT,
876607ac485SJiaxin Yu 				  STF_O19O20_OUT_EN_SEL_MASK,
877607ac485SJiaxin Yu 				  stf_adda_mux_map,
878607ac485SJiaxin Yu 				  stf_adda_mux_map_value);
879607ac485SJiaxin Yu 
880607ac485SJiaxin Yu static const struct snd_kcontrol_new stf_adda_mux_control =
881607ac485SJiaxin Yu 	SOC_DAPM_ENUM("STF_ADDA_MUX", stf_adda_mux_map_enum);
882607ac485SJiaxin Yu 
883607ac485SJiaxin Yu /* ADDA UL MUX */
884607ac485SJiaxin Yu enum {
885607ac485SJiaxin Yu 	ADDA_UL_MUX_MTKAIF = 0,
886607ac485SJiaxin Yu 	ADDA_UL_MUX_AP_DMIC,
887607ac485SJiaxin Yu 	ADDA_UL_MUX_MASK = 0x1,
888607ac485SJiaxin Yu };
889607ac485SJiaxin Yu 
890607ac485SJiaxin Yu static const char * const adda_ul_mux_map[] = {
891607ac485SJiaxin Yu 	"MTKAIF", "AP_DMIC"
892607ac485SJiaxin Yu };
893607ac485SJiaxin Yu 
894607ac485SJiaxin Yu static int adda_ul_map_value[] = {
895607ac485SJiaxin Yu 	ADDA_UL_MUX_MTKAIF,
896607ac485SJiaxin Yu 	ADDA_UL_MUX_AP_DMIC,
897607ac485SJiaxin Yu };
898607ac485SJiaxin Yu 
899607ac485SJiaxin Yu static SOC_VALUE_ENUM_SINGLE_DECL(adda_ul_mux_map_enum,
900607ac485SJiaxin Yu 				  SND_SOC_NOPM,
901607ac485SJiaxin Yu 				  0,
902607ac485SJiaxin Yu 				  ADDA_UL_MUX_MASK,
903607ac485SJiaxin Yu 				  adda_ul_mux_map,
904607ac485SJiaxin Yu 				  adda_ul_map_value);
905607ac485SJiaxin Yu 
906607ac485SJiaxin Yu static const struct snd_kcontrol_new adda_ul_mux_control =
907607ac485SJiaxin Yu 	SOC_DAPM_ENUM("ADDA_UL_MUX Select", adda_ul_mux_map_enum);
908607ac485SJiaxin Yu 
909607ac485SJiaxin Yu static const struct snd_kcontrol_new adda_ch34_ul_mux_control =
910607ac485SJiaxin Yu 	SOC_DAPM_ENUM("ADDA_CH34_UL_MUX Select", adda_ul_mux_map_enum);
911607ac485SJiaxin Yu 
912607ac485SJiaxin Yu static const struct snd_soc_dapm_widget mtk_dai_adda_widgets[] = {
913607ac485SJiaxin Yu 	/* inter-connections */
914607ac485SJiaxin Yu 	SND_SOC_DAPM_MIXER("ADDA_DL_CH1", SND_SOC_NOPM, 0, 0,
915607ac485SJiaxin Yu 			   mtk_adda_dl_ch1_mix,
916607ac485SJiaxin Yu 			   ARRAY_SIZE(mtk_adda_dl_ch1_mix)),
917607ac485SJiaxin Yu 	SND_SOC_DAPM_MIXER("ADDA_DL_CH2", SND_SOC_NOPM, 0, 0,
918607ac485SJiaxin Yu 			   mtk_adda_dl_ch2_mix,
919607ac485SJiaxin Yu 			   ARRAY_SIZE(mtk_adda_dl_ch2_mix)),
920607ac485SJiaxin Yu 
921607ac485SJiaxin Yu 	SND_SOC_DAPM_MIXER("ADDA_DL_CH3", SND_SOC_NOPM, 0, 0,
922607ac485SJiaxin Yu 			   mtk_adda_dl_ch3_mix,
923607ac485SJiaxin Yu 			   ARRAY_SIZE(mtk_adda_dl_ch3_mix)),
924607ac485SJiaxin Yu 	SND_SOC_DAPM_MIXER("ADDA_DL_CH4", SND_SOC_NOPM, 0, 0,
925607ac485SJiaxin Yu 			   mtk_adda_dl_ch4_mix,
926607ac485SJiaxin Yu 			   ARRAY_SIZE(mtk_adda_dl_ch4_mix)),
927607ac485SJiaxin Yu 
928607ac485SJiaxin Yu 	SND_SOC_DAPM_SUPPLY_S("ADDA Enable", SUPPLY_SEQ_ADDA_AFE_ON,
929607ac485SJiaxin Yu 			      AFE_ADDA_UL_DL_CON0, ADDA_AFE_ON_SFT, 0,
930607ac485SJiaxin Yu 			      NULL, 0),
931607ac485SJiaxin Yu 
932607ac485SJiaxin Yu 	SND_SOC_DAPM_SUPPLY_S("ADDA Playback Enable", SUPPLY_SEQ_ADDA_DL_ON,
933607ac485SJiaxin Yu 			      AFE_ADDA_DL_SRC2_CON0,
934607ac485SJiaxin Yu 			      DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0,
935607ac485SJiaxin Yu 			      mtk_adda_dl_event,
936607ac485SJiaxin Yu 			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
937607ac485SJiaxin Yu 	SND_SOC_DAPM_SUPPLY_S("ADDA CH34 Playback Enable",
938607ac485SJiaxin Yu 			      SUPPLY_SEQ_ADDA_DL_ON,
939607ac485SJiaxin Yu 			      AFE_ADDA_3RD_DAC_DL_SRC2_CON0,
940607ac485SJiaxin Yu 			      DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0,
941607ac485SJiaxin Yu 			      mtk_adda_ch34_dl_event,
942607ac485SJiaxin Yu 			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
943607ac485SJiaxin Yu 
944607ac485SJiaxin Yu 	SND_SOC_DAPM_SUPPLY_S("ADDA Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,
945607ac485SJiaxin Yu 			      AFE_ADDA_UL_SRC_CON0,
946607ac485SJiaxin Yu 			      UL_SRC_ON_TMP_CTL_SFT, 0,
947607ac485SJiaxin Yu 			      mtk_adda_ul_event,
948607ac485SJiaxin Yu 			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
949607ac485SJiaxin Yu 	SND_SOC_DAPM_SUPPLY_S("ADDA CH34 Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,
950607ac485SJiaxin Yu 			      AFE_ADDA6_UL_SRC_CON0,
951607ac485SJiaxin Yu 			      UL_SRC_ON_TMP_CTL_SFT, 0,
952607ac485SJiaxin Yu 			      mtk_adda_ch34_ul_event,
953607ac485SJiaxin Yu 			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
954607ac485SJiaxin Yu 
955607ac485SJiaxin Yu 	SND_SOC_DAPM_SUPPLY_S("AUD_PAD_TOP", SUPPLY_SEQ_ADDA_AUD_PAD_TOP,
956607ac485SJiaxin Yu 			      AFE_AUD_PAD_TOP,
957607ac485SJiaxin Yu 			      RG_RX_FIFO_ON_SFT, 0,
958607ac485SJiaxin Yu 			      mtk_adda_pad_top_event,
959607ac485SJiaxin Yu 			      SND_SOC_DAPM_PRE_PMU),
960607ac485SJiaxin Yu 	SND_SOC_DAPM_SUPPLY_S("ADDA_MTKAIF_CFG", SUPPLY_SEQ_ADDA_MTKAIF_CFG,
961607ac485SJiaxin Yu 			      SND_SOC_NOPM, 0, 0,
962607ac485SJiaxin Yu 			      mtk_adda_mtkaif_cfg_event,
963607ac485SJiaxin Yu 			      SND_SOC_DAPM_PRE_PMU),
964607ac485SJiaxin Yu 	SND_SOC_DAPM_SUPPLY_S("ADDA6_MTKAIF_CFG", SUPPLY_SEQ_ADDA6_MTKAIF_CFG,
965607ac485SJiaxin Yu 			      SND_SOC_NOPM, 0, 0,
966607ac485SJiaxin Yu 			      mtk_adda_mtkaif_cfg_event,
967607ac485SJiaxin Yu 			      SND_SOC_DAPM_PRE_PMU),
968607ac485SJiaxin Yu 
969607ac485SJiaxin Yu 	SND_SOC_DAPM_SUPPLY_S("AP_DMIC_EN", SUPPLY_SEQ_ADDA_AP_DMIC,
970607ac485SJiaxin Yu 			      AFE_ADDA_UL_SRC_CON0,
971607ac485SJiaxin Yu 			      UL_AP_DMIC_ON_SFT, 0,
972607ac485SJiaxin Yu 			      NULL, 0),
973607ac485SJiaxin Yu 	SND_SOC_DAPM_SUPPLY_S("AP_DMIC_CH34_EN", SUPPLY_SEQ_ADDA_AP_DMIC,
974607ac485SJiaxin Yu 			      AFE_ADDA6_UL_SRC_CON0,
975607ac485SJiaxin Yu 			      UL_AP_DMIC_ON_SFT, 0,
976607ac485SJiaxin Yu 			      NULL, 0),
977607ac485SJiaxin Yu 
978607ac485SJiaxin Yu 	SND_SOC_DAPM_SUPPLY_S("ADDA_FIFO", SUPPLY_SEQ_ADDA_FIFO,
979607ac485SJiaxin Yu 			      AFE_ADDA_UL_DL_CON0,
980607ac485SJiaxin Yu 			      AFE_ADDA_FIFO_AUTO_RST_SFT, 1,
981607ac485SJiaxin Yu 			      NULL, 0),
982607ac485SJiaxin Yu 	SND_SOC_DAPM_SUPPLY_S("ADDA_CH34_FIFO", SUPPLY_SEQ_ADDA_FIFO,
983607ac485SJiaxin Yu 			      AFE_ADDA_UL_DL_CON0,
984607ac485SJiaxin Yu 			      AFE_ADDA6_FIFO_AUTO_RST_SFT, 1,
985607ac485SJiaxin Yu 			      NULL, 0),
986607ac485SJiaxin Yu 
987607ac485SJiaxin Yu 	SND_SOC_DAPM_MUX("ADDA_UL_Mux", SND_SOC_NOPM, 0, 0,
988607ac485SJiaxin Yu 			 &adda_ul_mux_control),
989607ac485SJiaxin Yu 	SND_SOC_DAPM_MUX("ADDA_CH34_UL_Mux", SND_SOC_NOPM, 0, 0,
990607ac485SJiaxin Yu 			 &adda_ch34_ul_mux_control),
991607ac485SJiaxin Yu 
992607ac485SJiaxin Yu 	SND_SOC_DAPM_INPUT("AP_DMIC_INPUT"),
993607ac485SJiaxin Yu 	SND_SOC_DAPM_INPUT("AP_DMIC_CH34_INPUT"),
994607ac485SJiaxin Yu 
995607ac485SJiaxin Yu 	/* stf */
996607ac485SJiaxin Yu 	SND_SOC_DAPM_SWITCH_E("Sidetone Filter",
997607ac485SJiaxin Yu 			      AFE_SIDETONE_CON1, SIDE_TONE_ON_SFT, 0,
998607ac485SJiaxin Yu 			      &stf_ctl,
999607ac485SJiaxin Yu 			      mtk_stf_event,
1000607ac485SJiaxin Yu 			      SND_SOC_DAPM_PRE_PMU |
1001607ac485SJiaxin Yu 			      SND_SOC_DAPM_POST_PMD),
1002607ac485SJiaxin Yu 	SND_SOC_DAPM_MUX("STF_O19O20_MUX", SND_SOC_NOPM, 0, 0,
1003607ac485SJiaxin Yu 			 &stf_o19O20_mux_control),
1004607ac485SJiaxin Yu 	SND_SOC_DAPM_MUX("STF_ADDA_MUX", SND_SOC_NOPM, 0, 0,
1005607ac485SJiaxin Yu 			 &stf_adda_mux_control),
1006607ac485SJiaxin Yu 	SND_SOC_DAPM_MIXER("STF_CH1", SND_SOC_NOPM, 0, 0,
1007607ac485SJiaxin Yu 			   mtk_stf_ch1_mix,
1008607ac485SJiaxin Yu 			   ARRAY_SIZE(mtk_stf_ch1_mix)),
1009607ac485SJiaxin Yu 	SND_SOC_DAPM_MIXER("STF_CH2", SND_SOC_NOPM, 0, 0,
1010607ac485SJiaxin Yu 			   mtk_stf_ch2_mix,
1011607ac485SJiaxin Yu 			   ARRAY_SIZE(mtk_stf_ch2_mix)),
1012607ac485SJiaxin Yu 	SND_SOC_DAPM_OUTPUT("STF_OUTPUT"),
1013607ac485SJiaxin Yu 
1014607ac485SJiaxin Yu 	/* clock */
1015607ac485SJiaxin Yu 	SND_SOC_DAPM_CLOCK_SUPPLY("top_mux_audio_h"),
1016607ac485SJiaxin Yu 
1017607ac485SJiaxin Yu 	SND_SOC_DAPM_CLOCK_SUPPLY("aud_dac_clk"),
1018607ac485SJiaxin Yu 	SND_SOC_DAPM_CLOCK_SUPPLY("aud_dac_predis_clk"),
1019607ac485SJiaxin Yu 	SND_SOC_DAPM_CLOCK_SUPPLY("aud_3rd_dac_clk"),
1020607ac485SJiaxin Yu 	SND_SOC_DAPM_CLOCK_SUPPLY("aud_3rd_dac_predis_clk"),
1021607ac485SJiaxin Yu 
1022607ac485SJiaxin Yu 	SND_SOC_DAPM_CLOCK_SUPPLY("aud_adc_clk"),
1023607ac485SJiaxin Yu 	SND_SOC_DAPM_CLOCK_SUPPLY("aud_adda6_adc_clk"),
1024607ac485SJiaxin Yu };
1025607ac485SJiaxin Yu 
1026607ac485SJiaxin Yu static const struct snd_soc_dapm_route mtk_dai_adda_routes[] = {
1027607ac485SJiaxin Yu 	/* playback */
1028607ac485SJiaxin Yu 	{"ADDA_DL_CH1", "DL1_CH1", "DL1"},
1029607ac485SJiaxin Yu 	{"ADDA_DL_CH2", "DL1_CH1", "DL1"},
1030607ac485SJiaxin Yu 	{"ADDA_DL_CH2", "DL1_CH2", "DL1"},
1031607ac485SJiaxin Yu 
1032607ac485SJiaxin Yu 	{"ADDA_DL_CH1", "DL12_CH1", "DL12"},
1033607ac485SJiaxin Yu 	{"ADDA_DL_CH2", "DL12_CH2", "DL12"},
1034607ac485SJiaxin Yu 
1035607ac485SJiaxin Yu 	{"ADDA_DL_CH1", "DL6_CH1", "DL6"},
1036607ac485SJiaxin Yu 	{"ADDA_DL_CH2", "DL6_CH2", "DL6"},
1037607ac485SJiaxin Yu 
1038607ac485SJiaxin Yu 	{"ADDA_DL_CH1", "DL8_CH1", "DL8"},
1039607ac485SJiaxin Yu 	{"ADDA_DL_CH2", "DL8_CH2", "DL8"},
1040607ac485SJiaxin Yu 
1041607ac485SJiaxin Yu 	{"ADDA_DL_CH1", "DL2_CH1", "DL2"},
1042607ac485SJiaxin Yu 	{"ADDA_DL_CH2", "DL2_CH1", "DL2"},
1043607ac485SJiaxin Yu 	{"ADDA_DL_CH2", "DL2_CH2", "DL2"},
1044607ac485SJiaxin Yu 
1045607ac485SJiaxin Yu 	{"ADDA_DL_CH1", "DL3_CH1", "DL3"},
1046607ac485SJiaxin Yu 	{"ADDA_DL_CH2", "DL3_CH1", "DL3"},
1047607ac485SJiaxin Yu 	{"ADDA_DL_CH2", "DL3_CH2", "DL3"},
1048607ac485SJiaxin Yu 
1049607ac485SJiaxin Yu 	{"ADDA_DL_CH1", "DL4_CH1", "DL4"},
1050607ac485SJiaxin Yu 	{"ADDA_DL_CH2", "DL4_CH2", "DL4"},
1051607ac485SJiaxin Yu 
1052607ac485SJiaxin Yu 	{"ADDA_DL_CH1", "DL5_CH1", "DL5"},
1053607ac485SJiaxin Yu 	{"ADDA_DL_CH2", "DL5_CH2", "DL5"},
1054607ac485SJiaxin Yu 
1055607ac485SJiaxin Yu 	{"ADDA Playback", NULL, "ADDA_DL_CH1"},
1056607ac485SJiaxin Yu 	{"ADDA Playback", NULL, "ADDA_DL_CH2"},
1057607ac485SJiaxin Yu 
1058607ac485SJiaxin Yu 	{"ADDA Playback", NULL, "ADDA Enable"},
1059607ac485SJiaxin Yu 	{"ADDA Playback", NULL, "ADDA Playback Enable"},
1060607ac485SJiaxin Yu 
1061607ac485SJiaxin Yu 	{"ADDA_DL_CH3", "DL1_CH1", "DL1"},
1062607ac485SJiaxin Yu 	{"ADDA_DL_CH4", "DL1_CH1", "DL1"},
1063607ac485SJiaxin Yu 	{"ADDA_DL_CH4", "DL1_CH2", "DL1"},
1064607ac485SJiaxin Yu 
1065607ac485SJiaxin Yu 	{"ADDA_DL_CH3", "DL12_CH1", "DL12"},
1066607ac485SJiaxin Yu 	{"ADDA_DL_CH4", "DL12_CH2", "DL12"},
1067607ac485SJiaxin Yu 
1068607ac485SJiaxin Yu 	{"ADDA_DL_CH3", "DL6_CH1", "DL6"},
1069607ac485SJiaxin Yu 	{"ADDA_DL_CH4", "DL6_CH2", "DL6"},
1070607ac485SJiaxin Yu 
1071607ac485SJiaxin Yu 	{"ADDA_DL_CH3", "DL2_CH1", "DL2"},
1072607ac485SJiaxin Yu 	{"ADDA_DL_CH4", "DL2_CH1", "DL2"},
1073607ac485SJiaxin Yu 	{"ADDA_DL_CH4", "DL2_CH2", "DL2"},
1074607ac485SJiaxin Yu 
1075607ac485SJiaxin Yu 	{"ADDA_DL_CH3", "DL3_CH1", "DL3"},
1076607ac485SJiaxin Yu 	{"ADDA_DL_CH4", "DL3_CH1", "DL3"},
1077607ac485SJiaxin Yu 	{"ADDA_DL_CH4", "DL3_CH2", "DL3"},
1078607ac485SJiaxin Yu 
1079607ac485SJiaxin Yu 	{"ADDA_DL_CH3", "DL4_CH1", "DL4"},
1080607ac485SJiaxin Yu 	{"ADDA_DL_CH4", "DL4_CH2", "DL4"},
1081607ac485SJiaxin Yu 
1082607ac485SJiaxin Yu 	{"ADDA_DL_CH3", "DL5_CH1", "DL5"},
1083607ac485SJiaxin Yu 	{"ADDA_DL_CH4", "DL5_CH2", "DL5"},
1084607ac485SJiaxin Yu 
1085607ac485SJiaxin Yu 	{"ADDA CH34 Playback", NULL, "ADDA_DL_CH3"},
1086607ac485SJiaxin Yu 	{"ADDA CH34 Playback", NULL, "ADDA_DL_CH4"},
1087607ac485SJiaxin Yu 
1088607ac485SJiaxin Yu 	{"ADDA CH34 Playback", NULL, "ADDA Enable"},
1089607ac485SJiaxin Yu 	{"ADDA CH34 Playback", NULL, "ADDA CH34 Playback Enable"},
1090607ac485SJiaxin Yu 
1091607ac485SJiaxin Yu 	/* capture */
1092607ac485SJiaxin Yu 	{"ADDA_UL_Mux", "MTKAIF", "ADDA Capture"},
1093607ac485SJiaxin Yu 	{"ADDA_UL_Mux", "AP_DMIC", "AP DMIC Capture"},
1094607ac485SJiaxin Yu 
1095607ac485SJiaxin Yu 	{"ADDA_CH34_UL_Mux", "MTKAIF", "ADDA CH34 Capture"},
1096607ac485SJiaxin Yu 	{"ADDA_CH34_UL_Mux", "AP_DMIC", "AP DMIC CH34 Capture"},
1097607ac485SJiaxin Yu 
1098607ac485SJiaxin Yu 	{"ADDA Capture", NULL, "ADDA Enable"},
1099607ac485SJiaxin Yu 	{"ADDA Capture", NULL, "ADDA Capture Enable"},
1100607ac485SJiaxin Yu 	{"ADDA Capture", NULL, "AUD_PAD_TOP"},
1101607ac485SJiaxin Yu 	{"ADDA Capture", NULL, "ADDA_MTKAIF_CFG"},
1102607ac485SJiaxin Yu 
1103607ac485SJiaxin Yu 	{"AP DMIC Capture", NULL, "ADDA Enable"},
1104607ac485SJiaxin Yu 	{"AP DMIC Capture", NULL, "ADDA Capture Enable"},
1105607ac485SJiaxin Yu 	{"AP DMIC Capture", NULL, "ADDA_FIFO"},
1106607ac485SJiaxin Yu 	{"AP DMIC Capture", NULL, "AP_DMIC_EN"},
1107607ac485SJiaxin Yu 
1108607ac485SJiaxin Yu 	{"ADDA CH34 Capture", NULL, "ADDA Enable"},
1109607ac485SJiaxin Yu 	{"ADDA CH34 Capture", NULL, "ADDA CH34 Capture Enable"},
1110607ac485SJiaxin Yu 	{"ADDA CH34 Capture", NULL, "AUD_PAD_TOP"},
1111607ac485SJiaxin Yu 	{"ADDA CH34 Capture", NULL, "ADDA6_MTKAIF_CFG"},
1112607ac485SJiaxin Yu 
1113607ac485SJiaxin Yu 	{"AP DMIC CH34 Capture", NULL, "ADDA Enable"},
1114607ac485SJiaxin Yu 	{"AP DMIC CH34 Capture", NULL, "ADDA CH34 Capture Enable"},
1115607ac485SJiaxin Yu 	{"AP DMIC CH34 Capture", NULL, "ADDA_CH34_FIFO"},
1116607ac485SJiaxin Yu 	{"AP DMIC CH34 Capture", NULL, "AP_DMIC_CH34_EN"},
1117607ac485SJiaxin Yu 
1118607ac485SJiaxin Yu 	{"AP DMIC Capture", NULL, "AP_DMIC_INPUT"},
1119607ac485SJiaxin Yu 	{"AP DMIC CH34 Capture", NULL, "AP_DMIC_CH34_INPUT"},
1120607ac485SJiaxin Yu 
1121607ac485SJiaxin Yu 	/* sidetone filter */
1122607ac485SJiaxin Yu 	{"STF_ADDA_MUX", "ADDA", "ADDA_UL_Mux"},
1123607ac485SJiaxin Yu 	{"STF_ADDA_MUX", "ADDA6", "ADDA_CH34_UL_Mux"},
1124607ac485SJiaxin Yu 
1125607ac485SJiaxin Yu 	{"STF_O19O20_MUX", "ADDA_ADDA6", "STF_ADDA_MUX"},
1126607ac485SJiaxin Yu 	{"STF_O19O20_MUX", "O19O20", "STF_CH1"},
1127607ac485SJiaxin Yu 	{"STF_O19O20_MUX", "O19O20", "STF_CH2"},
1128607ac485SJiaxin Yu 
1129607ac485SJiaxin Yu 	{"Sidetone Filter", "Switch", "STF_O19O20_MUX"},
1130607ac485SJiaxin Yu 	{"STF_OUTPUT", NULL, "Sidetone Filter"},
1131607ac485SJiaxin Yu 	{"ADDA Playback", NULL, "Sidetone Filter"},
1132607ac485SJiaxin Yu 	{"ADDA CH34 Playback", NULL, "Sidetone Filter"},
1133607ac485SJiaxin Yu 
1134607ac485SJiaxin Yu 	/* clk */
1135607ac485SJiaxin Yu 	{"ADDA Playback", NULL, "aud_dac_clk"},
1136607ac485SJiaxin Yu 	{"ADDA Playback", NULL, "aud_dac_predis_clk"},
1137607ac485SJiaxin Yu 
1138607ac485SJiaxin Yu 	{"ADDA CH34 Playback", NULL, "aud_3rd_dac_clk"},
1139607ac485SJiaxin Yu 	{"ADDA CH34 Playback", NULL, "aud_3rd_dac_predis_clk"},
1140607ac485SJiaxin Yu 
1141607ac485SJiaxin Yu 	{"ADDA Capture Enable", NULL, "aud_adc_clk"},
1142607ac485SJiaxin Yu 	{"ADDA CH34 Capture Enable", NULL, "aud_adda6_adc_clk"},
1143607ac485SJiaxin Yu };
1144607ac485SJiaxin Yu 
1145607ac485SJiaxin Yu /* dai ops */
mtk_dai_adda_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params,struct snd_soc_dai * dai)1146607ac485SJiaxin Yu static int mtk_dai_adda_hw_params(struct snd_pcm_substream *substream,
1147607ac485SJiaxin Yu 				  struct snd_pcm_hw_params *params,
1148607ac485SJiaxin Yu 				  struct snd_soc_dai *dai)
1149607ac485SJiaxin Yu {
1150607ac485SJiaxin Yu 	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
1151607ac485SJiaxin Yu 	unsigned int rate = params_rate(params);
1152607ac485SJiaxin Yu 	int id = dai->id;
1153607ac485SJiaxin Yu 
1154607ac485SJiaxin Yu 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1155607ac485SJiaxin Yu 		unsigned int dl_src2_con0 = 0;
1156607ac485SJiaxin Yu 		unsigned int dl_src2_con1 = 0;
1157607ac485SJiaxin Yu 
1158607ac485SJiaxin Yu 		/* set sampling rate */
1159607ac485SJiaxin Yu 		dl_src2_con0 = adda_dl_rate_transform(afe, rate) <<
1160607ac485SJiaxin Yu 			       DL_2_INPUT_MODE_CTL_SFT;
1161607ac485SJiaxin Yu 
1162607ac485SJiaxin Yu 		/* set output mode, UP_SAMPLING_RATE_X8 */
1163607ac485SJiaxin Yu 		dl_src2_con0 |= (0x3 << DL_2_OUTPUT_SEL_CTL_SFT);
1164607ac485SJiaxin Yu 
1165607ac485SJiaxin Yu 		/* turn off mute function */
1166607ac485SJiaxin Yu 		dl_src2_con0 |= (0x01 << DL_2_MUTE_CH2_OFF_CTL_PRE_SFT);
1167607ac485SJiaxin Yu 		dl_src2_con0 |= (0x01 << DL_2_MUTE_CH1_OFF_CTL_PRE_SFT);
1168607ac485SJiaxin Yu 
1169607ac485SJiaxin Yu 		/* set voice input data if input sample rate is 8k or 16k */
1170607ac485SJiaxin Yu 		if (rate == 8000 || rate == 16000)
1171607ac485SJiaxin Yu 			dl_src2_con0 |= 0x01 << DL_2_VOICE_MODE_CTL_PRE_SFT;
1172607ac485SJiaxin Yu 
1173607ac485SJiaxin Yu 		/* SA suggest apply -0.3db to audio/speech path */
1174607ac485SJiaxin Yu 		dl_src2_con1 = MTK_AFE_ADDA_DL_GAIN_NORMAL <<
1175607ac485SJiaxin Yu 			       DL_2_GAIN_CTL_PRE_SFT;
1176607ac485SJiaxin Yu 
1177607ac485SJiaxin Yu 		/* turn on down-link gain */
1178607ac485SJiaxin Yu 		dl_src2_con0 |= (0x01 << DL_2_GAIN_ON_CTL_PRE_SFT);
1179607ac485SJiaxin Yu 
1180607ac485SJiaxin Yu 		if (id == MT8192_DAI_ADDA) {
1181607ac485SJiaxin Yu 			/* clean predistortion */
1182607ac485SJiaxin Yu 			regmap_write(afe->regmap, AFE_ADDA_PREDIS_CON0, 0);
1183607ac485SJiaxin Yu 			regmap_write(afe->regmap, AFE_ADDA_PREDIS_CON1, 0);
1184607ac485SJiaxin Yu 
1185607ac485SJiaxin Yu 			regmap_write(afe->regmap,
1186607ac485SJiaxin Yu 				     AFE_ADDA_DL_SRC2_CON0, dl_src2_con0);
1187607ac485SJiaxin Yu 			regmap_write(afe->regmap,
1188607ac485SJiaxin Yu 				     AFE_ADDA_DL_SRC2_CON1, dl_src2_con1);
1189607ac485SJiaxin Yu 
1190607ac485SJiaxin Yu 			/* set sdm gain */
1191607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap,
1192607ac485SJiaxin Yu 					   AFE_ADDA_DL_SDM_DCCOMP_CON,
1193607ac485SJiaxin Yu 					   ATTGAIN_CTL_MASK_SFT,
1194607ac485SJiaxin Yu 					   AUDIO_SDM_LEVEL_NORMAL <<
1195607ac485SJiaxin Yu 					   ATTGAIN_CTL_SFT);
1196607ac485SJiaxin Yu 
1197607ac485SJiaxin Yu 			/* 2nd sdm */
1198607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap,
1199607ac485SJiaxin Yu 					   AFE_ADDA_DL_SDM_DCCOMP_CON,
1200607ac485SJiaxin Yu 					   USE_3RD_SDM_MASK_SFT,
1201607ac485SJiaxin Yu 					   AUDIO_SDM_2ND << USE_3RD_SDM_SFT);
1202607ac485SJiaxin Yu 
1203607ac485SJiaxin Yu 			/* sdm auto reset */
1204607ac485SJiaxin Yu 			regmap_write(afe->regmap,
1205607ac485SJiaxin Yu 				     AFE_ADDA_DL_SDM_AUTO_RESET_CON,
1206607ac485SJiaxin Yu 				     SDM_AUTO_RESET_THRESHOLD);
1207607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap,
1208607ac485SJiaxin Yu 					   AFE_ADDA_DL_SDM_AUTO_RESET_CON,
1209607ac485SJiaxin Yu 					   ADDA_SDM_AUTO_RESET_ONOFF_MASK_SFT,
1210607ac485SJiaxin Yu 					   0x1 << ADDA_SDM_AUTO_RESET_ONOFF_SFT);
1211607ac485SJiaxin Yu 		} else {
1212607ac485SJiaxin Yu 			/* clean predistortion */
1213607ac485SJiaxin Yu 			regmap_write(afe->regmap,
1214607ac485SJiaxin Yu 				     AFE_ADDA_3RD_DAC_PREDIS_CON0, 0);
1215607ac485SJiaxin Yu 			regmap_write(afe->regmap,
1216607ac485SJiaxin Yu 				     AFE_ADDA_3RD_DAC_PREDIS_CON1, 0);
1217607ac485SJiaxin Yu 
1218607ac485SJiaxin Yu 			regmap_write(afe->regmap, AFE_ADDA_3RD_DAC_DL_SRC2_CON0,
1219607ac485SJiaxin Yu 				     dl_src2_con0);
1220607ac485SJiaxin Yu 			regmap_write(afe->regmap, AFE_ADDA_3RD_DAC_DL_SRC2_CON1,
1221607ac485SJiaxin Yu 				     dl_src2_con1);
1222607ac485SJiaxin Yu 
1223607ac485SJiaxin Yu 			/* set sdm gain */
1224607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap,
1225607ac485SJiaxin Yu 					   AFE_ADDA_3RD_DAC_DL_SDM_DCCOMP_CON,
1226607ac485SJiaxin Yu 					   ATTGAIN_CTL_MASK_SFT,
1227607ac485SJiaxin Yu 					   AUDIO_SDM_LEVEL_NORMAL <<
1228607ac485SJiaxin Yu 					   ATTGAIN_CTL_SFT);
1229607ac485SJiaxin Yu 
1230607ac485SJiaxin Yu 			/* 2nd sdm */
1231607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap,
1232607ac485SJiaxin Yu 					   AFE_ADDA_3RD_DAC_DL_SDM_DCCOMP_CON,
1233607ac485SJiaxin Yu 					   USE_3RD_SDM_MASK_SFT,
1234607ac485SJiaxin Yu 					   AUDIO_SDM_2ND << USE_3RD_SDM_SFT);
1235607ac485SJiaxin Yu 
1236607ac485SJiaxin Yu 			/* sdm auto reset */
1237607ac485SJiaxin Yu 			regmap_write(afe->regmap,
1238607ac485SJiaxin Yu 				     AFE_ADDA_3RD_DAC_DL_SDM_AUTO_RESET_CON,
1239607ac485SJiaxin Yu 				     SDM_AUTO_RESET_THRESHOLD);
1240607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap,
1241607ac485SJiaxin Yu 					   AFE_ADDA_3RD_DAC_DL_SDM_AUTO_RESET_CON,
1242607ac485SJiaxin Yu 					   ADDA_3RD_DAC_SDM_AUTO_RESET_ONOFF_MASK_SFT,
1243607ac485SJiaxin Yu 					   0x1 << ADDA_3RD_DAC_SDM_AUTO_RESET_ONOFF_SFT);
1244607ac485SJiaxin Yu 		}
1245607ac485SJiaxin Yu 	} else {
1246607ac485SJiaxin Yu 		unsigned int voice_mode = 0;
1247607ac485SJiaxin Yu 		unsigned int ul_src_con0 = 0;	/* default value */
1248607ac485SJiaxin Yu 
1249607ac485SJiaxin Yu 		voice_mode = adda_ul_rate_transform(afe, rate);
1250607ac485SJiaxin Yu 
1251607ac485SJiaxin Yu 		ul_src_con0 |= (voice_mode << 17) & (0x7 << 17);
1252607ac485SJiaxin Yu 
1253607ac485SJiaxin Yu 		/* enable iir */
1254607ac485SJiaxin Yu 		ul_src_con0 |= (1 << UL_IIR_ON_TMP_CTL_SFT) &
1255607ac485SJiaxin Yu 			       UL_IIR_ON_TMP_CTL_MASK_SFT;
1256607ac485SJiaxin Yu 		ul_src_con0 |= (UL_IIR_SW << UL_IIRMODE_CTL_SFT) &
1257607ac485SJiaxin Yu 			       UL_IIRMODE_CTL_MASK_SFT;
1258607ac485SJiaxin Yu 
1259607ac485SJiaxin Yu 		switch (id) {
1260607ac485SJiaxin Yu 		case MT8192_DAI_ADDA:
1261607ac485SJiaxin Yu 		case MT8192_DAI_AP_DMIC:
1262607ac485SJiaxin Yu 			/* 35Hz @ 48k */
1263607ac485SJiaxin Yu 			regmap_write(afe->regmap,
1264607ac485SJiaxin Yu 				     AFE_ADDA_IIR_COEF_02_01, 0x00000000);
1265607ac485SJiaxin Yu 			regmap_write(afe->regmap,
1266607ac485SJiaxin Yu 				     AFE_ADDA_IIR_COEF_04_03, 0x00003FB8);
1267607ac485SJiaxin Yu 			regmap_write(afe->regmap,
1268607ac485SJiaxin Yu 				     AFE_ADDA_IIR_COEF_06_05, 0x3FB80000);
1269607ac485SJiaxin Yu 			regmap_write(afe->regmap,
1270607ac485SJiaxin Yu 				     AFE_ADDA_IIR_COEF_08_07, 0x3FB80000);
1271607ac485SJiaxin Yu 			regmap_write(afe->regmap,
1272607ac485SJiaxin Yu 				     AFE_ADDA_IIR_COEF_10_09, 0x0000C048);
1273607ac485SJiaxin Yu 
1274607ac485SJiaxin Yu 			regmap_write(afe->regmap,
1275607ac485SJiaxin Yu 				     AFE_ADDA_UL_SRC_CON0, ul_src_con0);
1276607ac485SJiaxin Yu 
1277607ac485SJiaxin Yu 			/* Using Internal ADC */
1278607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap,
1279607ac485SJiaxin Yu 					   AFE_ADDA_TOP_CON0,
1280607ac485SJiaxin Yu 					   0x1 << 0,
1281607ac485SJiaxin Yu 					   0x0 << 0);
1282607ac485SJiaxin Yu 
1283607ac485SJiaxin Yu 			/* mtkaif_rxif_data_mode = 0, amic */
1284607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap,
1285607ac485SJiaxin Yu 					   AFE_ADDA_MTKAIF_RX_CFG0,
1286607ac485SJiaxin Yu 					   0x1 << 0,
1287607ac485SJiaxin Yu 					   0x0 << 0);
1288607ac485SJiaxin Yu 			break;
1289607ac485SJiaxin Yu 		case MT8192_DAI_ADDA_CH34:
1290607ac485SJiaxin Yu 		case MT8192_DAI_AP_DMIC_CH34:
1291607ac485SJiaxin Yu 			/* 35Hz @ 48k */
1292607ac485SJiaxin Yu 			regmap_write(afe->regmap,
1293607ac485SJiaxin Yu 				     AFE_ADDA6_IIR_COEF_02_01, 0x00000000);
1294607ac485SJiaxin Yu 			regmap_write(afe->regmap,
1295607ac485SJiaxin Yu 				     AFE_ADDA6_IIR_COEF_04_03, 0x00003FB8);
1296607ac485SJiaxin Yu 			regmap_write(afe->regmap,
1297607ac485SJiaxin Yu 				     AFE_ADDA6_IIR_COEF_06_05, 0x3FB80000);
1298607ac485SJiaxin Yu 			regmap_write(afe->regmap,
1299607ac485SJiaxin Yu 				     AFE_ADDA6_IIR_COEF_08_07, 0x3FB80000);
1300607ac485SJiaxin Yu 			regmap_write(afe->regmap,
1301607ac485SJiaxin Yu 				     AFE_ADDA6_IIR_COEF_10_09, 0x0000C048);
1302607ac485SJiaxin Yu 
1303607ac485SJiaxin Yu 			regmap_write(afe->regmap,
1304607ac485SJiaxin Yu 				     AFE_ADDA6_UL_SRC_CON0, ul_src_con0);
1305607ac485SJiaxin Yu 
1306607ac485SJiaxin Yu 			/* Using Internal ADC */
1307607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap,
1308607ac485SJiaxin Yu 					   AFE_ADDA6_TOP_CON0,
1309607ac485SJiaxin Yu 					   0x1 << 0,
1310607ac485SJiaxin Yu 					   0x0 << 0);
1311607ac485SJiaxin Yu 
1312607ac485SJiaxin Yu 			/* mtkaif_rxif_data_mode = 0, amic */
1313607ac485SJiaxin Yu 			regmap_update_bits(afe->regmap,
1314607ac485SJiaxin Yu 					   AFE_ADDA6_MTKAIF_RX_CFG0,
1315607ac485SJiaxin Yu 					   0x1 << 0,
1316607ac485SJiaxin Yu 					   0x0 << 0);
1317607ac485SJiaxin Yu 			break;
1318607ac485SJiaxin Yu 		default:
1319607ac485SJiaxin Yu 			break;
1320607ac485SJiaxin Yu 		}
1321607ac485SJiaxin Yu 
1322607ac485SJiaxin Yu 		/* ap dmic */
1323607ac485SJiaxin Yu 		switch (id) {
1324607ac485SJiaxin Yu 		case MT8192_DAI_AP_DMIC:
1325607ac485SJiaxin Yu 		case MT8192_DAI_AP_DMIC_CH34:
1326607ac485SJiaxin Yu 			mtk_adda_ul_src_dmic(afe, id);
1327607ac485SJiaxin Yu 			break;
1328607ac485SJiaxin Yu 		default:
1329607ac485SJiaxin Yu 			break;
1330607ac485SJiaxin Yu 		}
1331607ac485SJiaxin Yu 	}
1332607ac485SJiaxin Yu 
1333607ac485SJiaxin Yu 	return 0;
1334607ac485SJiaxin Yu }
1335607ac485SJiaxin Yu 
1336607ac485SJiaxin Yu static const struct snd_soc_dai_ops mtk_dai_adda_ops = {
1337607ac485SJiaxin Yu 	.hw_params = mtk_dai_adda_hw_params,
1338607ac485SJiaxin Yu };
1339607ac485SJiaxin Yu 
1340607ac485SJiaxin Yu /* dai driver */
1341607ac485SJiaxin Yu #define MTK_ADDA_PLAYBACK_RATES (SNDRV_PCM_RATE_8000_48000 |\
1342607ac485SJiaxin Yu 				 SNDRV_PCM_RATE_96000 |\
1343607ac485SJiaxin Yu 				 SNDRV_PCM_RATE_192000)
1344607ac485SJiaxin Yu 
1345607ac485SJiaxin Yu #define MTK_ADDA_CAPTURE_RATES (SNDRV_PCM_RATE_8000 |\
1346607ac485SJiaxin Yu 				SNDRV_PCM_RATE_16000 |\
1347607ac485SJiaxin Yu 				SNDRV_PCM_RATE_32000 |\
1348607ac485SJiaxin Yu 				SNDRV_PCM_RATE_48000 |\
1349607ac485SJiaxin Yu 				SNDRV_PCM_RATE_96000 |\
1350607ac485SJiaxin Yu 				SNDRV_PCM_RATE_192000)
1351607ac485SJiaxin Yu 
1352607ac485SJiaxin Yu #define MTK_ADDA_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
1353607ac485SJiaxin Yu 			  SNDRV_PCM_FMTBIT_S24_LE |\
1354607ac485SJiaxin Yu 			  SNDRV_PCM_FMTBIT_S32_LE)
1355607ac485SJiaxin Yu 
1356607ac485SJiaxin Yu static struct snd_soc_dai_driver mtk_dai_adda_driver[] = {
1357607ac485SJiaxin Yu 	{
1358607ac485SJiaxin Yu 		.name = "ADDA",
1359607ac485SJiaxin Yu 		.id = MT8192_DAI_ADDA,
1360607ac485SJiaxin Yu 		.playback = {
1361607ac485SJiaxin Yu 			.stream_name = "ADDA Playback",
1362607ac485SJiaxin Yu 			.channels_min = 1,
1363607ac485SJiaxin Yu 			.channels_max = 2,
1364607ac485SJiaxin Yu 			.rates = MTK_ADDA_PLAYBACK_RATES,
1365607ac485SJiaxin Yu 			.formats = MTK_ADDA_FORMATS,
1366607ac485SJiaxin Yu 		},
1367607ac485SJiaxin Yu 		.capture = {
1368607ac485SJiaxin Yu 			.stream_name = "ADDA Capture",
1369607ac485SJiaxin Yu 			.channels_min = 1,
1370607ac485SJiaxin Yu 			.channels_max = 2,
1371607ac485SJiaxin Yu 			.rates = MTK_ADDA_CAPTURE_RATES,
1372607ac485SJiaxin Yu 			.formats = MTK_ADDA_FORMATS,
1373607ac485SJiaxin Yu 		},
1374607ac485SJiaxin Yu 		.ops = &mtk_dai_adda_ops,
1375607ac485SJiaxin Yu 	},
1376607ac485SJiaxin Yu 	{
1377607ac485SJiaxin Yu 		.name = "ADDA_CH34",
1378607ac485SJiaxin Yu 		.id = MT8192_DAI_ADDA_CH34,
1379607ac485SJiaxin Yu 		.playback = {
1380607ac485SJiaxin Yu 			.stream_name = "ADDA CH34 Playback",
1381607ac485SJiaxin Yu 			.channels_min = 1,
1382607ac485SJiaxin Yu 			.channels_max = 2,
1383607ac485SJiaxin Yu 			.rates = MTK_ADDA_PLAYBACK_RATES,
1384607ac485SJiaxin Yu 			.formats = MTK_ADDA_FORMATS,
1385607ac485SJiaxin Yu 		},
1386607ac485SJiaxin Yu 		.capture = {
1387607ac485SJiaxin Yu 			.stream_name = "ADDA CH34 Capture",
1388607ac485SJiaxin Yu 			.channels_min = 1,
1389607ac485SJiaxin Yu 			.channels_max = 2,
1390607ac485SJiaxin Yu 			.rates = MTK_ADDA_CAPTURE_RATES,
1391607ac485SJiaxin Yu 			.formats = MTK_ADDA_FORMATS,
1392607ac485SJiaxin Yu 		},
1393607ac485SJiaxin Yu 		.ops = &mtk_dai_adda_ops,
1394607ac485SJiaxin Yu 	},
1395607ac485SJiaxin Yu 	{
1396607ac485SJiaxin Yu 		.name = "AP_DMIC",
1397607ac485SJiaxin Yu 		.id = MT8192_DAI_AP_DMIC,
1398607ac485SJiaxin Yu 		.capture = {
1399607ac485SJiaxin Yu 			.stream_name = "AP DMIC Capture",
1400607ac485SJiaxin Yu 			.channels_min = 1,
1401607ac485SJiaxin Yu 			.channels_max = 2,
1402607ac485SJiaxin Yu 			.rates = MTK_ADDA_CAPTURE_RATES,
1403607ac485SJiaxin Yu 			.formats = MTK_ADDA_FORMATS,
1404607ac485SJiaxin Yu 		},
1405607ac485SJiaxin Yu 		.ops = &mtk_dai_adda_ops,
1406607ac485SJiaxin Yu 	},
1407607ac485SJiaxin Yu 	{
1408607ac485SJiaxin Yu 		.name = "AP_DMIC_CH34",
1409607ac485SJiaxin Yu 		.id = MT8192_DAI_AP_DMIC_CH34,
1410607ac485SJiaxin Yu 		.capture = {
1411607ac485SJiaxin Yu 			.stream_name = "AP DMIC CH34 Capture",
1412607ac485SJiaxin Yu 			.channels_min = 1,
1413607ac485SJiaxin Yu 			.channels_max = 2,
1414607ac485SJiaxin Yu 			.rates = MTK_ADDA_CAPTURE_RATES,
1415607ac485SJiaxin Yu 			.formats = MTK_ADDA_FORMATS,
1416607ac485SJiaxin Yu 		},
1417607ac485SJiaxin Yu 		.ops = &mtk_dai_adda_ops,
1418607ac485SJiaxin Yu 	},
1419607ac485SJiaxin Yu };
1420607ac485SJiaxin Yu 
mt8192_dai_adda_register(struct mtk_base_afe * afe)1421607ac485SJiaxin Yu int mt8192_dai_adda_register(struct mtk_base_afe *afe)
1422607ac485SJiaxin Yu {
1423607ac485SJiaxin Yu 	struct mtk_base_afe_dai *dai;
1424607ac485SJiaxin Yu 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
1425607ac485SJiaxin Yu 
1426607ac485SJiaxin Yu 	dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
1427607ac485SJiaxin Yu 	if (!dai)
1428607ac485SJiaxin Yu 		return -ENOMEM;
1429607ac485SJiaxin Yu 
1430607ac485SJiaxin Yu 	list_add(&dai->list, &afe->sub_dais);
1431607ac485SJiaxin Yu 
1432607ac485SJiaxin Yu 	dai->dai_drivers = mtk_dai_adda_driver;
1433607ac485SJiaxin Yu 	dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_adda_driver);
1434607ac485SJiaxin Yu 
1435607ac485SJiaxin Yu 	dai->controls = mtk_adda_controls;
1436607ac485SJiaxin Yu 	dai->num_controls = ARRAY_SIZE(mtk_adda_controls);
1437607ac485SJiaxin Yu 	dai->dapm_widgets = mtk_dai_adda_widgets;
1438607ac485SJiaxin Yu 	dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_adda_widgets);
1439607ac485SJiaxin Yu 	dai->dapm_routes = mtk_dai_adda_routes;
1440607ac485SJiaxin Yu 	dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_adda_routes);
1441607ac485SJiaxin Yu 
1442607ac485SJiaxin Yu 	/* ap dmic priv share with adda */
1443607ac485SJiaxin Yu 	afe_priv->dai_priv[MT8192_DAI_AP_DMIC] =
1444607ac485SJiaxin Yu 		afe_priv->dai_priv[MT8192_DAI_ADDA];
1445607ac485SJiaxin Yu 	afe_priv->dai_priv[MT8192_DAI_AP_DMIC_CH34] =
1446607ac485SJiaxin Yu 		afe_priv->dai_priv[MT8192_DAI_ADDA_CH34];
1447607ac485SJiaxin Yu 
1448607ac485SJiaxin Yu 	return 0;
1449607ac485SJiaxin Yu }
1450