Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/soc/mediatek/mt8195/mt8195-dai-adda.c
26488 views
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 <[email protected]>
7
* Trevor Wu <[email protected]>
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
755