1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * MediaTek ALSA SoC Audio DAI ADDA Control
4 *
5 * Copyright (c) 2021 MediaTek Inc.
6 * Author: Bicycle Tsai <bicycle.tsai@mediatek.com>
7 * Trevor Wu <trevor.wu@mediatek.com>
8 */
9
10 #include <linux/delay.h>
11 #include <linux/regmap.h>
12 #include "mt8195-afe-clk.h"
13 #include "mt8195-afe-common.h"
14 #include "mt8195-reg.h"
15 #include "../common/mtk-dai-adda-common.h"
16
17 #define ADDA_DL_GAIN_LOOPBACK 0x1800
18 #define ADDA_HIRES_THRES 48000
19
20 enum {
21 SUPPLY_SEQ_CLOCK_SEL,
22 SUPPLY_SEQ_CLOCK_ON,
23 SUPPLY_SEQ_ADDA_DL_ON,
24 SUPPLY_SEQ_ADDA_MTKAIF_CFG,
25 SUPPLY_SEQ_ADDA_UL_ON,
26 SUPPLY_SEQ_ADDA_AFE_ON,
27 };
28
29 enum {
30 MTK_AFE_ADDA,
31 MTK_AFE_ADDA6,
32 };
33
34 struct mtk_dai_adda_priv {
35 bool hires_required;
36 };
37
mt8195_adda_mtkaif_init(struct mtk_base_afe * afe)38 static int mt8195_adda_mtkaif_init(struct mtk_base_afe *afe)
39 {
40 struct mt8195_afe_private *afe_priv = afe->platform_priv;
41 struct mtkaif_param *param = &afe_priv->mtkaif_params;
42 int delay_data;
43 int delay_cycle;
44 unsigned int mask = 0;
45 unsigned int val = 0;
46
47 /* set rx protocol 2 & mtkaif_rxif_clkinv_adc inverse */
48 mask = (MTKAIF_RXIF_CLKINV_ADC | MTKAIF_RXIF_PROTOCOL2);
49 val = (MTKAIF_RXIF_CLKINV_ADC | MTKAIF_RXIF_PROTOCOL2);
50
51 regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_CFG0, mask, val);
52 regmap_update_bits(afe->regmap, AFE_ADDA6_MTKAIF_CFG0, mask, val);
53
54 mask = RG_RX_PROTOCOL2;
55 val = RG_RX_PROTOCOL2;
56 regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, mask, val);
57
58 if (!param->mtkaif_calibration_ok) {
59 dev_info(afe->dev, "%s(), calibration fail\n", __func__);
60 return 0;
61 }
62
63 /* set delay for ch1, ch2 */
64 if (param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_0] >=
65 param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_1]) {
66 delay_data = DELAY_DATA_MISO1;
67 delay_cycle =
68 param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_0] -
69 param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_1];
70 } else {
71 delay_data = DELAY_DATA_MISO0;
72 delay_cycle =
73 param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_1] -
74 param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_0];
75 }
76
77 val = 0;
78 mask = (MTKAIF_RXIF_DELAY_DATA | MTKAIF_RXIF_DELAY_CYCLE_MASK);
79 val |= MTKAIF_RXIF_DELAY_CYCLE(delay_cycle) &
80 MTKAIF_RXIF_DELAY_CYCLE_MASK;
81 val |= delay_data << MTKAIF_RXIF_DELAY_DATA_SHIFT;
82 regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_RX_CFG2, mask, val);
83
84 /* set delay between ch3 and ch2 */
85 if (param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_2] >=
86 param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_1]) {
87 delay_data = DELAY_DATA_MISO1;
88 delay_cycle =
89 param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_2] -
90 param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_1];
91 } else {
92 delay_data = DELAY_DATA_MISO2;
93 delay_cycle =
94 param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_1] -
95 param->mtkaif_phase_cycle[MT8195_MTKAIF_MISO_2];
96 }
97
98 val = 0;
99 mask = (MTKAIF_RXIF_DELAY_DATA | MTKAIF_RXIF_DELAY_CYCLE_MASK);
100 val |= MTKAIF_RXIF_DELAY_CYCLE(delay_cycle) &
101 MTKAIF_RXIF_DELAY_CYCLE_MASK;
102 val |= delay_data << MTKAIF_RXIF_DELAY_DATA_SHIFT;
103 regmap_update_bits(afe->regmap, AFE_ADDA6_MTKAIF_RX_CFG2, mask, val);
104
105 return 0;
106 }
107
mtk_adda_mtkaif_cfg_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)108 static int mtk_adda_mtkaif_cfg_event(struct snd_soc_dapm_widget *w,
109 struct snd_kcontrol *kcontrol,
110 int event)
111 {
112 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
113 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
114
115 dev_dbg(afe->dev, "%s(), name %s, event 0x%x\n",
116 __func__, w->name, event);
117
118 switch (event) {
119 case SND_SOC_DAPM_PRE_PMU:
120 mt8195_adda_mtkaif_init(afe);
121 break;
122 default:
123 break;
124 }
125
126 return 0;
127 }
128
mtk_adda_dl_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)129 static int mtk_adda_dl_event(struct snd_soc_dapm_widget *w,
130 struct snd_kcontrol *kcontrol,
131 int event)
132 {
133 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
134 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
135
136 dev_dbg(afe->dev, "%s(), name %s, event 0x%x\n",
137 __func__, w->name, event);
138
139 switch (event) {
140 case SND_SOC_DAPM_POST_PMD:
141 /* should delayed 1/fs(smallest is 8k) = 125us before afe off */
142 usleep_range(125, 135);
143 break;
144 default:
145 break;
146 }
147
148 return 0;
149 }
150
mtk_adda_ul_mictype(struct mtk_base_afe * afe,int adda,bool dmic)151 static void mtk_adda_ul_mictype(struct mtk_base_afe *afe, int adda, bool dmic)
152 {
153 unsigned int reg = 0;
154 unsigned int mask = 0;
155 unsigned int val = 0;
156
157 switch (adda) {
158 case MTK_AFE_ADDA:
159 reg = AFE_ADDA_UL_SRC_CON0;
160 break;
161 case MTK_AFE_ADDA6:
162 reg = AFE_ADDA6_UL_SRC_CON0;
163 break;
164 default:
165 dev_info(afe->dev, "%s(), wrong parameter\n", __func__);
166 return;
167 }
168
169 mask = (UL_SDM3_LEVEL_CTL | UL_MODE_3P25M_CH1_CTL |
170 UL_MODE_3P25M_CH2_CTL);
171
172 /* turn on dmic, ch1, ch2 */
173 if (dmic)
174 val = mask;
175
176 regmap_update_bits(afe->regmap, reg, mask, val);
177 }
178
mtk_adda_ul_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)179 static int mtk_adda_ul_event(struct snd_soc_dapm_widget *w,
180 struct snd_kcontrol *kcontrol,
181 int event)
182 {
183 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
184 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
185 struct mt8195_afe_private *afe_priv = afe->platform_priv;
186 struct mtkaif_param *param = &afe_priv->mtkaif_params;
187
188 dev_dbg(afe->dev, "%s(), name %s, event 0x%x\n",
189 __func__, w->name, event);
190
191 switch (event) {
192 case SND_SOC_DAPM_PRE_PMU:
193 mtk_adda_ul_mictype(afe, MTK_AFE_ADDA, param->mtkaif_dmic_on);
194 break;
195 case SND_SOC_DAPM_POST_PMD:
196 /* should delayed 1/fs(smallest is 8k) = 125us before afe off */
197 usleep_range(125, 135);
198 break;
199 default:
200 break;
201 }
202
203 return 0;
204 }
205
mtk_adda6_ul_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)206 static int mtk_adda6_ul_event(struct snd_soc_dapm_widget *w,
207 struct snd_kcontrol *kcontrol,
208 int event)
209 {
210 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
211 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
212 struct mt8195_afe_private *afe_priv = afe->platform_priv;
213 struct mtkaif_param *param = &afe_priv->mtkaif_params;
214 unsigned int val;
215
216 dev_dbg(afe->dev, "%s(), name %s, event 0x%x\n",
217 __func__, w->name, event);
218
219 switch (event) {
220 case SND_SOC_DAPM_PRE_PMU:
221 mtk_adda_ul_mictype(afe, MTK_AFE_ADDA6, param->mtkaif_dmic_on);
222
223 val = (param->mtkaif_adda6_only ?
224 ADDA6_MTKAIF_RX_SYNC_WORD2_DISABLE : 0);
225
226 regmap_update_bits(afe->regmap,
227 AFE_ADDA_MTKAIF_SYNCWORD_CFG,
228 ADDA6_MTKAIF_RX_SYNC_WORD2_DISABLE,
229 val);
230 break;
231 case SND_SOC_DAPM_POST_PMD:
232 /* should delayed 1/fs(smallest is 8k) = 125us before afe off */
233 usleep_range(125, 135);
234 break;
235 default:
236 break;
237 }
238
239 return 0;
240 }
241
mtk_audio_hires_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)242 static int mtk_audio_hires_event(struct snd_soc_dapm_widget *w,
243 struct snd_kcontrol *kcontrol,
244 int event)
245 {
246 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
247 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
248 struct mt8195_afe_private *afe_priv = afe->platform_priv;
249 struct clk *clk = afe_priv->clk[MT8195_CLK_TOP_AUDIO_H_SEL];
250 struct clk *clk_parent;
251
252 dev_dbg(afe->dev, "%s(), name %s, event 0x%x\n",
253 __func__, w->name, event);
254
255 switch (event) {
256 case SND_SOC_DAPM_PRE_PMU:
257 clk_parent = afe_priv->clk[MT8195_CLK_TOP_APLL1];
258 break;
259 case SND_SOC_DAPM_POST_PMD:
260 clk_parent = afe_priv->clk[MT8195_CLK_XTAL_26M];
261 break;
262 default:
263 return 0;
264 }
265 mt8195_afe_set_clk_parent(afe, clk, clk_parent);
266
267 return 0;
268 }
269
get_adda_priv_by_name(struct mtk_base_afe * afe,const char * name)270 static struct mtk_dai_adda_priv *get_adda_priv_by_name(struct mtk_base_afe *afe,
271 const char *name)
272 {
273 struct mt8195_afe_private *afe_priv = afe->platform_priv;
274 int dai_id;
275
276 if (strstr(name, "aud_adc_hires"))
277 dai_id = MT8195_AFE_IO_UL_SRC1;
278 else if (strstr(name, "aud_adda6_adc_hires"))
279 dai_id = MT8195_AFE_IO_UL_SRC2;
280 else if (strstr(name, "aud_dac_hires"))
281 dai_id = MT8195_AFE_IO_DL_SRC;
282 else
283 return NULL;
284
285 return afe_priv->dai_priv[dai_id];
286 }
287
mtk_afe_adda_hires_connect(struct snd_soc_dapm_widget * source,struct snd_soc_dapm_widget * sink)288 static int mtk_afe_adda_hires_connect(struct snd_soc_dapm_widget *source,
289 struct snd_soc_dapm_widget *sink)
290 {
291 struct snd_soc_dapm_widget *w = source;
292 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
293 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
294 struct mtk_dai_adda_priv *adda_priv;
295
296 adda_priv = get_adda_priv_by_name(afe, w->name);
297
298 if (!adda_priv) {
299 dev_info(afe->dev, "adda_priv == NULL");
300 return 0;
301 }
302
303 return (adda_priv->hires_required) ? 1 : 0;
304 }
305
306 static const struct snd_kcontrol_new mtk_dai_adda_o176_mix[] = {
307 SOC_DAPM_SINGLE_AUTODISABLE("I000 Switch", AFE_CONN176, 0, 1, 0),
308 SOC_DAPM_SINGLE_AUTODISABLE("I002 Switch", AFE_CONN176, 2, 1, 0),
309 SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN176, 20, 1, 0),
310 SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN176, 22, 1, 0),
311 SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN176_2, 6, 1, 0),
312 };
313
314 static const struct snd_kcontrol_new mtk_dai_adda_o177_mix[] = {
315 SOC_DAPM_SINGLE_AUTODISABLE("I001 Switch", AFE_CONN177, 1, 1, 0),
316 SOC_DAPM_SINGLE_AUTODISABLE("I003 Switch", AFE_CONN177, 3, 1, 0),
317 SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN177, 21, 1, 0),
318 SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN177, 23, 1, 0),
319 SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN177_2, 7, 1, 0),
320 };
321
322 static const char * const adda_dlgain_mux_map[] = {
323 "Bypass", "Connect",
324 };
325
326 static SOC_ENUM_SINGLE_DECL(adda_dlgain_mux_map_enum,
327 SND_SOC_NOPM, 0,
328 adda_dlgain_mux_map);
329
330 static const struct snd_kcontrol_new adda_dlgain_mux_control =
331 SOC_DAPM_ENUM("DL_GAIN_MUX", adda_dlgain_mux_map_enum);
332
333 static const struct snd_soc_dapm_widget mtk_dai_adda_widgets[] = {
334 SND_SOC_DAPM_MIXER("I168", SND_SOC_NOPM, 0, 0, NULL, 0),
335 SND_SOC_DAPM_MIXER("I169", SND_SOC_NOPM, 0, 0, NULL, 0),
336 SND_SOC_DAPM_MIXER("I170", SND_SOC_NOPM, 0, 0, NULL, 0),
337 SND_SOC_DAPM_MIXER("I171", SND_SOC_NOPM, 0, 0, NULL, 0),
338
339 SND_SOC_DAPM_MIXER("O176", SND_SOC_NOPM, 0, 0,
340 mtk_dai_adda_o176_mix,
341 ARRAY_SIZE(mtk_dai_adda_o176_mix)),
342 SND_SOC_DAPM_MIXER("O177", SND_SOC_NOPM, 0, 0,
343 mtk_dai_adda_o177_mix,
344 ARRAY_SIZE(mtk_dai_adda_o177_mix)),
345
346 SND_SOC_DAPM_SUPPLY_S("ADDA Enable", SUPPLY_SEQ_ADDA_AFE_ON,
347 AFE_ADDA_UL_DL_CON0,
348 ADDA_AFE_ON_SHIFT, 0,
349 NULL,
350 0),
351
352 SND_SOC_DAPM_SUPPLY_S("ADDA Playback Enable", SUPPLY_SEQ_ADDA_DL_ON,
353 AFE_ADDA_DL_SRC2_CON0,
354 DL_2_SRC_ON_TMP_CTRL_PRE_SHIFT, 0,
355 mtk_adda_dl_event,
356 SND_SOC_DAPM_POST_PMD),
357
358 SND_SOC_DAPM_SUPPLY_S("ADDA Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,
359 AFE_ADDA_UL_SRC_CON0,
360 UL_SRC_ON_TMP_CTL_SHIFT, 0,
361 mtk_adda_ul_event,
362 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
363
364 SND_SOC_DAPM_SUPPLY_S("ADDA6 Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,
365 AFE_ADDA6_UL_SRC_CON0,
366 UL_SRC_ON_TMP_CTL_SHIFT, 0,
367 mtk_adda6_ul_event,
368 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
369
370 SND_SOC_DAPM_SUPPLY_S("AUDIO_HIRES", SUPPLY_SEQ_CLOCK_SEL,
371 SND_SOC_NOPM,
372 0, 0,
373 mtk_audio_hires_event,
374 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
375
376 SND_SOC_DAPM_SUPPLY_S("ADDA_MTKAIF_CFG", SUPPLY_SEQ_ADDA_MTKAIF_CFG,
377 SND_SOC_NOPM,
378 0, 0,
379 mtk_adda_mtkaif_cfg_event,
380 SND_SOC_DAPM_PRE_PMU),
381
382 SND_SOC_DAPM_MUX("DL_GAIN_MUX", SND_SOC_NOPM, 0, 0,
383 &adda_dlgain_mux_control),
384
385 SND_SOC_DAPM_PGA("DL_GAIN", AFE_ADDA_DL_SRC2_CON0,
386 DL_2_GAIN_ON_CTL_PRE_SHIFT, 0, NULL, 0),
387
388 SND_SOC_DAPM_INPUT("ADDA_INPUT"),
389 SND_SOC_DAPM_OUTPUT("ADDA_OUTPUT"),
390
391 SND_SOC_DAPM_CLOCK_SUPPLY("aud_dac"),
392 SND_SOC_DAPM_CLOCK_SUPPLY("aud_adc"),
393 SND_SOC_DAPM_CLOCK_SUPPLY("aud_adda6_adc"),
394 SND_SOC_DAPM_CLOCK_SUPPLY("aud_dac_hires"),
395 SND_SOC_DAPM_CLOCK_SUPPLY("aud_adc_hires"),
396 SND_SOC_DAPM_CLOCK_SUPPLY("aud_adda6_adc_hires"),
397 };
398
399 static const struct snd_soc_dapm_route mtk_dai_adda_routes[] = {
400 {"ADDA Capture", NULL, "ADDA Enable"},
401 {"ADDA Capture", NULL, "ADDA Capture Enable"},
402 {"ADDA Capture", NULL, "ADDA_MTKAIF_CFG"},
403 {"ADDA Capture", NULL, "aud_adc"},
404 {"ADDA Capture", NULL, "aud_adc_hires", mtk_afe_adda_hires_connect},
405 {"aud_adc_hires", NULL, "AUDIO_HIRES"},
406
407 {"ADDA6 Capture", NULL, "ADDA Enable"},
408 {"ADDA6 Capture", NULL, "ADDA6 Capture Enable"},
409 {"ADDA6 Capture", NULL, "ADDA_MTKAIF_CFG"},
410 {"ADDA6 Capture", NULL, "aud_adda6_adc"},
411 {"ADDA6 Capture", NULL, "aud_adda6_adc_hires",
412 mtk_afe_adda_hires_connect},
413 {"aud_adda6_adc_hires", NULL, "AUDIO_HIRES"},
414
415 {"I168", NULL, "ADDA Capture"},
416 {"I169", NULL, "ADDA Capture"},
417 {"I170", NULL, "ADDA6 Capture"},
418 {"I171", NULL, "ADDA6 Capture"},
419
420 {"ADDA Playback", NULL, "ADDA Enable"},
421 {"ADDA Playback", NULL, "ADDA Playback Enable"},
422 {"ADDA Playback", NULL, "aud_dac"},
423 {"ADDA Playback", NULL, "aud_dac_hires", mtk_afe_adda_hires_connect},
424 {"aud_dac_hires", NULL, "AUDIO_HIRES"},
425
426 {"DL_GAIN", NULL, "O176"},
427 {"DL_GAIN", NULL, "O177"},
428
429 {"DL_GAIN_MUX", "Bypass", "O176"},
430 {"DL_GAIN_MUX", "Bypass", "O177"},
431 {"DL_GAIN_MUX", "Connect", "DL_GAIN"},
432
433 {"ADDA Playback", NULL, "DL_GAIN_MUX"},
434
435 {"O176", "I000 Switch", "I000"},
436 {"O177", "I001 Switch", "I001"},
437
438 {"O176", "I002 Switch", "I002"},
439 {"O177", "I003 Switch", "I003"},
440
441 {"O176", "I020 Switch", "I020"},
442 {"O177", "I021 Switch", "I021"},
443
444 {"O176", "I022 Switch", "I022"},
445 {"O177", "I023 Switch", "I023"},
446
447 {"O176", "I070 Switch", "I070"},
448 {"O177", "I071 Switch", "I071"},
449
450 {"ADDA Capture", NULL, "ADDA_INPUT"},
451 {"ADDA6 Capture", NULL, "ADDA_INPUT"},
452 {"ADDA_OUTPUT", NULL, "ADDA Playback"},
453 };
454
mt8195_adda_dl_gain_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)455 static int mt8195_adda_dl_gain_put(struct snd_kcontrol *kcontrol,
456 struct snd_ctl_elem_value *ucontrol)
457 {
458 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
459 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
460 unsigned int reg = AFE_ADDA_DL_SRC2_CON1;
461 unsigned int mask = DL_2_GAIN_CTL_PRE_MASK;
462 unsigned int value = (unsigned int)(ucontrol->value.integer.value[0]);
463
464 regmap_update_bits(afe->regmap, reg, mask, DL_2_GAIN_CTL_PRE(value));
465 return 0;
466 }
467
mt8195_adda_dl_gain_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)468 static int mt8195_adda_dl_gain_get(struct snd_kcontrol *kcontrol,
469 struct snd_ctl_elem_value *ucontrol)
470 {
471 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
472 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
473 unsigned int reg = AFE_ADDA_DL_SRC2_CON1;
474 unsigned int mask = DL_2_GAIN_CTL_PRE_MASK;
475 unsigned int value = 0;
476
477 regmap_read(afe->regmap, reg, &value);
478
479 ucontrol->value.integer.value[0] = ((value & mask) >>
480 DL_2_GAIN_CTL_PRE_SHIFT);
481 return 0;
482 }
483
mt8195_adda6_only_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)484 static int mt8195_adda6_only_get(struct snd_kcontrol *kcontrol,
485 struct snd_ctl_elem_value *ucontrol)
486 {
487 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
488 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
489 struct mt8195_afe_private *afe_priv = afe->platform_priv;
490 struct mtkaif_param *param = &afe_priv->mtkaif_params;
491
492 ucontrol->value.integer.value[0] = param->mtkaif_adda6_only;
493 return 0;
494 }
495
mt8195_adda6_only_set(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)496 static int mt8195_adda6_only_set(struct snd_kcontrol *kcontrol,
497 struct snd_ctl_elem_value *ucontrol)
498 {
499 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
500 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
501 struct mt8195_afe_private *afe_priv = afe->platform_priv;
502 struct mtkaif_param *param = &afe_priv->mtkaif_params;
503 int mtkaif_adda6_only;
504
505 mtkaif_adda6_only = ucontrol->value.integer.value[0];
506
507 dev_info(afe->dev, "%s(), kcontrol name %s, mtkaif_adda6_only %d\n",
508 __func__, kcontrol->id.name, mtkaif_adda6_only);
509
510 param->mtkaif_adda6_only = mtkaif_adda6_only;
511
512 return 0;
513 }
514
mt8195_adda_dmic_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)515 static int mt8195_adda_dmic_get(struct snd_kcontrol *kcontrol,
516 struct snd_ctl_elem_value *ucontrol)
517 {
518 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
519 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
520 struct mt8195_afe_private *afe_priv = afe->platform_priv;
521 struct mtkaif_param *param = &afe_priv->mtkaif_params;
522
523 ucontrol->value.integer.value[0] = param->mtkaif_dmic_on;
524 return 0;
525 }
526
mt8195_adda_dmic_set(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)527 static int mt8195_adda_dmic_set(struct snd_kcontrol *kcontrol,
528 struct snd_ctl_elem_value *ucontrol)
529 {
530 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
531 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
532 struct mt8195_afe_private *afe_priv = afe->platform_priv;
533 struct mtkaif_param *param = &afe_priv->mtkaif_params;
534 int dmic_on;
535
536 dmic_on = ucontrol->value.integer.value[0];
537
538 dev_dbg(afe->dev, "%s(), kcontrol name %s, dmic_on %d\n",
539 __func__, kcontrol->id.name, dmic_on);
540
541 param->mtkaif_dmic_on = dmic_on;
542 return 0;
543 }
544
545 static const struct snd_kcontrol_new mtk_dai_adda_controls[] = {
546 SOC_SINGLE_EXT("ADDA_DL_Gain", SND_SOC_NOPM, 0, 65535, 0,
547 mt8195_adda_dl_gain_get, mt8195_adda_dl_gain_put),
548 SOC_SINGLE_BOOL_EXT("MTKAIF_DMIC", 0,
549 mt8195_adda_dmic_get, mt8195_adda_dmic_set),
550 SOC_SINGLE_BOOL_EXT("MTKAIF_ADDA6_ONLY", 0,
551 mt8195_adda6_only_get,
552 mt8195_adda6_only_set),
553 };
554
mtk_dai_da_configure(struct mtk_base_afe * afe,unsigned int rate,int id)555 static int mtk_dai_da_configure(struct mtk_base_afe *afe,
556 unsigned int rate, int id)
557 {
558 unsigned int val = 0;
559 unsigned int mask = 0;
560
561 /* set sampling rate */
562 mask |= DL_2_INPUT_MODE_CTL_MASK;
563 val |= DL_2_INPUT_MODE_CTL(mtk_adda_dl_rate_transform(afe, rate));
564
565 /* turn off saturation */
566 mask |= DL_2_CH1_SATURATION_EN_CTL;
567 mask |= DL_2_CH2_SATURATION_EN_CTL;
568
569 /* turn off mute function */
570 mask |= DL_2_MUTE_CH1_OFF_CTL_PRE;
571 mask |= DL_2_MUTE_CH2_OFF_CTL_PRE;
572 val |= DL_2_MUTE_CH1_OFF_CTL_PRE;
573 val |= DL_2_MUTE_CH2_OFF_CTL_PRE;
574
575 /* set voice input data if input sample rate is 8k or 16k */
576 mask |= DL_2_VOICE_MODE_CTL_PRE;
577 if (rate == 8000 || rate == 16000)
578 val |= DL_2_VOICE_MODE_CTL_PRE;
579
580 regmap_update_bits(afe->regmap, AFE_ADDA_DL_SRC2_CON0, mask, val);
581
582 mask = 0;
583 val = 0;
584
585 /* new 2nd sdm */
586 mask |= DL_USE_NEW_2ND_SDM;
587 val |= DL_USE_NEW_2ND_SDM;
588 regmap_update_bits(afe->regmap, AFE_ADDA_DL_SDM_DCCOMP_CON, mask, val);
589
590 return 0;
591 }
592
mtk_dai_ad_configure(struct mtk_base_afe * afe,unsigned int rate,int id)593 static int mtk_dai_ad_configure(struct mtk_base_afe *afe,
594 unsigned int rate, int id)
595 {
596 unsigned int val = 0;
597 unsigned int mask = 0;
598
599 mask |= UL_VOICE_MODE_CTL_MASK;
600 val |= UL_VOICE_MODE_CTL(mtk_adda_ul_rate_transform(afe, rate));
601
602 switch (id) {
603 case MT8195_AFE_IO_UL_SRC1:
604 regmap_update_bits(afe->regmap, AFE_ADDA_UL_SRC_CON0,
605 mask, val);
606 break;
607 case MT8195_AFE_IO_UL_SRC2:
608 regmap_update_bits(afe->regmap, AFE_ADDA6_UL_SRC_CON0,
609 mask, val);
610 break;
611 default:
612 break;
613 }
614 return 0;
615 }
616
mtk_dai_adda_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params,struct snd_soc_dai * dai)617 static int mtk_dai_adda_hw_params(struct snd_pcm_substream *substream,
618 struct snd_pcm_hw_params *params,
619 struct snd_soc_dai *dai)
620 {
621 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
622 struct mt8195_afe_private *afe_priv = afe->platform_priv;
623 struct mtk_dai_adda_priv *adda_priv;
624 unsigned int rate = params_rate(params);
625 int ret;
626
627 if (dai->id != MT8195_AFE_IO_DL_SRC &&
628 dai->id != MT8195_AFE_IO_UL_SRC1 &&
629 dai->id != MT8195_AFE_IO_UL_SRC2)
630 return -EINVAL;
631 adda_priv = afe_priv->dai_priv[dai->id];
632
633 dev_dbg(afe->dev, "%s(), id %d, stream %d, rate %d\n",
634 __func__, dai->id, substream->stream, rate);
635
636 if (rate > ADDA_HIRES_THRES)
637 adda_priv->hires_required = 1;
638 else
639 adda_priv->hires_required = 0;
640
641 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
642 ret = mtk_dai_da_configure(afe, rate, dai->id);
643 else
644 ret = mtk_dai_ad_configure(afe, rate, dai->id);
645
646 return ret;
647 }
648
649 static const struct snd_soc_dai_ops mtk_dai_adda_ops = {
650 .hw_params = mtk_dai_adda_hw_params,
651 };
652
653 /* dai driver */
654 #define MTK_ADDA_PLAYBACK_RATES (SNDRV_PCM_RATE_8000_48000 |\
655 SNDRV_PCM_RATE_96000 |\
656 SNDRV_PCM_RATE_192000)
657
658 #define MTK_ADDA_CAPTURE_RATES (SNDRV_PCM_RATE_8000 |\
659 SNDRV_PCM_RATE_16000 |\
660 SNDRV_PCM_RATE_32000 |\
661 SNDRV_PCM_RATE_48000 |\
662 SNDRV_PCM_RATE_96000 |\
663 SNDRV_PCM_RATE_192000)
664
665 #define MTK_ADDA_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
666 SNDRV_PCM_FMTBIT_S24_LE |\
667 SNDRV_PCM_FMTBIT_S32_LE)
668
669 static struct snd_soc_dai_driver mtk_dai_adda_driver[] = {
670 {
671 .name = "DL_SRC",
672 .id = MT8195_AFE_IO_DL_SRC,
673 .playback = {
674 .stream_name = "ADDA Playback",
675 .channels_min = 1,
676 .channels_max = 2,
677 .rates = MTK_ADDA_PLAYBACK_RATES,
678 .formats = MTK_ADDA_FORMATS,
679 },
680 .ops = &mtk_dai_adda_ops,
681 },
682 {
683 .name = "UL_SRC1",
684 .id = MT8195_AFE_IO_UL_SRC1,
685 .capture = {
686 .stream_name = "ADDA Capture",
687 .channels_min = 1,
688 .channels_max = 2,
689 .rates = MTK_ADDA_CAPTURE_RATES,
690 .formats = MTK_ADDA_FORMATS,
691 },
692 .ops = &mtk_dai_adda_ops,
693 },
694 {
695 .name = "UL_SRC2",
696 .id = MT8195_AFE_IO_UL_SRC2,
697 .capture = {
698 .stream_name = "ADDA6 Capture",
699 .channels_min = 1,
700 .channels_max = 2,
701 .rates = MTK_ADDA_CAPTURE_RATES,
702 .formats = MTK_ADDA_FORMATS,
703 },
704 .ops = &mtk_dai_adda_ops,
705 },
706 };
707
init_adda_priv_data(struct mtk_base_afe * afe)708 static int init_adda_priv_data(struct mtk_base_afe *afe)
709 {
710 struct mt8195_afe_private *afe_priv = afe->platform_priv;
711 struct mtk_dai_adda_priv *adda_priv;
712 static const int adda_dai_list[] = {
713 MT8195_AFE_IO_DL_SRC,
714 MT8195_AFE_IO_UL_SRC1,
715 MT8195_AFE_IO_UL_SRC2
716 };
717 int i;
718
719 for (i = 0; i < ARRAY_SIZE(adda_dai_list); i++) {
720 adda_priv = devm_kzalloc(afe->dev,
721 sizeof(struct mtk_dai_adda_priv),
722 GFP_KERNEL);
723 if (!adda_priv)
724 return -ENOMEM;
725
726 afe_priv->dai_priv[adda_dai_list[i]] = adda_priv;
727 }
728
729 return 0;
730 }
731
mt8195_dai_adda_register(struct mtk_base_afe * afe)732 int mt8195_dai_adda_register(struct mtk_base_afe *afe)
733 {
734 struct mtk_base_afe_dai *dai;
735
736 dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
737 if (!dai)
738 return -ENOMEM;
739
740 list_add(&dai->list, &afe->sub_dais);
741
742 dai->dai_drivers = mtk_dai_adda_driver;
743 dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_adda_driver);
744
745 dai->dapm_widgets = mtk_dai_adda_widgets;
746 dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_adda_widgets);
747 dai->dapm_routes = mtk_dai_adda_routes;
748 dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_adda_routes);
749 dai->controls = mtk_dai_adda_controls;
750 dai->num_controls = ARRAY_SIZE(mtk_dai_adda_controls);
751
752 return init_adda_priv_data(afe);
753 }
754