Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/soc/codecs/ab8500-codec.c
26424 views
1
// SPDX-License-Identifier: GPL-2.0-only
2
/*
3
* Copyright (C) ST-Ericsson SA 2012
4
*
5
* Author: Ola Lilja <[email protected]>,
6
* Kristoffer Karlsson <[email protected]>,
7
* Roger Nilsson <[email protected]>,
8
* for ST-Ericsson.
9
*
10
* Based on the early work done by:
11
* Mikko J. Lehto <[email protected]>,
12
* Mikko Sarmanne <[email protected]>,
13
* Jarmo K. Kuronen <[email protected]>,
14
* for ST-Ericsson.
15
*/
16
17
#include <linux/kernel.h>
18
#include <linux/module.h>
19
#include <linux/device.h>
20
#include <linux/slab.h>
21
#include <linux/moduleparam.h>
22
#include <linux/init.h>
23
#include <linux/delay.h>
24
#include <linux/pm.h>
25
#include <linux/platform_device.h>
26
#include <linux/mutex.h>
27
#include <linux/mfd/abx500/ab8500.h>
28
#include <linux/mfd/abx500.h>
29
#include <linux/mfd/abx500/ab8500-sysctrl.h>
30
#include <linux/mfd/abx500/ab8500-codec.h>
31
#include <linux/regulator/consumer.h>
32
#include <linux/of.h>
33
34
#include <sound/core.h>
35
#include <sound/pcm.h>
36
#include <sound/pcm_params.h>
37
#include <sound/initval.h>
38
#include <sound/soc.h>
39
#include <sound/soc-dapm.h>
40
#include <sound/tlv.h>
41
42
#include "ab8500-codec.h"
43
44
/* Macrocell value definitions */
45
#define CLK_32K_OUT2_DISABLE 0x01
46
#define INACTIVE_RESET_AUDIO 0x02
47
#define ENABLE_AUDIO_CLK_TO_AUDIO_BLK 0x10
48
#define ENABLE_VINTCORE12_SUPPLY 0x04
49
#define GPIO27_DIR_OUTPUT 0x04
50
#define GPIO29_DIR_OUTPUT 0x10
51
#define GPIO31_DIR_OUTPUT 0x40
52
53
/* Macrocell register definitions */
54
#define AB8500_GPIO_DIR4_REG 0x13 /* Bank AB8500_MISC */
55
56
/* Nr of FIR/IIR-coeff banks in ANC-block */
57
#define AB8500_NR_OF_ANC_COEFF_BANKS 2
58
59
/* Minimum duration to keep ANC IIR Init bit high or
60
low before proceeding with the configuration sequence */
61
#define AB8500_ANC_SM_DELAY 2000
62
63
#define AB8500_FILTER_CONTROL(xname, xcount, xmin, xmax) \
64
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
65
.info = filter_control_info, \
66
.get = filter_control_get, .put = filter_control_put, \
67
.private_value = (unsigned long)&(struct filter_control) \
68
{.count = xcount, .min = xmin, .max = xmax} }
69
70
struct filter_control {
71
long min, max;
72
unsigned int count;
73
long value[128];
74
};
75
76
/* Sidetone states */
77
static const char * const enum_sid_state[] = {
78
"Unconfigured",
79
"Apply FIR",
80
"FIR is configured",
81
};
82
enum sid_state {
83
SID_UNCONFIGURED = 0,
84
SID_APPLY_FIR = 1,
85
SID_FIR_CONFIGURED = 2,
86
};
87
88
static const char * const enum_anc_state[] = {
89
"Unconfigured",
90
"Apply FIR and IIR",
91
"FIR and IIR are configured",
92
"Apply FIR",
93
"FIR is configured",
94
"Apply IIR",
95
"IIR is configured"
96
};
97
enum anc_state {
98
ANC_UNCONFIGURED = 0,
99
ANC_APPLY_FIR_IIR = 1,
100
ANC_FIR_IIR_CONFIGURED = 2,
101
ANC_APPLY_FIR = 3,
102
ANC_FIR_CONFIGURED = 4,
103
ANC_APPLY_IIR = 5,
104
ANC_IIR_CONFIGURED = 6
105
};
106
107
/* Analog microphones */
108
enum amic_idx {
109
AMIC_IDX_1A,
110
AMIC_IDX_1B,
111
AMIC_IDX_2
112
};
113
114
/* Private data for AB8500 device-driver */
115
struct ab8500_codec_drvdata {
116
struct regmap *regmap;
117
struct mutex ctrl_lock;
118
119
/* Sidetone */
120
long *sid_fir_values;
121
enum sid_state sid_status;
122
123
/* ANC */
124
long *anc_fir_values;
125
long *anc_iir_values;
126
enum anc_state anc_status;
127
};
128
129
static inline const char *amic_micbias_str(enum amic_micbias micbias)
130
{
131
switch (micbias) {
132
case AMIC_MICBIAS_VAMIC1:
133
return "VAMIC1";
134
case AMIC_MICBIAS_VAMIC2:
135
return "VAMIC2";
136
default:
137
return "Unknown";
138
}
139
}
140
141
static inline const char *amic_type_str(enum amic_type type)
142
{
143
switch (type) {
144
case AMIC_TYPE_DIFFERENTIAL:
145
return "DIFFERENTIAL";
146
case AMIC_TYPE_SINGLE_ENDED:
147
return "SINGLE ENDED";
148
default:
149
return "Unknown";
150
}
151
}
152
153
/*
154
* Read'n'write functions
155
*/
156
157
/* Read a register from the audio-bank of AB8500 */
158
static int ab8500_codec_read_reg(void *context, unsigned int reg,
159
unsigned int *value)
160
{
161
struct device *dev = context;
162
int status;
163
164
u8 value8;
165
status = abx500_get_register_interruptible(dev, AB8500_AUDIO,
166
reg, &value8);
167
*value = (unsigned int)value8;
168
169
return status;
170
}
171
172
/* Write to a register in the audio-bank of AB8500 */
173
static int ab8500_codec_write_reg(void *context, unsigned int reg,
174
unsigned int value)
175
{
176
struct device *dev = context;
177
178
return abx500_set_register_interruptible(dev, AB8500_AUDIO,
179
reg, value);
180
}
181
182
static const struct regmap_config ab8500_codec_regmap = {
183
.reg_read = ab8500_codec_read_reg,
184
.reg_write = ab8500_codec_write_reg,
185
};
186
187
/*
188
* Controls - DAPM
189
*/
190
191
/* Earpiece */
192
193
/* Earpiece source selector */
194
static const char * const enum_ear_lineout_source[] = {"Headset Left",
195
"Speaker Left"};
196
static SOC_ENUM_SINGLE_DECL(dapm_enum_ear_lineout_source, AB8500_DMICFILTCONF,
197
AB8500_DMICFILTCONF_DA3TOEAR, enum_ear_lineout_source);
198
static const struct snd_kcontrol_new dapm_ear_lineout_source =
199
SOC_DAPM_ENUM("Earpiece or LineOut Mono Source",
200
dapm_enum_ear_lineout_source);
201
202
/* LineOut */
203
204
/* LineOut source selector */
205
static const char * const enum_lineout_source[] = {"Mono Path", "Stereo Path"};
206
static SOC_ENUM_DOUBLE_DECL(dapm_enum_lineout_source, AB8500_ANACONF5,
207
AB8500_ANACONF5_HSLDACTOLOL,
208
AB8500_ANACONF5_HSRDACTOLOR, enum_lineout_source);
209
static const struct snd_kcontrol_new dapm_lineout_source[] = {
210
SOC_DAPM_ENUM("LineOut Source", dapm_enum_lineout_source),
211
};
212
213
/* Handsfree */
214
215
/* Speaker Left - ANC selector */
216
static const char * const enum_HFx_sel[] = {"Audio Path", "ANC"};
217
static SOC_ENUM_SINGLE_DECL(dapm_enum_HFl_sel, AB8500_DIGMULTCONF2,
218
AB8500_DIGMULTCONF2_HFLSEL, enum_HFx_sel);
219
static const struct snd_kcontrol_new dapm_HFl_select[] = {
220
SOC_DAPM_ENUM("Speaker Left Source", dapm_enum_HFl_sel),
221
};
222
223
/* Speaker Right - ANC selector */
224
static SOC_ENUM_SINGLE_DECL(dapm_enum_HFr_sel, AB8500_DIGMULTCONF2,
225
AB8500_DIGMULTCONF2_HFRSEL, enum_HFx_sel);
226
static const struct snd_kcontrol_new dapm_HFr_select[] = {
227
SOC_DAPM_ENUM("Speaker Right Source", dapm_enum_HFr_sel),
228
};
229
230
/* Mic 1 */
231
232
/* Mic 1 - Mic 1a or 1b selector */
233
static const char * const enum_mic1ab_sel[] = {"Mic 1b", "Mic 1a"};
234
static SOC_ENUM_SINGLE_DECL(dapm_enum_mic1ab_sel, AB8500_ANACONF3,
235
AB8500_ANACONF3_MIC1SEL, enum_mic1ab_sel);
236
static const struct snd_kcontrol_new dapm_mic1ab_mux[] = {
237
SOC_DAPM_ENUM("Mic 1a or 1b Select", dapm_enum_mic1ab_sel),
238
};
239
240
/* Mic 1 - AD3 - Mic 1 or DMic 3 selector */
241
static const char * const enum_ad3_sel[] = {"Mic 1", "DMic 3"};
242
static SOC_ENUM_SINGLE_DECL(dapm_enum_ad3_sel, AB8500_DIGMULTCONF1,
243
AB8500_DIGMULTCONF1_AD3SEL, enum_ad3_sel);
244
static const struct snd_kcontrol_new dapm_ad3_select[] = {
245
SOC_DAPM_ENUM("AD3 Source Select", dapm_enum_ad3_sel),
246
};
247
248
/* Mic 1 - AD6 - Mic 1 or DMic 6 selector */
249
static const char * const enum_ad6_sel[] = {"Mic 1", "DMic 6"};
250
static SOC_ENUM_SINGLE_DECL(dapm_enum_ad6_sel, AB8500_DIGMULTCONF1,
251
AB8500_DIGMULTCONF1_AD6SEL, enum_ad6_sel);
252
static const struct snd_kcontrol_new dapm_ad6_select[] = {
253
SOC_DAPM_ENUM("AD6 Source Select", dapm_enum_ad6_sel),
254
};
255
256
/* Mic 2 */
257
258
/* Mic 2 - AD5 - Mic 2 or DMic 5 selector */
259
static const char * const enum_ad5_sel[] = {"Mic 2", "DMic 5"};
260
static SOC_ENUM_SINGLE_DECL(dapm_enum_ad5_sel, AB8500_DIGMULTCONF1,
261
AB8500_DIGMULTCONF1_AD5SEL, enum_ad5_sel);
262
static const struct snd_kcontrol_new dapm_ad5_select[] = {
263
SOC_DAPM_ENUM("AD5 Source Select", dapm_enum_ad5_sel),
264
};
265
266
/* LineIn */
267
268
/* LineIn left - AD1 - LineIn Left or DMic 1 selector */
269
static const char * const enum_ad1_sel[] = {"LineIn Left", "DMic 1"};
270
static SOC_ENUM_SINGLE_DECL(dapm_enum_ad1_sel, AB8500_DIGMULTCONF1,
271
AB8500_DIGMULTCONF1_AD1SEL, enum_ad1_sel);
272
static const struct snd_kcontrol_new dapm_ad1_select[] = {
273
SOC_DAPM_ENUM("AD1 Source Select", dapm_enum_ad1_sel),
274
};
275
276
/* LineIn right - Mic 2 or LineIn Right selector */
277
static const char * const enum_mic2lr_sel[] = {"Mic 2", "LineIn Right"};
278
static SOC_ENUM_SINGLE_DECL(dapm_enum_mic2lr_sel, AB8500_ANACONF3,
279
AB8500_ANACONF3_LINRSEL, enum_mic2lr_sel);
280
static const struct snd_kcontrol_new dapm_mic2lr_select[] = {
281
SOC_DAPM_ENUM("Mic 2 or LINR Select", dapm_enum_mic2lr_sel),
282
};
283
284
/* LineIn right - AD2 - LineIn Right or DMic2 selector */
285
static const char * const enum_ad2_sel[] = {"LineIn Right", "DMic 2"};
286
static SOC_ENUM_SINGLE_DECL(dapm_enum_ad2_sel, AB8500_DIGMULTCONF1,
287
AB8500_DIGMULTCONF1_AD2SEL, enum_ad2_sel);
288
static const struct snd_kcontrol_new dapm_ad2_select[] = {
289
SOC_DAPM_ENUM("AD2 Source Select", dapm_enum_ad2_sel),
290
};
291
292
293
/* ANC */
294
295
static const char * const enum_anc_in_sel[] = {"Mic 1 / DMic 6",
296
"Mic 2 / DMic 5"};
297
static SOC_ENUM_SINGLE_DECL(dapm_enum_anc_in_sel, AB8500_DMICFILTCONF,
298
AB8500_DMICFILTCONF_ANCINSEL, enum_anc_in_sel);
299
static const struct snd_kcontrol_new dapm_anc_in_select[] = {
300
SOC_DAPM_ENUM("ANC Source", dapm_enum_anc_in_sel),
301
};
302
303
/* ANC - Enable/Disable */
304
static const struct snd_kcontrol_new dapm_anc_enable[] = {
305
SOC_DAPM_SINGLE("Switch", AB8500_ANCCONF1,
306
AB8500_ANCCONF1_ENANC, 0, 0),
307
};
308
309
/* ANC to Earpiece - Mute */
310
static const struct snd_kcontrol_new dapm_anc_ear_mute[] = {
311
SOC_DAPM_SINGLE("Switch", AB8500_DIGMULTCONF1,
312
AB8500_DIGMULTCONF1_ANCSEL, 1, 0),
313
};
314
315
316
317
/* Sidetone left */
318
319
/* Sidetone left - Input selector */
320
static const char * const enum_stfir1_in_sel[] = {
321
"LineIn Left", "LineIn Right", "Mic 1", "Headset Left"
322
};
323
static SOC_ENUM_SINGLE_DECL(dapm_enum_stfir1_in_sel, AB8500_DIGMULTCONF2,
324
AB8500_DIGMULTCONF2_FIRSID1SEL, enum_stfir1_in_sel);
325
static const struct snd_kcontrol_new dapm_stfir1_in_select[] = {
326
SOC_DAPM_ENUM("Sidetone Left Source", dapm_enum_stfir1_in_sel),
327
};
328
329
/* Sidetone right path */
330
331
/* Sidetone right - Input selector */
332
static const char * const enum_stfir2_in_sel[] = {
333
"LineIn Right", "Mic 1", "DMic 4", "Headset Right"
334
};
335
static SOC_ENUM_SINGLE_DECL(dapm_enum_stfir2_in_sel, AB8500_DIGMULTCONF2,
336
AB8500_DIGMULTCONF2_FIRSID2SEL, enum_stfir2_in_sel);
337
static const struct snd_kcontrol_new dapm_stfir2_in_select[] = {
338
SOC_DAPM_ENUM("Sidetone Right Source", dapm_enum_stfir2_in_sel),
339
};
340
341
/* Vibra */
342
343
static const char * const enum_pwm2vibx[] = {"Audio Path", "PWM Generator"};
344
345
static SOC_ENUM_SINGLE_DECL(dapm_enum_pwm2vib1, AB8500_PWMGENCONF1,
346
AB8500_PWMGENCONF1_PWMTOVIB1, enum_pwm2vibx);
347
348
static const struct snd_kcontrol_new dapm_pwm2vib1[] = {
349
SOC_DAPM_ENUM("Vibra 1 Controller", dapm_enum_pwm2vib1),
350
};
351
352
static SOC_ENUM_SINGLE_DECL(dapm_enum_pwm2vib2, AB8500_PWMGENCONF1,
353
AB8500_PWMGENCONF1_PWMTOVIB2, enum_pwm2vibx);
354
355
static const struct snd_kcontrol_new dapm_pwm2vib2[] = {
356
SOC_DAPM_ENUM("Vibra 2 Controller", dapm_enum_pwm2vib2),
357
};
358
359
/*
360
* DAPM-widgets
361
*/
362
363
static const struct snd_soc_dapm_widget ab8500_dapm_widgets[] = {
364
365
/* Clocks */
366
SND_SOC_DAPM_CLOCK_SUPPLY("audioclk"),
367
368
/* Regulators */
369
SND_SOC_DAPM_REGULATOR_SUPPLY("V-AUD", 0, 0),
370
SND_SOC_DAPM_REGULATOR_SUPPLY("V-AMIC1", 0, 0),
371
SND_SOC_DAPM_REGULATOR_SUPPLY("V-AMIC2", 0, 0),
372
SND_SOC_DAPM_REGULATOR_SUPPLY("V-DMIC", 0, 0),
373
374
/* Power */
375
SND_SOC_DAPM_SUPPLY("Audio Power",
376
AB8500_POWERUP, AB8500_POWERUP_POWERUP, 0,
377
NULL, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
378
SND_SOC_DAPM_SUPPLY("Audio Analog Power",
379
AB8500_POWERUP, AB8500_POWERUP_ENANA, 0,
380
NULL, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
381
382
/* Main supply node */
383
SND_SOC_DAPM_SUPPLY("Main Supply", SND_SOC_NOPM, 0, 0,
384
NULL, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
385
386
/* DA/AD */
387
388
SND_SOC_DAPM_INPUT("ADC Input"),
389
SND_SOC_DAPM_ADC("ADC", "ab8500_0c", SND_SOC_NOPM, 0, 0),
390
391
SND_SOC_DAPM_DAC("DAC", NULL, SND_SOC_NOPM, 0, 0),
392
SND_SOC_DAPM_OUTPUT("DAC Output"),
393
394
SND_SOC_DAPM_AIF_IN("DA_IN1", NULL, 0, SND_SOC_NOPM, 0, 0),
395
SND_SOC_DAPM_AIF_IN("DA_IN2", NULL, 0, SND_SOC_NOPM, 0, 0),
396
SND_SOC_DAPM_AIF_IN("DA_IN3", NULL, 0, SND_SOC_NOPM, 0, 0),
397
SND_SOC_DAPM_AIF_IN("DA_IN4", NULL, 0, SND_SOC_NOPM, 0, 0),
398
SND_SOC_DAPM_AIF_IN("DA_IN5", NULL, 0, SND_SOC_NOPM, 0, 0),
399
SND_SOC_DAPM_AIF_IN("DA_IN6", NULL, 0, SND_SOC_NOPM, 0, 0),
400
SND_SOC_DAPM_AIF_OUT("AD_OUT1", NULL, 0, SND_SOC_NOPM, 0, 0),
401
SND_SOC_DAPM_AIF_OUT("AD_OUT2", NULL, 0, SND_SOC_NOPM, 0, 0),
402
SND_SOC_DAPM_AIF_OUT("AD_OUT3", NULL, 0, SND_SOC_NOPM, 0, 0),
403
SND_SOC_DAPM_AIF_OUT("AD_OUT4", NULL, 0, SND_SOC_NOPM, 0, 0),
404
SND_SOC_DAPM_AIF_OUT("AD_OUT57", NULL, 0, SND_SOC_NOPM, 0, 0),
405
SND_SOC_DAPM_AIF_OUT("AD_OUT68", NULL, 0, SND_SOC_NOPM, 0, 0),
406
407
/* Headset path */
408
409
SND_SOC_DAPM_SUPPLY("Charge Pump", AB8500_ANACONF5,
410
AB8500_ANACONF5_ENCPHS, 0, NULL, 0),
411
412
SND_SOC_DAPM_DAC("DA1 Enable", "ab8500_0p",
413
AB8500_DAPATHENA, AB8500_DAPATHENA_ENDA1, 0),
414
SND_SOC_DAPM_DAC("DA2 Enable", "ab8500_0p",
415
AB8500_DAPATHENA, AB8500_DAPATHENA_ENDA2, 0),
416
417
SND_SOC_DAPM_PGA("HSL Digital Volume", SND_SOC_NOPM, 0, 0,
418
NULL, 0),
419
SND_SOC_DAPM_PGA("HSR Digital Volume", SND_SOC_NOPM, 0, 0,
420
NULL, 0),
421
422
SND_SOC_DAPM_DAC("HSL DAC", "ab8500_0p",
423
AB8500_DAPATHCONF, AB8500_DAPATHCONF_ENDACHSL, 0),
424
SND_SOC_DAPM_DAC("HSR DAC", "ab8500_0p",
425
AB8500_DAPATHCONF, AB8500_DAPATHCONF_ENDACHSR, 0),
426
SND_SOC_DAPM_MIXER("HSL DAC Mute", AB8500_MUTECONF,
427
AB8500_MUTECONF_MUTDACHSL, 1,
428
NULL, 0),
429
SND_SOC_DAPM_MIXER("HSR DAC Mute", AB8500_MUTECONF,
430
AB8500_MUTECONF_MUTDACHSR, 1,
431
NULL, 0),
432
SND_SOC_DAPM_DAC("HSL DAC Driver", "ab8500_0p",
433
AB8500_ANACONF3, AB8500_ANACONF3_ENDRVHSL, 0),
434
SND_SOC_DAPM_DAC("HSR DAC Driver", "ab8500_0p",
435
AB8500_ANACONF3, AB8500_ANACONF3_ENDRVHSR, 0),
436
437
SND_SOC_DAPM_MIXER("HSL Mute",
438
AB8500_MUTECONF, AB8500_MUTECONF_MUTHSL, 1,
439
NULL, 0),
440
SND_SOC_DAPM_MIXER("HSR Mute",
441
AB8500_MUTECONF, AB8500_MUTECONF_MUTHSR, 1,
442
NULL, 0),
443
SND_SOC_DAPM_MIXER("HSL Enable",
444
AB8500_ANACONF4, AB8500_ANACONF4_ENHSL, 0,
445
NULL, 0),
446
SND_SOC_DAPM_MIXER("HSR Enable",
447
AB8500_ANACONF4, AB8500_ANACONF4_ENHSR, 0,
448
NULL, 0),
449
SND_SOC_DAPM_PGA("HSL Volume",
450
SND_SOC_NOPM, 0, 0,
451
NULL, 0),
452
SND_SOC_DAPM_PGA("HSR Volume",
453
SND_SOC_NOPM, 0, 0,
454
NULL, 0),
455
456
SND_SOC_DAPM_OUTPUT("Headset Left"),
457
SND_SOC_DAPM_OUTPUT("Headset Right"),
458
459
/* LineOut path */
460
461
SND_SOC_DAPM_MUX("LineOut Source",
462
SND_SOC_NOPM, 0, 0, dapm_lineout_source),
463
464
SND_SOC_DAPM_MIXER("LOL Disable HFL",
465
AB8500_ANACONF4, AB8500_ANACONF4_ENHFL, 1,
466
NULL, 0),
467
SND_SOC_DAPM_MIXER("LOR Disable HFR",
468
AB8500_ANACONF4, AB8500_ANACONF4_ENHFR, 1,
469
NULL, 0),
470
471
SND_SOC_DAPM_MIXER("LOL Enable",
472
AB8500_ANACONF5, AB8500_ANACONF5_ENLOL, 0,
473
NULL, 0),
474
SND_SOC_DAPM_MIXER("LOR Enable",
475
AB8500_ANACONF5, AB8500_ANACONF5_ENLOR, 0,
476
NULL, 0),
477
478
SND_SOC_DAPM_OUTPUT("LineOut Left"),
479
SND_SOC_DAPM_OUTPUT("LineOut Right"),
480
481
/* Earpiece path */
482
483
SND_SOC_DAPM_MUX("Earpiece or LineOut Mono Source",
484
SND_SOC_NOPM, 0, 0, &dapm_ear_lineout_source),
485
SND_SOC_DAPM_MIXER("EAR DAC",
486
AB8500_DAPATHCONF, AB8500_DAPATHCONF_ENDACEAR, 0,
487
NULL, 0),
488
SND_SOC_DAPM_MIXER("EAR Mute",
489
AB8500_MUTECONF, AB8500_MUTECONF_MUTEAR, 1,
490
NULL, 0),
491
SND_SOC_DAPM_MIXER("EAR Enable",
492
AB8500_ANACONF4, AB8500_ANACONF4_ENEAR, 0,
493
NULL, 0),
494
495
SND_SOC_DAPM_OUTPUT("Earpiece"),
496
497
/* Handsfree path */
498
499
SND_SOC_DAPM_MIXER("DA3 Channel Volume",
500
AB8500_DAPATHENA, AB8500_DAPATHENA_ENDA3, 0,
501
NULL, 0),
502
SND_SOC_DAPM_MIXER("DA4 Channel Volume",
503
AB8500_DAPATHENA, AB8500_DAPATHENA_ENDA4, 0,
504
NULL, 0),
505
SND_SOC_DAPM_MUX("Speaker Left Source",
506
SND_SOC_NOPM, 0, 0, dapm_HFl_select),
507
SND_SOC_DAPM_MUX("Speaker Right Source",
508
SND_SOC_NOPM, 0, 0, dapm_HFr_select),
509
SND_SOC_DAPM_MIXER("HFL DAC", AB8500_DAPATHCONF,
510
AB8500_DAPATHCONF_ENDACHFL, 0,
511
NULL, 0),
512
SND_SOC_DAPM_MIXER("HFR DAC",
513
AB8500_DAPATHCONF, AB8500_DAPATHCONF_ENDACHFR, 0,
514
NULL, 0),
515
SND_SOC_DAPM_MIXER("DA4 or ANC path to HfR",
516
AB8500_DIGMULTCONF2, AB8500_DIGMULTCONF2_DATOHFREN, 0,
517
NULL, 0),
518
SND_SOC_DAPM_MIXER("DA3 or ANC path to HfL",
519
AB8500_DIGMULTCONF2, AB8500_DIGMULTCONF2_DATOHFLEN, 0,
520
NULL, 0),
521
SND_SOC_DAPM_MIXER("HFL Enable",
522
AB8500_ANACONF4, AB8500_ANACONF4_ENHFL, 0,
523
NULL, 0),
524
SND_SOC_DAPM_MIXER("HFR Enable",
525
AB8500_ANACONF4, AB8500_ANACONF4_ENHFR, 0,
526
NULL, 0),
527
528
SND_SOC_DAPM_OUTPUT("Speaker Left"),
529
SND_SOC_DAPM_OUTPUT("Speaker Right"),
530
531
/* Vibrator path */
532
533
SND_SOC_DAPM_INPUT("PWMGEN1"),
534
SND_SOC_DAPM_INPUT("PWMGEN2"),
535
536
SND_SOC_DAPM_MIXER("DA5 Channel Volume",
537
AB8500_DAPATHENA, AB8500_DAPATHENA_ENDA5, 0,
538
NULL, 0),
539
SND_SOC_DAPM_MIXER("DA6 Channel Volume",
540
AB8500_DAPATHENA, AB8500_DAPATHENA_ENDA6, 0,
541
NULL, 0),
542
SND_SOC_DAPM_MIXER("VIB1 DAC",
543
AB8500_DAPATHCONF, AB8500_DAPATHCONF_ENDACVIB1, 0,
544
NULL, 0),
545
SND_SOC_DAPM_MIXER("VIB2 DAC",
546
AB8500_DAPATHCONF, AB8500_DAPATHCONF_ENDACVIB2, 0,
547
NULL, 0),
548
SND_SOC_DAPM_MUX("Vibra 1 Controller",
549
SND_SOC_NOPM, 0, 0, dapm_pwm2vib1),
550
SND_SOC_DAPM_MUX("Vibra 2 Controller",
551
SND_SOC_NOPM, 0, 0, dapm_pwm2vib2),
552
SND_SOC_DAPM_MIXER("VIB1 Enable",
553
AB8500_ANACONF4, AB8500_ANACONF4_ENVIB1, 0,
554
NULL, 0),
555
SND_SOC_DAPM_MIXER("VIB2 Enable",
556
AB8500_ANACONF4, AB8500_ANACONF4_ENVIB2, 0,
557
NULL, 0),
558
559
SND_SOC_DAPM_OUTPUT("Vibra 1"),
560
SND_SOC_DAPM_OUTPUT("Vibra 2"),
561
562
/* Mic 1 */
563
564
SND_SOC_DAPM_INPUT("Mic 1"),
565
566
SND_SOC_DAPM_MUX("Mic 1a or 1b Select",
567
SND_SOC_NOPM, 0, 0, dapm_mic1ab_mux),
568
SND_SOC_DAPM_MIXER("MIC1 Mute",
569
AB8500_ANACONF2, AB8500_ANACONF2_MUTMIC1, 1,
570
NULL, 0),
571
SND_SOC_DAPM_MIXER("MIC1A V-AMICx Enable",
572
AB8500_ANACONF2, AB8500_ANACONF2_ENMIC1, 0,
573
NULL, 0),
574
SND_SOC_DAPM_MIXER("MIC1B V-AMICx Enable",
575
AB8500_ANACONF2, AB8500_ANACONF2_ENMIC1, 0,
576
NULL, 0),
577
SND_SOC_DAPM_MIXER("MIC1 ADC",
578
AB8500_ANACONF3, AB8500_ANACONF3_ENADCMIC, 0,
579
NULL, 0),
580
SND_SOC_DAPM_MUX("AD3 Source Select",
581
SND_SOC_NOPM, 0, 0, dapm_ad3_select),
582
SND_SOC_DAPM_MIXER("AD3 Channel Volume",
583
SND_SOC_NOPM, 0, 0,
584
NULL, 0),
585
SND_SOC_DAPM_MIXER("AD3 Enable",
586
AB8500_ADPATHENA, AB8500_ADPATHENA_ENAD34, 0,
587
NULL, 0),
588
589
/* Mic 2 */
590
591
SND_SOC_DAPM_INPUT("Mic 2"),
592
593
SND_SOC_DAPM_MIXER("MIC2 Mute",
594
AB8500_ANACONF2, AB8500_ANACONF2_MUTMIC2, 1,
595
NULL, 0),
596
SND_SOC_DAPM_MIXER("MIC2 V-AMICx Enable", AB8500_ANACONF2,
597
AB8500_ANACONF2_ENMIC2, 0,
598
NULL, 0),
599
600
/* LineIn */
601
602
SND_SOC_DAPM_INPUT("LineIn Left"),
603
SND_SOC_DAPM_INPUT("LineIn Right"),
604
605
SND_SOC_DAPM_MIXER("LINL Mute",
606
AB8500_ANACONF2, AB8500_ANACONF2_MUTLINL, 1,
607
NULL, 0),
608
SND_SOC_DAPM_MIXER("LINR Mute",
609
AB8500_ANACONF2, AB8500_ANACONF2_MUTLINR, 1,
610
NULL, 0),
611
SND_SOC_DAPM_MIXER("LINL Enable", AB8500_ANACONF2,
612
AB8500_ANACONF2_ENLINL, 0,
613
NULL, 0),
614
SND_SOC_DAPM_MIXER("LINR Enable", AB8500_ANACONF2,
615
AB8500_ANACONF2_ENLINR, 0,
616
NULL, 0),
617
618
/* LineIn Bypass path */
619
SND_SOC_DAPM_MIXER("LINL to HSL Volume",
620
SND_SOC_NOPM, 0, 0,
621
NULL, 0),
622
SND_SOC_DAPM_MIXER("LINR to HSR Volume",
623
SND_SOC_NOPM, 0, 0,
624
NULL, 0),
625
626
/* LineIn, Mic 2 */
627
SND_SOC_DAPM_MUX("Mic 2 or LINR Select",
628
SND_SOC_NOPM, 0, 0, dapm_mic2lr_select),
629
SND_SOC_DAPM_MIXER("LINL ADC", AB8500_ANACONF3,
630
AB8500_ANACONF3_ENADCLINL, 0,
631
NULL, 0),
632
SND_SOC_DAPM_MIXER("LINR ADC", AB8500_ANACONF3,
633
AB8500_ANACONF3_ENADCLINR, 0,
634
NULL, 0),
635
SND_SOC_DAPM_MUX("AD1 Source Select",
636
SND_SOC_NOPM, 0, 0, dapm_ad1_select),
637
SND_SOC_DAPM_MUX("AD2 Source Select",
638
SND_SOC_NOPM, 0, 0, dapm_ad2_select),
639
SND_SOC_DAPM_MIXER("AD1 Channel Volume",
640
SND_SOC_NOPM, 0, 0,
641
NULL, 0),
642
SND_SOC_DAPM_MIXER("AD2 Channel Volume",
643
SND_SOC_NOPM, 0, 0,
644
NULL, 0),
645
646
SND_SOC_DAPM_MIXER("AD12 Enable",
647
AB8500_ADPATHENA, AB8500_ADPATHENA_ENAD12, 0,
648
NULL, 0),
649
650
/* HD Capture path */
651
652
SND_SOC_DAPM_MUX("AD5 Source Select",
653
SND_SOC_NOPM, 0, 0, dapm_ad5_select),
654
SND_SOC_DAPM_MUX("AD6 Source Select",
655
SND_SOC_NOPM, 0, 0, dapm_ad6_select),
656
SND_SOC_DAPM_MIXER("AD5 Channel Volume",
657
SND_SOC_NOPM, 0, 0,
658
NULL, 0),
659
SND_SOC_DAPM_MIXER("AD6 Channel Volume",
660
SND_SOC_NOPM, 0, 0,
661
NULL, 0),
662
SND_SOC_DAPM_MIXER("AD57 Enable",
663
AB8500_ADPATHENA, AB8500_ADPATHENA_ENAD5768, 0,
664
NULL, 0),
665
SND_SOC_DAPM_MIXER("AD68 Enable",
666
AB8500_ADPATHENA, AB8500_ADPATHENA_ENAD5768, 0,
667
NULL, 0),
668
669
/* Digital Microphone path */
670
671
SND_SOC_DAPM_INPUT("DMic 1"),
672
SND_SOC_DAPM_INPUT("DMic 2"),
673
SND_SOC_DAPM_INPUT("DMic 3"),
674
SND_SOC_DAPM_INPUT("DMic 4"),
675
SND_SOC_DAPM_INPUT("DMic 5"),
676
SND_SOC_DAPM_INPUT("DMic 6"),
677
678
SND_SOC_DAPM_MIXER("DMIC1",
679
AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC1, 0,
680
NULL, 0),
681
SND_SOC_DAPM_MIXER("DMIC2",
682
AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC2, 0,
683
NULL, 0),
684
SND_SOC_DAPM_MIXER("DMIC3",
685
AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC3, 0,
686
NULL, 0),
687
SND_SOC_DAPM_MIXER("DMIC4",
688
AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC4, 0,
689
NULL, 0),
690
SND_SOC_DAPM_MIXER("DMIC5",
691
AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC5, 0,
692
NULL, 0),
693
SND_SOC_DAPM_MIXER("DMIC6",
694
AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC6, 0,
695
NULL, 0),
696
SND_SOC_DAPM_MIXER("AD4 Channel Volume",
697
SND_SOC_NOPM, 0, 0,
698
NULL, 0),
699
SND_SOC_DAPM_MIXER("AD4 Enable",
700
AB8500_ADPATHENA, AB8500_ADPATHENA_ENAD34,
701
0, NULL, 0),
702
703
/* Acoustical Noise Cancellation path */
704
705
SND_SOC_DAPM_INPUT("ANC Configure Input"),
706
SND_SOC_DAPM_OUTPUT("ANC Configure Output"),
707
708
SND_SOC_DAPM_MUX("ANC Source",
709
SND_SOC_NOPM, 0, 0,
710
dapm_anc_in_select),
711
SND_SOC_DAPM_SWITCH("ANC",
712
SND_SOC_NOPM, 0, 0,
713
dapm_anc_enable),
714
SND_SOC_DAPM_SWITCH("ANC to Earpiece",
715
SND_SOC_NOPM, 0, 0,
716
dapm_anc_ear_mute),
717
718
/* Sidetone Filter path */
719
720
SND_SOC_DAPM_MUX("Sidetone Left Source",
721
SND_SOC_NOPM, 0, 0,
722
dapm_stfir1_in_select),
723
SND_SOC_DAPM_MUX("Sidetone Right Source",
724
SND_SOC_NOPM, 0, 0,
725
dapm_stfir2_in_select),
726
SND_SOC_DAPM_MIXER("STFIR1 Control",
727
SND_SOC_NOPM, 0, 0,
728
NULL, 0),
729
SND_SOC_DAPM_MIXER("STFIR2 Control",
730
SND_SOC_NOPM, 0, 0,
731
NULL, 0),
732
SND_SOC_DAPM_MIXER("STFIR1 Volume",
733
SND_SOC_NOPM, 0, 0,
734
NULL, 0),
735
SND_SOC_DAPM_MIXER("STFIR2 Volume",
736
SND_SOC_NOPM, 0, 0,
737
NULL, 0),
738
};
739
740
/*
741
* DAPM-routes
742
*/
743
static const struct snd_soc_dapm_route ab8500_dapm_routes[] = {
744
/* Power AB8500 audio-block when AD/DA is active */
745
{"Main Supply", NULL, "V-AUD"},
746
{"Main Supply", NULL, "audioclk"},
747
{"Main Supply", NULL, "Audio Power"},
748
{"Main Supply", NULL, "Audio Analog Power"},
749
750
{"DAC", NULL, "ab8500_0p"},
751
{"DAC", NULL, "Main Supply"},
752
{"ADC", NULL, "ab8500_0c"},
753
{"ADC", NULL, "Main Supply"},
754
755
/* ANC Configure */
756
{"ANC Configure Input", NULL, "Main Supply"},
757
{"ANC Configure Output", NULL, "ANC Configure Input"},
758
759
/* AD/DA */
760
{"ADC", NULL, "ADC Input"},
761
{"DAC Output", NULL, "DAC"},
762
763
/* Powerup charge pump if DA1/2 is in use */
764
765
{"DA_IN1", NULL, "ab8500_0p"},
766
{"DA_IN1", NULL, "Charge Pump"},
767
{"DA_IN2", NULL, "ab8500_0p"},
768
{"DA_IN2", NULL, "Charge Pump"},
769
770
/* Headset path */
771
772
{"DA1 Enable", NULL, "DA_IN1"},
773
{"DA2 Enable", NULL, "DA_IN2"},
774
775
{"HSL Digital Volume", NULL, "DA1 Enable"},
776
{"HSR Digital Volume", NULL, "DA2 Enable"},
777
778
{"HSL DAC", NULL, "HSL Digital Volume"},
779
{"HSR DAC", NULL, "HSR Digital Volume"},
780
781
{"HSL DAC Mute", NULL, "HSL DAC"},
782
{"HSR DAC Mute", NULL, "HSR DAC"},
783
784
{"HSL DAC Driver", NULL, "HSL DAC Mute"},
785
{"HSR DAC Driver", NULL, "HSR DAC Mute"},
786
787
{"HSL Mute", NULL, "HSL DAC Driver"},
788
{"HSR Mute", NULL, "HSR DAC Driver"},
789
790
{"HSL Enable", NULL, "HSL Mute"},
791
{"HSR Enable", NULL, "HSR Mute"},
792
793
{"HSL Volume", NULL, "HSL Enable"},
794
{"HSR Volume", NULL, "HSR Enable"},
795
796
{"Headset Left", NULL, "HSL Volume"},
797
{"Headset Right", NULL, "HSR Volume"},
798
799
/* HF or LineOut path */
800
801
{"DA_IN3", NULL, "ab8500_0p"},
802
{"DA3 Channel Volume", NULL, "DA_IN3"},
803
{"DA_IN4", NULL, "ab8500_0p"},
804
{"DA4 Channel Volume", NULL, "DA_IN4"},
805
806
{"Speaker Left Source", "Audio Path", "DA3 Channel Volume"},
807
{"Speaker Right Source", "Audio Path", "DA4 Channel Volume"},
808
809
{"DA3 or ANC path to HfL", NULL, "Speaker Left Source"},
810
{"DA4 or ANC path to HfR", NULL, "Speaker Right Source"},
811
812
/* HF path */
813
814
{"HFL DAC", NULL, "DA3 or ANC path to HfL"},
815
{"HFR DAC", NULL, "DA4 or ANC path to HfR"},
816
817
{"HFL Enable", NULL, "HFL DAC"},
818
{"HFR Enable", NULL, "HFR DAC"},
819
820
{"Speaker Left", NULL, "HFL Enable"},
821
{"Speaker Right", NULL, "HFR Enable"},
822
823
/* Earpiece path */
824
825
{"Earpiece or LineOut Mono Source", "Headset Left",
826
"HSL Digital Volume"},
827
{"Earpiece or LineOut Mono Source", "Speaker Left",
828
"DA3 or ANC path to HfL"},
829
830
{"EAR DAC", NULL, "Earpiece or LineOut Mono Source"},
831
832
{"EAR Mute", NULL, "EAR DAC"},
833
834
{"EAR Enable", NULL, "EAR Mute"},
835
836
{"Earpiece", NULL, "EAR Enable"},
837
838
/* LineOut path stereo */
839
840
{"LineOut Source", "Stereo Path", "HSL DAC Driver"},
841
{"LineOut Source", "Stereo Path", "HSR DAC Driver"},
842
843
/* LineOut path mono */
844
845
{"LineOut Source", "Mono Path", "EAR DAC"},
846
847
/* LineOut path */
848
849
{"LOL Disable HFL", NULL, "LineOut Source"},
850
{"LOR Disable HFR", NULL, "LineOut Source"},
851
852
{"LOL Enable", NULL, "LOL Disable HFL"},
853
{"LOR Enable", NULL, "LOR Disable HFR"},
854
855
{"LineOut Left", NULL, "LOL Enable"},
856
{"LineOut Right", NULL, "LOR Enable"},
857
858
/* Vibrator path */
859
860
{"DA_IN5", NULL, "ab8500_0p"},
861
{"DA5 Channel Volume", NULL, "DA_IN5"},
862
{"DA_IN6", NULL, "ab8500_0p"},
863
{"DA6 Channel Volume", NULL, "DA_IN6"},
864
865
{"VIB1 DAC", NULL, "DA5 Channel Volume"},
866
{"VIB2 DAC", NULL, "DA6 Channel Volume"},
867
868
{"Vibra 1 Controller", "Audio Path", "VIB1 DAC"},
869
{"Vibra 2 Controller", "Audio Path", "VIB2 DAC"},
870
{"Vibra 1 Controller", "PWM Generator", "PWMGEN1"},
871
{"Vibra 2 Controller", "PWM Generator", "PWMGEN2"},
872
873
{"VIB1 Enable", NULL, "Vibra 1 Controller"},
874
{"VIB2 Enable", NULL, "Vibra 2 Controller"},
875
876
{"Vibra 1", NULL, "VIB1 Enable"},
877
{"Vibra 2", NULL, "VIB2 Enable"},
878
879
880
/* Mic 2 */
881
882
{"MIC2 V-AMICx Enable", NULL, "Mic 2"},
883
884
/* LineIn */
885
{"LINL Mute", NULL, "LineIn Left"},
886
{"LINR Mute", NULL, "LineIn Right"},
887
888
{"LINL Enable", NULL, "LINL Mute"},
889
{"LINR Enable", NULL, "LINR Mute"},
890
891
/* LineIn, Mic 2 */
892
{"Mic 2 or LINR Select", "LineIn Right", "LINR Enable"},
893
{"Mic 2 or LINR Select", "Mic 2", "MIC2 V-AMICx Enable"},
894
895
{"LINL ADC", NULL, "LINL Enable"},
896
{"LINR ADC", NULL, "Mic 2 or LINR Select"},
897
898
{"AD1 Source Select", "LineIn Left", "LINL ADC"},
899
{"AD2 Source Select", "LineIn Right", "LINR ADC"},
900
901
{"AD1 Channel Volume", NULL, "AD1 Source Select"},
902
{"AD2 Channel Volume", NULL, "AD2 Source Select"},
903
904
{"AD12 Enable", NULL, "AD1 Channel Volume"},
905
{"AD12 Enable", NULL, "AD2 Channel Volume"},
906
907
{"AD_OUT1", NULL, "ab8500_0c"},
908
{"AD_OUT1", NULL, "AD12 Enable"},
909
{"AD_OUT2", NULL, "ab8500_0c"},
910
{"AD_OUT2", NULL, "AD12 Enable"},
911
912
/* Mic 1 */
913
914
{"MIC1 Mute", NULL, "Mic 1"},
915
916
{"MIC1A V-AMICx Enable", NULL, "MIC1 Mute"},
917
{"MIC1B V-AMICx Enable", NULL, "MIC1 Mute"},
918
919
{"Mic 1a or 1b Select", "Mic 1a", "MIC1A V-AMICx Enable"},
920
{"Mic 1a or 1b Select", "Mic 1b", "MIC1B V-AMICx Enable"},
921
922
{"MIC1 ADC", NULL, "Mic 1a or 1b Select"},
923
924
{"AD3 Source Select", "Mic 1", "MIC1 ADC"},
925
926
{"AD3 Channel Volume", NULL, "AD3 Source Select"},
927
928
{"AD3 Enable", NULL, "AD3 Channel Volume"},
929
930
{"AD_OUT3", NULL, "ab8500_0c"},
931
{"AD_OUT3", NULL, "AD3 Enable"},
932
933
/* HD Capture path */
934
935
{"AD5 Source Select", "Mic 2", "LINR ADC"},
936
{"AD6 Source Select", "Mic 1", "MIC1 ADC"},
937
938
{"AD5 Channel Volume", NULL, "AD5 Source Select"},
939
{"AD6 Channel Volume", NULL, "AD6 Source Select"},
940
941
{"AD57 Enable", NULL, "AD5 Channel Volume"},
942
{"AD68 Enable", NULL, "AD6 Channel Volume"},
943
944
{"AD_OUT57", NULL, "ab8500_0c"},
945
{"AD_OUT57", NULL, "AD57 Enable"},
946
{"AD_OUT68", NULL, "ab8500_0c"},
947
{"AD_OUT68", NULL, "AD68 Enable"},
948
949
/* Digital Microphone path */
950
951
{"DMic 1", NULL, "V-DMIC"},
952
{"DMic 2", NULL, "V-DMIC"},
953
{"DMic 3", NULL, "V-DMIC"},
954
{"DMic 4", NULL, "V-DMIC"},
955
{"DMic 5", NULL, "V-DMIC"},
956
{"DMic 6", NULL, "V-DMIC"},
957
958
{"AD1 Source Select", NULL, "DMic 1"},
959
{"AD2 Source Select", NULL, "DMic 2"},
960
{"AD3 Source Select", NULL, "DMic 3"},
961
{"AD5 Source Select", NULL, "DMic 5"},
962
{"AD6 Source Select", NULL, "DMic 6"},
963
964
{"AD4 Channel Volume", NULL, "DMic 4"},
965
{"AD4 Enable", NULL, "AD4 Channel Volume"},
966
967
{"AD_OUT4", NULL, "ab8500_0c"},
968
{"AD_OUT4", NULL, "AD4 Enable"},
969
970
/* LineIn Bypass path */
971
972
{"LINL to HSL Volume", NULL, "LINL Enable"},
973
{"LINR to HSR Volume", NULL, "LINR Enable"},
974
975
{"HSL DAC Driver", NULL, "LINL to HSL Volume"},
976
{"HSR DAC Driver", NULL, "LINR to HSR Volume"},
977
978
/* ANC path (Acoustic Noise Cancellation) */
979
980
{"ANC Source", "Mic 2 / DMic 5", "AD5 Channel Volume"},
981
{"ANC Source", "Mic 1 / DMic 6", "AD6 Channel Volume"},
982
983
{"ANC", "Switch", "ANC Source"},
984
985
{"Speaker Left Source", "ANC", "ANC"},
986
{"Speaker Right Source", "ANC", "ANC"},
987
{"ANC to Earpiece", "Switch", "ANC"},
988
989
{"HSL Digital Volume", NULL, "ANC to Earpiece"},
990
991
/* Sidetone Filter path */
992
993
{"Sidetone Left Source", "LineIn Left", "AD12 Enable"},
994
{"Sidetone Left Source", "LineIn Right", "AD12 Enable"},
995
{"Sidetone Left Source", "Mic 1", "AD3 Enable"},
996
{"Sidetone Left Source", "Headset Left", "DA_IN1"},
997
{"Sidetone Right Source", "LineIn Right", "AD12 Enable"},
998
{"Sidetone Right Source", "Mic 1", "AD3 Enable"},
999
{"Sidetone Right Source", "DMic 4", "AD4 Enable"},
1000
{"Sidetone Right Source", "Headset Right", "DA_IN2"},
1001
1002
{"STFIR1 Control", NULL, "Sidetone Left Source"},
1003
{"STFIR2 Control", NULL, "Sidetone Right Source"},
1004
1005
{"STFIR1 Volume", NULL, "STFIR1 Control"},
1006
{"STFIR2 Volume", NULL, "STFIR2 Control"},
1007
1008
{"DA1 Enable", NULL, "STFIR1 Volume"},
1009
{"DA2 Enable", NULL, "STFIR2 Volume"},
1010
};
1011
1012
static const struct snd_soc_dapm_route ab8500_dapm_routes_mic1a_vamicx[] = {
1013
{"MIC1A V-AMICx Enable", NULL, "V-AMIC1"},
1014
{"MIC1A V-AMICx Enable", NULL, "V-AMIC2"},
1015
};
1016
1017
static const struct snd_soc_dapm_route ab8500_dapm_routes_mic1b_vamicx[] = {
1018
{"MIC1B V-AMICx Enable", NULL, "V-AMIC1"},
1019
{"MIC1B V-AMICx Enable", NULL, "V-AMIC2"},
1020
};
1021
1022
static const struct snd_soc_dapm_route ab8500_dapm_routes_mic2_vamicx[] = {
1023
{"MIC2 V-AMICx Enable", NULL, "V-AMIC1"},
1024
{"MIC2 V-AMICx Enable", NULL, "V-AMIC2"},
1025
};
1026
1027
/* ANC FIR-coefficients configuration sequence */
1028
static void anc_fir(struct snd_soc_component *component,
1029
unsigned int bnk, unsigned int par, unsigned int val)
1030
{
1031
if (par == 0 && bnk == 0)
1032
snd_soc_component_update_bits(component, AB8500_ANCCONF1,
1033
BIT(AB8500_ANCCONF1_ANCFIRUPDATE),
1034
BIT(AB8500_ANCCONF1_ANCFIRUPDATE));
1035
1036
snd_soc_component_write(component, AB8500_ANCCONF5, val >> 8 & 0xff);
1037
snd_soc_component_write(component, AB8500_ANCCONF6, val & 0xff);
1038
1039
if (par == AB8500_ANC_FIR_COEFFS - 1 && bnk == 1)
1040
snd_soc_component_update_bits(component, AB8500_ANCCONF1,
1041
BIT(AB8500_ANCCONF1_ANCFIRUPDATE), 0);
1042
}
1043
1044
/* ANC IIR-coefficients configuration sequence */
1045
static void anc_iir(struct snd_soc_component *component, unsigned int bnk,
1046
unsigned int par, unsigned int val)
1047
{
1048
if (par == 0) {
1049
if (bnk == 0) {
1050
snd_soc_component_update_bits(component, AB8500_ANCCONF1,
1051
BIT(AB8500_ANCCONF1_ANCIIRINIT),
1052
BIT(AB8500_ANCCONF1_ANCIIRINIT));
1053
usleep_range(AB8500_ANC_SM_DELAY, AB8500_ANC_SM_DELAY*2);
1054
snd_soc_component_update_bits(component, AB8500_ANCCONF1,
1055
BIT(AB8500_ANCCONF1_ANCIIRINIT), 0);
1056
usleep_range(AB8500_ANC_SM_DELAY, AB8500_ANC_SM_DELAY*2);
1057
} else {
1058
snd_soc_component_update_bits(component, AB8500_ANCCONF1,
1059
BIT(AB8500_ANCCONF1_ANCIIRUPDATE),
1060
BIT(AB8500_ANCCONF1_ANCIIRUPDATE));
1061
}
1062
} else if (par > 3) {
1063
snd_soc_component_write(component, AB8500_ANCCONF7, 0);
1064
snd_soc_component_write(component, AB8500_ANCCONF8, val >> 16 & 0xff);
1065
}
1066
1067
snd_soc_component_write(component, AB8500_ANCCONF7, val >> 8 & 0xff);
1068
snd_soc_component_write(component, AB8500_ANCCONF8, val & 0xff);
1069
1070
if (par == AB8500_ANC_IIR_COEFFS - 1 && bnk == 1)
1071
snd_soc_component_update_bits(component, AB8500_ANCCONF1,
1072
BIT(AB8500_ANCCONF1_ANCIIRUPDATE), 0);
1073
}
1074
1075
/* ANC IIR-/FIR-coefficients configuration sequence */
1076
static void anc_configure(struct snd_soc_component *component,
1077
bool apply_fir, bool apply_iir)
1078
{
1079
struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev);
1080
unsigned int bnk, par, val;
1081
1082
dev_dbg(component->dev, "%s: Enter.\n", __func__);
1083
1084
if (apply_fir)
1085
snd_soc_component_update_bits(component, AB8500_ANCCONF1,
1086
BIT(AB8500_ANCCONF1_ENANC), 0);
1087
1088
snd_soc_component_update_bits(component, AB8500_ANCCONF1,
1089
BIT(AB8500_ANCCONF1_ENANC), BIT(AB8500_ANCCONF1_ENANC));
1090
1091
if (apply_fir)
1092
for (bnk = 0; bnk < AB8500_NR_OF_ANC_COEFF_BANKS; bnk++)
1093
for (par = 0; par < AB8500_ANC_FIR_COEFFS; par++) {
1094
val = snd_soc_component_read(component,
1095
drvdata->anc_fir_values[par]);
1096
anc_fir(component, bnk, par, val);
1097
}
1098
1099
if (apply_iir)
1100
for (bnk = 0; bnk < AB8500_NR_OF_ANC_COEFF_BANKS; bnk++)
1101
for (par = 0; par < AB8500_ANC_IIR_COEFFS; par++) {
1102
val = snd_soc_component_read(component,
1103
drvdata->anc_iir_values[par]);
1104
anc_iir(component, bnk, par, val);
1105
}
1106
1107
dev_dbg(component->dev, "%s: Exit.\n", __func__);
1108
}
1109
1110
/*
1111
* Control-events
1112
*/
1113
1114
static int sid_status_control_get(struct snd_kcontrol *kcontrol,
1115
struct snd_ctl_elem_value *ucontrol)
1116
{
1117
struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1118
struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev);
1119
1120
mutex_lock(&drvdata->ctrl_lock);
1121
ucontrol->value.enumerated.item[0] = drvdata->sid_status;
1122
mutex_unlock(&drvdata->ctrl_lock);
1123
1124
return 0;
1125
}
1126
1127
/* Write sidetone FIR-coefficients configuration sequence */
1128
static int sid_status_control_put(struct snd_kcontrol *kcontrol,
1129
struct snd_ctl_elem_value *ucontrol)
1130
{
1131
struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1132
struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev);
1133
unsigned int param, sidconf, val;
1134
int status = 1;
1135
1136
dev_dbg(component->dev, "%s: Enter\n", __func__);
1137
1138
if (ucontrol->value.enumerated.item[0] != SID_APPLY_FIR) {
1139
dev_err(component->dev,
1140
"%s: ERROR: This control supports '%s' only!\n",
1141
__func__, enum_sid_state[SID_APPLY_FIR]);
1142
return -EIO;
1143
}
1144
1145
mutex_lock(&drvdata->ctrl_lock);
1146
1147
sidconf = snd_soc_component_read(component, AB8500_SIDFIRCONF);
1148
if (((sidconf & BIT(AB8500_SIDFIRCONF_FIRSIDBUSY)) != 0)) {
1149
if ((sidconf & BIT(AB8500_SIDFIRCONF_ENFIRSIDS)) == 0) {
1150
dev_err(component->dev, "%s: Sidetone busy while off!\n",
1151
__func__);
1152
status = -EPERM;
1153
} else {
1154
status = -EBUSY;
1155
}
1156
goto out;
1157
}
1158
1159
snd_soc_component_write(component, AB8500_SIDFIRADR, 0);
1160
1161
for (param = 0; param < AB8500_SID_FIR_COEFFS; param++) {
1162
val = snd_soc_component_read(component, drvdata->sid_fir_values[param]);
1163
snd_soc_component_write(component, AB8500_SIDFIRCOEF1, val >> 8 & 0xff);
1164
snd_soc_component_write(component, AB8500_SIDFIRCOEF2, val & 0xff);
1165
}
1166
1167
snd_soc_component_update_bits(component, AB8500_SIDFIRADR,
1168
BIT(AB8500_SIDFIRADR_FIRSIDSET),
1169
BIT(AB8500_SIDFIRADR_FIRSIDSET));
1170
snd_soc_component_update_bits(component, AB8500_SIDFIRADR,
1171
BIT(AB8500_SIDFIRADR_FIRSIDSET), 0);
1172
1173
drvdata->sid_status = SID_FIR_CONFIGURED;
1174
1175
out:
1176
mutex_unlock(&drvdata->ctrl_lock);
1177
1178
dev_dbg(component->dev, "%s: Exit\n", __func__);
1179
1180
return status;
1181
}
1182
1183
static int anc_status_control_get(struct snd_kcontrol *kcontrol,
1184
struct snd_ctl_elem_value *ucontrol)
1185
{
1186
struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1187
struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev);
1188
1189
mutex_lock(&drvdata->ctrl_lock);
1190
ucontrol->value.enumerated.item[0] = drvdata->anc_status;
1191
mutex_unlock(&drvdata->ctrl_lock);
1192
1193
return 0;
1194
}
1195
1196
static int anc_status_control_put(struct snd_kcontrol *kcontrol,
1197
struct snd_ctl_elem_value *ucontrol)
1198
{
1199
struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1200
struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
1201
struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev);
1202
struct device *dev = component->dev;
1203
bool apply_fir, apply_iir;
1204
unsigned int req;
1205
int status;
1206
1207
dev_dbg(dev, "%s: Enter.\n", __func__);
1208
1209
mutex_lock(&drvdata->ctrl_lock);
1210
1211
req = ucontrol->value.enumerated.item[0];
1212
if (req >= ARRAY_SIZE(enum_anc_state)) {
1213
status = -EINVAL;
1214
goto cleanup;
1215
}
1216
if (req != ANC_APPLY_FIR_IIR && req != ANC_APPLY_FIR &&
1217
req != ANC_APPLY_IIR) {
1218
dev_err(dev, "%s: ERROR: Unsupported status to set '%s'!\n",
1219
__func__, enum_anc_state[req]);
1220
status = -EINVAL;
1221
goto cleanup;
1222
}
1223
apply_fir = req == ANC_APPLY_FIR || req == ANC_APPLY_FIR_IIR;
1224
apply_iir = req == ANC_APPLY_IIR || req == ANC_APPLY_FIR_IIR;
1225
1226
status = snd_soc_dapm_force_enable_pin(dapm, "ANC Configure Input");
1227
if (status < 0) {
1228
dev_err(dev,
1229
"%s: ERROR: Failed to enable power (status = %d)!\n",
1230
__func__, status);
1231
goto cleanup;
1232
}
1233
snd_soc_dapm_sync(dapm);
1234
1235
anc_configure(component, apply_fir, apply_iir);
1236
1237
if (apply_fir) {
1238
if (drvdata->anc_status == ANC_IIR_CONFIGURED)
1239
drvdata->anc_status = ANC_FIR_IIR_CONFIGURED;
1240
else if (drvdata->anc_status != ANC_FIR_IIR_CONFIGURED)
1241
drvdata->anc_status = ANC_FIR_CONFIGURED;
1242
}
1243
if (apply_iir) {
1244
if (drvdata->anc_status == ANC_FIR_CONFIGURED)
1245
drvdata->anc_status = ANC_FIR_IIR_CONFIGURED;
1246
else if (drvdata->anc_status != ANC_FIR_IIR_CONFIGURED)
1247
drvdata->anc_status = ANC_IIR_CONFIGURED;
1248
}
1249
1250
status = snd_soc_dapm_disable_pin(dapm, "ANC Configure Input");
1251
snd_soc_dapm_sync(dapm);
1252
1253
cleanup:
1254
mutex_unlock(&drvdata->ctrl_lock);
1255
1256
if (status < 0)
1257
dev_err(dev, "%s: Unable to configure ANC! (status = %d)\n",
1258
__func__, status);
1259
1260
dev_dbg(dev, "%s: Exit.\n", __func__);
1261
1262
return (status < 0) ? status : 1;
1263
}
1264
1265
static int filter_control_info(struct snd_kcontrol *kcontrol,
1266
struct snd_ctl_elem_info *uinfo)
1267
{
1268
struct filter_control *fc =
1269
(struct filter_control *)kcontrol->private_value;
1270
1271
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1272
uinfo->count = fc->count;
1273
uinfo->value.integer.min = fc->min;
1274
uinfo->value.integer.max = fc->max;
1275
1276
return 0;
1277
}
1278
1279
static int filter_control_get(struct snd_kcontrol *kcontrol,
1280
struct snd_ctl_elem_value *ucontrol)
1281
{
1282
struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1283
struct ab8500_codec_drvdata *drvdata = snd_soc_component_get_drvdata(component);
1284
struct filter_control *fc =
1285
(struct filter_control *)kcontrol->private_value;
1286
unsigned int i;
1287
1288
mutex_lock(&drvdata->ctrl_lock);
1289
for (i = 0; i < fc->count; i++)
1290
ucontrol->value.integer.value[i] = fc->value[i];
1291
mutex_unlock(&drvdata->ctrl_lock);
1292
1293
return 0;
1294
}
1295
1296
static int filter_control_put(struct snd_kcontrol *kcontrol,
1297
struct snd_ctl_elem_value *ucontrol)
1298
{
1299
struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1300
struct ab8500_codec_drvdata *drvdata = snd_soc_component_get_drvdata(component);
1301
struct filter_control *fc =
1302
(struct filter_control *)kcontrol->private_value;
1303
unsigned int i;
1304
1305
mutex_lock(&drvdata->ctrl_lock);
1306
for (i = 0; i < fc->count; i++)
1307
fc->value[i] = ucontrol->value.integer.value[i];
1308
mutex_unlock(&drvdata->ctrl_lock);
1309
1310
return 0;
1311
}
1312
1313
/*
1314
* Controls - Non-DAPM ASoC
1315
*/
1316
1317
static DECLARE_TLV_DB_SCALE(adx_dig_gain_tlv, -3200, 100, 1);
1318
/* -32dB = Mute */
1319
1320
static DECLARE_TLV_DB_SCALE(dax_dig_gain_tlv, -6300, 100, 1);
1321
/* -63dB = Mute */
1322
1323
static DECLARE_TLV_DB_SCALE(hs_ear_dig_gain_tlv, -100, 100, 1);
1324
/* -1dB = Mute */
1325
1326
static const DECLARE_TLV_DB_RANGE(hs_gain_tlv,
1327
0, 3, TLV_DB_SCALE_ITEM(-3200, 400, 0),
1328
4, 15, TLV_DB_SCALE_ITEM(-1800, 200, 0)
1329
);
1330
1331
static DECLARE_TLV_DB_SCALE(mic_gain_tlv, 0, 100, 0);
1332
1333
static DECLARE_TLV_DB_SCALE(lin_gain_tlv, -1000, 200, 0);
1334
1335
static DECLARE_TLV_DB_SCALE(lin2hs_gain_tlv, -3800, 200, 1);
1336
/* -38dB = Mute */
1337
1338
static const char * const enum_hsfadspeed[] = {"2ms", "0.5ms", "10.6ms",
1339
"5ms"};
1340
static SOC_ENUM_SINGLE_DECL(soc_enum_hsfadspeed,
1341
AB8500_DIGMICCONF, AB8500_DIGMICCONF_HSFADSPEED, enum_hsfadspeed);
1342
1343
static const char * const enum_envdetthre[] = {
1344
"250mV", "300mV", "350mV", "400mV",
1345
"450mV", "500mV", "550mV", "600mV",
1346
"650mV", "700mV", "750mV", "800mV",
1347
"850mV", "900mV", "950mV", "1.00V" };
1348
static SOC_ENUM_SINGLE_DECL(soc_enum_envdeththre,
1349
AB8500_ENVCPCONF, AB8500_ENVCPCONF_ENVDETHTHRE, enum_envdetthre);
1350
static SOC_ENUM_SINGLE_DECL(soc_enum_envdetlthre,
1351
AB8500_ENVCPCONF, AB8500_ENVCPCONF_ENVDETLTHRE, enum_envdetthre);
1352
static const char * const enum_envdettime[] = {
1353
"26.6us", "53.2us", "106us", "213us",
1354
"426us", "851us", "1.70ms", "3.40ms",
1355
"6.81ms", "13.6ms", "27.2ms", "54.5ms",
1356
"109ms", "218ms", "436ms", "872ms" };
1357
static SOC_ENUM_SINGLE_DECL(soc_enum_envdettime,
1358
AB8500_SIGENVCONF, AB8500_SIGENVCONF_ENVDETTIME, enum_envdettime);
1359
1360
static const char * const enum_sinc31[] = {"Sinc 3", "Sinc 1"};
1361
static SOC_ENUM_SINGLE_DECL(soc_enum_hsesinc, AB8500_HSLEARDIGGAIN,
1362
AB8500_HSLEARDIGGAIN_HSSINC1, enum_sinc31);
1363
1364
static const char * const enum_fadespeed[] = {"1ms", "4ms", "8ms", "16ms"};
1365
static SOC_ENUM_SINGLE_DECL(soc_enum_fadespeed, AB8500_HSRDIGGAIN,
1366
AB8500_HSRDIGGAIN_FADESPEED, enum_fadespeed);
1367
1368
/* Earpiece */
1369
1370
static const char * const enum_lowpow[] = {"Normal", "Low Power"};
1371
static SOC_ENUM_SINGLE_DECL(soc_enum_eardaclowpow, AB8500_ANACONF1,
1372
AB8500_ANACONF1_EARDACLOWPOW, enum_lowpow);
1373
static SOC_ENUM_SINGLE_DECL(soc_enum_eardrvlowpow, AB8500_ANACONF1,
1374
AB8500_ANACONF1_EARDRVLOWPOW, enum_lowpow);
1375
1376
static const char * const enum_av_mode[] = {"Audio", "Voice"};
1377
static SOC_ENUM_DOUBLE_DECL(soc_enum_ad12voice, AB8500_ADFILTCONF,
1378
AB8500_ADFILTCONF_AD1VOICE, AB8500_ADFILTCONF_AD2VOICE, enum_av_mode);
1379
static SOC_ENUM_DOUBLE_DECL(soc_enum_ad34voice, AB8500_ADFILTCONF,
1380
AB8500_ADFILTCONF_AD3VOICE, AB8500_ADFILTCONF_AD4VOICE, enum_av_mode);
1381
1382
/* DA */
1383
1384
static SOC_ENUM_SINGLE_DECL(soc_enum_da12voice,
1385
AB8500_DASLOTCONF1, AB8500_DASLOTCONF1_DA12VOICE,
1386
enum_av_mode);
1387
static SOC_ENUM_SINGLE_DECL(soc_enum_da34voice,
1388
AB8500_DASLOTCONF3, AB8500_DASLOTCONF3_DA34VOICE,
1389
enum_av_mode);
1390
static SOC_ENUM_SINGLE_DECL(soc_enum_da56voice,
1391
AB8500_DASLOTCONF5, AB8500_DASLOTCONF5_DA56VOICE,
1392
enum_av_mode);
1393
1394
static const char * const enum_da2hslr[] = {"Sidetone", "Audio Path"};
1395
static SOC_ENUM_DOUBLE_DECL(soc_enum_da2hslr, AB8500_DIGMULTCONF1,
1396
AB8500_DIGMULTCONF1_DATOHSLEN,
1397
AB8500_DIGMULTCONF1_DATOHSREN, enum_da2hslr);
1398
1399
static const char * const enum_sinc53[] = {"Sinc 5", "Sinc 3"};
1400
static SOC_ENUM_DOUBLE_DECL(soc_enum_dmic12sinc, AB8500_DMICFILTCONF,
1401
AB8500_DMICFILTCONF_DMIC1SINC3,
1402
AB8500_DMICFILTCONF_DMIC2SINC3, enum_sinc53);
1403
static SOC_ENUM_DOUBLE_DECL(soc_enum_dmic34sinc, AB8500_DMICFILTCONF,
1404
AB8500_DMICFILTCONF_DMIC3SINC3,
1405
AB8500_DMICFILTCONF_DMIC4SINC3, enum_sinc53);
1406
static SOC_ENUM_DOUBLE_DECL(soc_enum_dmic56sinc, AB8500_DMICFILTCONF,
1407
AB8500_DMICFILTCONF_DMIC5SINC3,
1408
AB8500_DMICFILTCONF_DMIC6SINC3, enum_sinc53);
1409
1410
/* Digital interface - DA from slot mapping */
1411
static const char * const enum_da_from_slot_map[] = {"SLOT0",
1412
"SLOT1",
1413
"SLOT2",
1414
"SLOT3",
1415
"SLOT4",
1416
"SLOT5",
1417
"SLOT6",
1418
"SLOT7",
1419
"SLOT8",
1420
"SLOT9",
1421
"SLOT10",
1422
"SLOT11",
1423
"SLOT12",
1424
"SLOT13",
1425
"SLOT14",
1426
"SLOT15",
1427
"SLOT16",
1428
"SLOT17",
1429
"SLOT18",
1430
"SLOT19",
1431
"SLOT20",
1432
"SLOT21",
1433
"SLOT22",
1434
"SLOT23",
1435
"SLOT24",
1436
"SLOT25",
1437
"SLOT26",
1438
"SLOT27",
1439
"SLOT28",
1440
"SLOT29",
1441
"SLOT30",
1442
"SLOT31"};
1443
static SOC_ENUM_SINGLE_DECL(soc_enum_da1slotmap,
1444
AB8500_DASLOTCONF1, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
1445
enum_da_from_slot_map);
1446
static SOC_ENUM_SINGLE_DECL(soc_enum_da2slotmap,
1447
AB8500_DASLOTCONF2, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
1448
enum_da_from_slot_map);
1449
static SOC_ENUM_SINGLE_DECL(soc_enum_da3slotmap,
1450
AB8500_DASLOTCONF3, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
1451
enum_da_from_slot_map);
1452
static SOC_ENUM_SINGLE_DECL(soc_enum_da4slotmap,
1453
AB8500_DASLOTCONF4, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
1454
enum_da_from_slot_map);
1455
static SOC_ENUM_SINGLE_DECL(soc_enum_da5slotmap,
1456
AB8500_DASLOTCONF5, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
1457
enum_da_from_slot_map);
1458
static SOC_ENUM_SINGLE_DECL(soc_enum_da6slotmap,
1459
AB8500_DASLOTCONF6, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
1460
enum_da_from_slot_map);
1461
static SOC_ENUM_SINGLE_DECL(soc_enum_da7slotmap,
1462
AB8500_DASLOTCONF7, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
1463
enum_da_from_slot_map);
1464
static SOC_ENUM_SINGLE_DECL(soc_enum_da8slotmap,
1465
AB8500_DASLOTCONF8, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
1466
enum_da_from_slot_map);
1467
1468
/* Digital interface - AD to slot mapping */
1469
static const char * const enum_ad_to_slot_map[] = {"AD_OUT1",
1470
"AD_OUT2",
1471
"AD_OUT3",
1472
"AD_OUT4",
1473
"AD_OUT5",
1474
"AD_OUT6",
1475
"AD_OUT7",
1476
"AD_OUT8",
1477
"zeroes",
1478
"zeroes",
1479
"zeroes",
1480
"zeroes",
1481
"tristate",
1482
"tristate",
1483
"tristate",
1484
"tristate"};
1485
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot0map,
1486
AB8500_ADSLOTSEL1, AB8500_ADSLOTSELX_EVEN_SHIFT,
1487
enum_ad_to_slot_map);
1488
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot1map,
1489
AB8500_ADSLOTSEL1, AB8500_ADSLOTSELX_ODD_SHIFT,
1490
enum_ad_to_slot_map);
1491
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot2map,
1492
AB8500_ADSLOTSEL2, AB8500_ADSLOTSELX_EVEN_SHIFT,
1493
enum_ad_to_slot_map);
1494
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot3map,
1495
AB8500_ADSLOTSEL2, AB8500_ADSLOTSELX_ODD_SHIFT,
1496
enum_ad_to_slot_map);
1497
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot4map,
1498
AB8500_ADSLOTSEL3, AB8500_ADSLOTSELX_EVEN_SHIFT,
1499
enum_ad_to_slot_map);
1500
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot5map,
1501
AB8500_ADSLOTSEL3, AB8500_ADSLOTSELX_ODD_SHIFT,
1502
enum_ad_to_slot_map);
1503
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot6map,
1504
AB8500_ADSLOTSEL4, AB8500_ADSLOTSELX_EVEN_SHIFT,
1505
enum_ad_to_slot_map);
1506
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot7map,
1507
AB8500_ADSLOTSEL4, AB8500_ADSLOTSELX_ODD_SHIFT,
1508
enum_ad_to_slot_map);
1509
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot8map,
1510
AB8500_ADSLOTSEL5, AB8500_ADSLOTSELX_EVEN_SHIFT,
1511
enum_ad_to_slot_map);
1512
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot9map,
1513
AB8500_ADSLOTSEL5, AB8500_ADSLOTSELX_ODD_SHIFT,
1514
enum_ad_to_slot_map);
1515
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot10map,
1516
AB8500_ADSLOTSEL6, AB8500_ADSLOTSELX_EVEN_SHIFT,
1517
enum_ad_to_slot_map);
1518
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot11map,
1519
AB8500_ADSLOTSEL6, AB8500_ADSLOTSELX_ODD_SHIFT,
1520
enum_ad_to_slot_map);
1521
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot12map,
1522
AB8500_ADSLOTSEL7, AB8500_ADSLOTSELX_EVEN_SHIFT,
1523
enum_ad_to_slot_map);
1524
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot13map,
1525
AB8500_ADSLOTSEL7, AB8500_ADSLOTSELX_ODD_SHIFT,
1526
enum_ad_to_slot_map);
1527
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot14map,
1528
AB8500_ADSLOTSEL8, AB8500_ADSLOTSELX_EVEN_SHIFT,
1529
enum_ad_to_slot_map);
1530
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot15map,
1531
AB8500_ADSLOTSEL8, AB8500_ADSLOTSELX_ODD_SHIFT,
1532
enum_ad_to_slot_map);
1533
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot16map,
1534
AB8500_ADSLOTSEL9, AB8500_ADSLOTSELX_EVEN_SHIFT,
1535
enum_ad_to_slot_map);
1536
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot17map,
1537
AB8500_ADSLOTSEL9, AB8500_ADSLOTSELX_ODD_SHIFT,
1538
enum_ad_to_slot_map);
1539
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot18map,
1540
AB8500_ADSLOTSEL10, AB8500_ADSLOTSELX_EVEN_SHIFT,
1541
enum_ad_to_slot_map);
1542
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot19map,
1543
AB8500_ADSLOTSEL10, AB8500_ADSLOTSELX_ODD_SHIFT,
1544
enum_ad_to_slot_map);
1545
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot20map,
1546
AB8500_ADSLOTSEL11, AB8500_ADSLOTSELX_EVEN_SHIFT,
1547
enum_ad_to_slot_map);
1548
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot21map,
1549
AB8500_ADSLOTSEL11, AB8500_ADSLOTSELX_ODD_SHIFT,
1550
enum_ad_to_slot_map);
1551
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot22map,
1552
AB8500_ADSLOTSEL12, AB8500_ADSLOTSELX_EVEN_SHIFT,
1553
enum_ad_to_slot_map);
1554
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot23map,
1555
AB8500_ADSLOTSEL12, AB8500_ADSLOTSELX_ODD_SHIFT,
1556
enum_ad_to_slot_map);
1557
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot24map,
1558
AB8500_ADSLOTSEL13, AB8500_ADSLOTSELX_EVEN_SHIFT,
1559
enum_ad_to_slot_map);
1560
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot25map,
1561
AB8500_ADSLOTSEL13, AB8500_ADSLOTSELX_ODD_SHIFT,
1562
enum_ad_to_slot_map);
1563
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot26map,
1564
AB8500_ADSLOTSEL14, AB8500_ADSLOTSELX_EVEN_SHIFT,
1565
enum_ad_to_slot_map);
1566
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot27map,
1567
AB8500_ADSLOTSEL14, AB8500_ADSLOTSELX_ODD_SHIFT,
1568
enum_ad_to_slot_map);
1569
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot28map,
1570
AB8500_ADSLOTSEL15, AB8500_ADSLOTSELX_EVEN_SHIFT,
1571
enum_ad_to_slot_map);
1572
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot29map,
1573
AB8500_ADSLOTSEL15, AB8500_ADSLOTSELX_ODD_SHIFT,
1574
enum_ad_to_slot_map);
1575
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot30map,
1576
AB8500_ADSLOTSEL16, AB8500_ADSLOTSELX_EVEN_SHIFT,
1577
enum_ad_to_slot_map);
1578
static SOC_ENUM_SINGLE_DECL(soc_enum_adslot31map,
1579
AB8500_ADSLOTSEL16, AB8500_ADSLOTSELX_ODD_SHIFT,
1580
enum_ad_to_slot_map);
1581
1582
/* Digital interface - Burst mode */
1583
static const char * const enum_mask[] = {"Unmasked", "Masked"};
1584
static SOC_ENUM_SINGLE_DECL(soc_enum_bfifomask,
1585
AB8500_FIFOCONF1, AB8500_FIFOCONF1_BFIFOMASK,
1586
enum_mask);
1587
static const char * const enum_bitclk0[] = {"19_2_MHz", "38_4_MHz"};
1588
static SOC_ENUM_SINGLE_DECL(soc_enum_bfifo19m2,
1589
AB8500_FIFOCONF1, AB8500_FIFOCONF1_BFIFO19M2,
1590
enum_bitclk0);
1591
static const char * const enum_slavemaster[] = {"Slave", "Master"};
1592
static SOC_ENUM_SINGLE_DECL(soc_enum_bfifomast,
1593
AB8500_FIFOCONF3, AB8500_FIFOCONF3_BFIFOMAST_SHIFT,
1594
enum_slavemaster);
1595
1596
/* Sidetone */
1597
static SOC_ENUM_SINGLE_EXT_DECL(soc_enum_sidstate, enum_sid_state);
1598
1599
/* ANC */
1600
static SOC_ENUM_SINGLE_EXT_DECL(soc_enum_ancstate, enum_anc_state);
1601
1602
static struct snd_kcontrol_new ab8500_ctrls[] = {
1603
/* Charge pump */
1604
SOC_ENUM("Charge Pump High Threshold For Low Voltage",
1605
soc_enum_envdeththre),
1606
SOC_ENUM("Charge Pump Low Threshold For Low Voltage",
1607
soc_enum_envdetlthre),
1608
SOC_SINGLE("Charge Pump Envelope Detection Switch",
1609
AB8500_SIGENVCONF, AB8500_SIGENVCONF_ENVDETCPEN,
1610
1, 0),
1611
SOC_ENUM("Charge Pump Envelope Detection Decay Time",
1612
soc_enum_envdettime),
1613
1614
/* Headset */
1615
SOC_ENUM("Headset Mode", soc_enum_da12voice),
1616
SOC_SINGLE("Headset High Pass Switch",
1617
AB8500_ANACONF1, AB8500_ANACONF1_HSHPEN,
1618
1, 0),
1619
SOC_SINGLE("Headset Low Power Switch",
1620
AB8500_ANACONF1, AB8500_ANACONF1_HSLOWPOW,
1621
1, 0),
1622
SOC_SINGLE("Headset DAC Low Power Switch",
1623
AB8500_ANACONF1, AB8500_ANACONF1_DACLOWPOW1,
1624
1, 0),
1625
SOC_SINGLE("Headset DAC Drv Low Power Switch",
1626
AB8500_ANACONF1, AB8500_ANACONF1_DACLOWPOW0,
1627
1, 0),
1628
SOC_ENUM("Headset Fade Speed", soc_enum_hsfadspeed),
1629
SOC_ENUM("Headset Source", soc_enum_da2hslr),
1630
SOC_ENUM("Headset Filter", soc_enum_hsesinc),
1631
SOC_DOUBLE_R_TLV("Headset Master Volume",
1632
AB8500_DADIGGAIN1, AB8500_DADIGGAIN2,
1633
0, AB8500_DADIGGAINX_DAXGAIN_MAX, 1, dax_dig_gain_tlv),
1634
SOC_DOUBLE_R_TLV("Headset Digital Volume",
1635
AB8500_HSLEARDIGGAIN, AB8500_HSRDIGGAIN,
1636
0, AB8500_HSLEARDIGGAIN_HSLDGAIN_MAX, 1, hs_ear_dig_gain_tlv),
1637
SOC_DOUBLE_TLV("Headset Volume",
1638
AB8500_ANAGAIN3,
1639
AB8500_ANAGAIN3_HSLGAIN, AB8500_ANAGAIN3_HSRGAIN,
1640
AB8500_ANAGAIN3_HSXGAIN_MAX, 1, hs_gain_tlv),
1641
1642
/* Earpiece */
1643
SOC_ENUM("Earpiece DAC Mode",
1644
soc_enum_eardaclowpow),
1645
SOC_ENUM("Earpiece DAC Drv Mode",
1646
soc_enum_eardrvlowpow),
1647
1648
/* HandsFree */
1649
SOC_ENUM("HF Mode", soc_enum_da34voice),
1650
SOC_SINGLE("HF and Headset Swap Switch",
1651
AB8500_DASLOTCONF1, AB8500_DASLOTCONF1_SWAPDA12_34,
1652
1, 0),
1653
SOC_DOUBLE("HF Low EMI Mode Switch",
1654
AB8500_CLASSDCONF1,
1655
AB8500_CLASSDCONF1_HFLSWAPEN, AB8500_CLASSDCONF1_HFRSWAPEN,
1656
1, 0),
1657
SOC_DOUBLE("HF FIR Bypass Switch",
1658
AB8500_CLASSDCONF2,
1659
AB8500_CLASSDCONF2_FIRBYP0, AB8500_CLASSDCONF2_FIRBYP1,
1660
1, 0),
1661
SOC_DOUBLE("HF High Volume Switch",
1662
AB8500_CLASSDCONF2,
1663
AB8500_CLASSDCONF2_HIGHVOLEN0, AB8500_CLASSDCONF2_HIGHVOLEN1,
1664
1, 0),
1665
SOC_SINGLE("HF L and R Bridge Switch",
1666
AB8500_CLASSDCONF1, AB8500_CLASSDCONF1_PARLHF,
1667
1, 0),
1668
SOC_DOUBLE_R_TLV("HF Master Volume",
1669
AB8500_DADIGGAIN3, AB8500_DADIGGAIN4,
1670
0, AB8500_DADIGGAINX_DAXGAIN_MAX, 1, dax_dig_gain_tlv),
1671
1672
/* Vibra */
1673
SOC_DOUBLE("Vibra High Volume Switch",
1674
AB8500_CLASSDCONF2,
1675
AB8500_CLASSDCONF2_HIGHVOLEN2, AB8500_CLASSDCONF2_HIGHVOLEN3,
1676
1, 0),
1677
SOC_DOUBLE("Vibra Low EMI Mode Switch",
1678
AB8500_CLASSDCONF1,
1679
AB8500_CLASSDCONF1_VIB1SWAPEN, AB8500_CLASSDCONF1_VIB2SWAPEN,
1680
1, 0),
1681
SOC_DOUBLE("Vibra FIR Bypass Switch",
1682
AB8500_CLASSDCONF2,
1683
AB8500_CLASSDCONF2_FIRBYP2, AB8500_CLASSDCONF2_FIRBYP3,
1684
1, 0),
1685
SOC_ENUM("Vibra Mode", soc_enum_da56voice),
1686
SOC_DOUBLE_R("Vibra PWM Duty Cycle N",
1687
AB8500_PWMGENCONF3, AB8500_PWMGENCONF5,
1688
AB8500_PWMGENCONFX_PWMVIBXDUTCYC,
1689
AB8500_PWMGENCONFX_PWMVIBXDUTCYC_MAX, 0),
1690
SOC_DOUBLE_R("Vibra PWM Duty Cycle P",
1691
AB8500_PWMGENCONF2, AB8500_PWMGENCONF4,
1692
AB8500_PWMGENCONFX_PWMVIBXDUTCYC,
1693
AB8500_PWMGENCONFX_PWMVIBXDUTCYC_MAX, 0),
1694
SOC_SINGLE("Vibra 1 and 2 Bridge Switch",
1695
AB8500_CLASSDCONF1, AB8500_CLASSDCONF1_PARLVIB,
1696
1, 0),
1697
SOC_DOUBLE_R_TLV("Vibra Master Volume",
1698
AB8500_DADIGGAIN5, AB8500_DADIGGAIN6,
1699
0, AB8500_DADIGGAINX_DAXGAIN_MAX, 1, dax_dig_gain_tlv),
1700
1701
/* HandsFree, Vibra */
1702
SOC_SINGLE("ClassD High Pass Volume",
1703
AB8500_CLASSDCONF3, AB8500_CLASSDCONF3_DITHHPGAIN,
1704
AB8500_CLASSDCONF3_DITHHPGAIN_MAX, 0),
1705
SOC_SINGLE("ClassD White Volume",
1706
AB8500_CLASSDCONF3, AB8500_CLASSDCONF3_DITHWGAIN,
1707
AB8500_CLASSDCONF3_DITHWGAIN_MAX, 0),
1708
1709
/* Mic 1, Mic 2, LineIn */
1710
SOC_DOUBLE_R_TLV("Mic Master Volume",
1711
AB8500_ADDIGGAIN3, AB8500_ADDIGGAIN4,
1712
0, AB8500_ADDIGGAINX_ADXGAIN_MAX, 1, adx_dig_gain_tlv),
1713
1714
/* Mic 1 */
1715
SOC_SINGLE_TLV("Mic 1",
1716
AB8500_ANAGAIN1,
1717
AB8500_ANAGAINX_MICXGAIN,
1718
AB8500_ANAGAINX_MICXGAIN_MAX, 0, mic_gain_tlv),
1719
SOC_SINGLE("Mic 1 Low Power Switch",
1720
AB8500_ANAGAIN1, AB8500_ANAGAINX_LOWPOWMICX,
1721
1, 0),
1722
1723
/* Mic 2 */
1724
SOC_DOUBLE("Mic High Pass Switch",
1725
AB8500_ADFILTCONF,
1726
AB8500_ADFILTCONF_AD3NH, AB8500_ADFILTCONF_AD4NH,
1727
1, 1),
1728
SOC_ENUM("Mic Mode", soc_enum_ad34voice),
1729
SOC_ENUM("Mic Filter", soc_enum_dmic34sinc),
1730
SOC_SINGLE_TLV("Mic 2",
1731
AB8500_ANAGAIN2,
1732
AB8500_ANAGAINX_MICXGAIN,
1733
AB8500_ANAGAINX_MICXGAIN_MAX, 0, mic_gain_tlv),
1734
SOC_SINGLE("Mic 2 Low Power Switch",
1735
AB8500_ANAGAIN2, AB8500_ANAGAINX_LOWPOWMICX,
1736
1, 0),
1737
1738
/* LineIn */
1739
SOC_DOUBLE("LineIn High Pass Switch",
1740
AB8500_ADFILTCONF,
1741
AB8500_ADFILTCONF_AD1NH, AB8500_ADFILTCONF_AD2NH,
1742
1, 1),
1743
SOC_ENUM("LineIn Filter", soc_enum_dmic12sinc),
1744
SOC_ENUM("LineIn Mode", soc_enum_ad12voice),
1745
SOC_DOUBLE_R_TLV("LineIn Master Volume",
1746
AB8500_ADDIGGAIN1, AB8500_ADDIGGAIN2,
1747
0, AB8500_ADDIGGAINX_ADXGAIN_MAX, 1, adx_dig_gain_tlv),
1748
SOC_DOUBLE_TLV("LineIn",
1749
AB8500_ANAGAIN4,
1750
AB8500_ANAGAIN4_LINLGAIN, AB8500_ANAGAIN4_LINRGAIN,
1751
AB8500_ANAGAIN4_LINXGAIN_MAX, 0, lin_gain_tlv),
1752
SOC_DOUBLE_R_TLV("LineIn to Headset Volume",
1753
AB8500_DIGLINHSLGAIN, AB8500_DIGLINHSRGAIN,
1754
AB8500_DIGLINHSXGAIN_LINTOHSXGAIN,
1755
AB8500_DIGLINHSXGAIN_LINTOHSXGAIN_MAX,
1756
1, lin2hs_gain_tlv),
1757
1758
/* DMic */
1759
SOC_ENUM("DMic Filter", soc_enum_dmic56sinc),
1760
SOC_DOUBLE_R_TLV("DMic Master Volume",
1761
AB8500_ADDIGGAIN5, AB8500_ADDIGGAIN6,
1762
0, AB8500_ADDIGGAINX_ADXGAIN_MAX, 1, adx_dig_gain_tlv),
1763
1764
/* Digital gains */
1765
SOC_ENUM("Digital Gain Fade Speed", soc_enum_fadespeed),
1766
1767
/* Analog loopback */
1768
SOC_DOUBLE_R_TLV("Analog Loopback Volume",
1769
AB8500_ADDIGLOOPGAIN1, AB8500_ADDIGLOOPGAIN2,
1770
0, AB8500_ADDIGLOOPGAINX_ADXLBGAIN_MAX, 1, dax_dig_gain_tlv),
1771
1772
/* Digital interface - DA from slot mapping */
1773
SOC_ENUM("Digital Interface DA 1 From Slot Map", soc_enum_da1slotmap),
1774
SOC_ENUM("Digital Interface DA 2 From Slot Map", soc_enum_da2slotmap),
1775
SOC_ENUM("Digital Interface DA 3 From Slot Map", soc_enum_da3slotmap),
1776
SOC_ENUM("Digital Interface DA 4 From Slot Map", soc_enum_da4slotmap),
1777
SOC_ENUM("Digital Interface DA 5 From Slot Map", soc_enum_da5slotmap),
1778
SOC_ENUM("Digital Interface DA 6 From Slot Map", soc_enum_da6slotmap),
1779
SOC_ENUM("Digital Interface DA 7 From Slot Map", soc_enum_da7slotmap),
1780
SOC_ENUM("Digital Interface DA 8 From Slot Map", soc_enum_da8slotmap),
1781
1782
/* Digital interface - AD to slot mapping */
1783
SOC_ENUM("Digital Interface AD To Slot 0 Map", soc_enum_adslot0map),
1784
SOC_ENUM("Digital Interface AD To Slot 1 Map", soc_enum_adslot1map),
1785
SOC_ENUM("Digital Interface AD To Slot 2 Map", soc_enum_adslot2map),
1786
SOC_ENUM("Digital Interface AD To Slot 3 Map", soc_enum_adslot3map),
1787
SOC_ENUM("Digital Interface AD To Slot 4 Map", soc_enum_adslot4map),
1788
SOC_ENUM("Digital Interface AD To Slot 5 Map", soc_enum_adslot5map),
1789
SOC_ENUM("Digital Interface AD To Slot 6 Map", soc_enum_adslot6map),
1790
SOC_ENUM("Digital Interface AD To Slot 7 Map", soc_enum_adslot7map),
1791
SOC_ENUM("Digital Interface AD To Slot 8 Map", soc_enum_adslot8map),
1792
SOC_ENUM("Digital Interface AD To Slot 9 Map", soc_enum_adslot9map),
1793
SOC_ENUM("Digital Interface AD To Slot 10 Map", soc_enum_adslot10map),
1794
SOC_ENUM("Digital Interface AD To Slot 11 Map", soc_enum_adslot11map),
1795
SOC_ENUM("Digital Interface AD To Slot 12 Map", soc_enum_adslot12map),
1796
SOC_ENUM("Digital Interface AD To Slot 13 Map", soc_enum_adslot13map),
1797
SOC_ENUM("Digital Interface AD To Slot 14 Map", soc_enum_adslot14map),
1798
SOC_ENUM("Digital Interface AD To Slot 15 Map", soc_enum_adslot15map),
1799
SOC_ENUM("Digital Interface AD To Slot 16 Map", soc_enum_adslot16map),
1800
SOC_ENUM("Digital Interface AD To Slot 17 Map", soc_enum_adslot17map),
1801
SOC_ENUM("Digital Interface AD To Slot 18 Map", soc_enum_adslot18map),
1802
SOC_ENUM("Digital Interface AD To Slot 19 Map", soc_enum_adslot19map),
1803
SOC_ENUM("Digital Interface AD To Slot 20 Map", soc_enum_adslot20map),
1804
SOC_ENUM("Digital Interface AD To Slot 21 Map", soc_enum_adslot21map),
1805
SOC_ENUM("Digital Interface AD To Slot 22 Map", soc_enum_adslot22map),
1806
SOC_ENUM("Digital Interface AD To Slot 23 Map", soc_enum_adslot23map),
1807
SOC_ENUM("Digital Interface AD To Slot 24 Map", soc_enum_adslot24map),
1808
SOC_ENUM("Digital Interface AD To Slot 25 Map", soc_enum_adslot25map),
1809
SOC_ENUM("Digital Interface AD To Slot 26 Map", soc_enum_adslot26map),
1810
SOC_ENUM("Digital Interface AD To Slot 27 Map", soc_enum_adslot27map),
1811
SOC_ENUM("Digital Interface AD To Slot 28 Map", soc_enum_adslot28map),
1812
SOC_ENUM("Digital Interface AD To Slot 29 Map", soc_enum_adslot29map),
1813
SOC_ENUM("Digital Interface AD To Slot 30 Map", soc_enum_adslot30map),
1814
SOC_ENUM("Digital Interface AD To Slot 31 Map", soc_enum_adslot31map),
1815
1816
/* Digital interface - Loopback */
1817
SOC_SINGLE("Digital Interface AD 1 Loopback Switch",
1818
AB8500_DASLOTCONF1, AB8500_DASLOTCONF1_DAI7TOADO1,
1819
1, 0),
1820
SOC_SINGLE("Digital Interface AD 2 Loopback Switch",
1821
AB8500_DASLOTCONF2, AB8500_DASLOTCONF2_DAI8TOADO2,
1822
1, 0),
1823
SOC_SINGLE("Digital Interface AD 3 Loopback Switch",
1824
AB8500_DASLOTCONF3, AB8500_DASLOTCONF3_DAI7TOADO3,
1825
1, 0),
1826
SOC_SINGLE("Digital Interface AD 4 Loopback Switch",
1827
AB8500_DASLOTCONF4, AB8500_DASLOTCONF4_DAI8TOADO4,
1828
1, 0),
1829
SOC_SINGLE("Digital Interface AD 5 Loopback Switch",
1830
AB8500_DASLOTCONF5, AB8500_DASLOTCONF5_DAI7TOADO5,
1831
1, 0),
1832
SOC_SINGLE("Digital Interface AD 6 Loopback Switch",
1833
AB8500_DASLOTCONF6, AB8500_DASLOTCONF6_DAI8TOADO6,
1834
1, 0),
1835
SOC_SINGLE("Digital Interface AD 7 Loopback Switch",
1836
AB8500_DASLOTCONF7, AB8500_DASLOTCONF7_DAI8TOADO7,
1837
1, 0),
1838
SOC_SINGLE("Digital Interface AD 8 Loopback Switch",
1839
AB8500_DASLOTCONF8, AB8500_DASLOTCONF8_DAI7TOADO8,
1840
1, 0),
1841
1842
/* Digital interface - Burst FIFO */
1843
SOC_SINGLE("Digital Interface 0 FIFO Enable Switch",
1844
AB8500_DIGIFCONF3, AB8500_DIGIFCONF3_IF0BFIFOEN,
1845
1, 0),
1846
SOC_ENUM("Burst FIFO Mask", soc_enum_bfifomask),
1847
SOC_ENUM("Burst FIFO Bit-clock Frequency", soc_enum_bfifo19m2),
1848
SOC_SINGLE("Burst FIFO Threshold",
1849
AB8500_FIFOCONF1, AB8500_FIFOCONF1_BFIFOINT_SHIFT,
1850
AB8500_FIFOCONF1_BFIFOINT_MAX, 0),
1851
SOC_SINGLE("Burst FIFO Length",
1852
AB8500_FIFOCONF2, AB8500_FIFOCONF2_BFIFOTX_SHIFT,
1853
AB8500_FIFOCONF2_BFIFOTX_MAX, 0),
1854
SOC_SINGLE("Burst FIFO EOS Extra Slots",
1855
AB8500_FIFOCONF3, AB8500_FIFOCONF3_BFIFOEXSL_SHIFT,
1856
AB8500_FIFOCONF3_BFIFOEXSL_MAX, 0),
1857
SOC_SINGLE("Burst FIFO FS Extra Bit-clocks",
1858
AB8500_FIFOCONF3, AB8500_FIFOCONF3_PREBITCLK0_SHIFT,
1859
AB8500_FIFOCONF3_PREBITCLK0_MAX, 0),
1860
SOC_ENUM("Burst FIFO Interface Mode", soc_enum_bfifomast),
1861
1862
SOC_SINGLE("Burst FIFO Interface Switch",
1863
AB8500_FIFOCONF3, AB8500_FIFOCONF3_BFIFORUN_SHIFT,
1864
1, 0),
1865
SOC_SINGLE("Burst FIFO Switch Frame Number",
1866
AB8500_FIFOCONF4, AB8500_FIFOCONF4_BFIFOFRAMSW_SHIFT,
1867
AB8500_FIFOCONF4_BFIFOFRAMSW_MAX, 0),
1868
SOC_SINGLE("Burst FIFO Wake Up Delay",
1869
AB8500_FIFOCONF5, AB8500_FIFOCONF5_BFIFOWAKEUP_SHIFT,
1870
AB8500_FIFOCONF5_BFIFOWAKEUP_MAX, 0),
1871
SOC_SINGLE("Burst FIFO Samples In FIFO",
1872
AB8500_FIFOCONF6, AB8500_FIFOCONF6_BFIFOSAMPLE_SHIFT,
1873
AB8500_FIFOCONF6_BFIFOSAMPLE_MAX, 0),
1874
1875
/* ANC */
1876
SOC_ENUM_EXT("ANC Status", soc_enum_ancstate,
1877
anc_status_control_get, anc_status_control_put),
1878
SOC_SINGLE_XR_SX("ANC Warp Delay Shift",
1879
AB8500_ANCCONF2, 1, AB8500_ANCCONF2_SHIFT,
1880
AB8500_ANCCONF2_MIN, AB8500_ANCCONF2_MAX, 0),
1881
SOC_SINGLE_XR_SX("ANC FIR Output Shift",
1882
AB8500_ANCCONF3, 1, AB8500_ANCCONF3_SHIFT,
1883
AB8500_ANCCONF3_MIN, AB8500_ANCCONF3_MAX, 0),
1884
SOC_SINGLE_XR_SX("ANC IIR Output Shift",
1885
AB8500_ANCCONF4, 1, AB8500_ANCCONF4_SHIFT,
1886
AB8500_ANCCONF4_MIN, AB8500_ANCCONF4_MAX, 0),
1887
SOC_SINGLE_XR_SX("ANC Warp Delay",
1888
AB8500_ANCCONF9, 2, AB8500_ANC_WARP_DELAY_SHIFT,
1889
AB8500_ANC_WARP_DELAY_MIN, AB8500_ANC_WARP_DELAY_MAX, 0),
1890
1891
/* Sidetone */
1892
SOC_ENUM_EXT("Sidetone Status", soc_enum_sidstate,
1893
sid_status_control_get, sid_status_control_put),
1894
SOC_SINGLE_STROBE("Sidetone Reset",
1895
AB8500_SIDFIRADR, AB8500_SIDFIRADR_FIRSIDSET, 0),
1896
};
1897
1898
static struct snd_kcontrol_new ab8500_filter_controls[] = {
1899
AB8500_FILTER_CONTROL("ANC FIR Coefficients", AB8500_ANC_FIR_COEFFS,
1900
AB8500_ANC_FIR_COEFF_MIN, AB8500_ANC_FIR_COEFF_MAX),
1901
AB8500_FILTER_CONTROL("ANC IIR Coefficients", AB8500_ANC_IIR_COEFFS,
1902
AB8500_ANC_IIR_COEFF_MIN, AB8500_ANC_IIR_COEFF_MAX),
1903
AB8500_FILTER_CONTROL("Sidetone FIR Coefficients",
1904
AB8500_SID_FIR_COEFFS, AB8500_SID_FIR_COEFF_MIN,
1905
AB8500_SID_FIR_COEFF_MAX)
1906
};
1907
enum ab8500_filter {
1908
AB8500_FILTER_ANC_FIR = 0,
1909
AB8500_FILTER_ANC_IIR = 1,
1910
AB8500_FILTER_SID_FIR = 2,
1911
};
1912
1913
/*
1914
* Extended interface for codec-driver
1915
*/
1916
1917
static int ab8500_audio_init_audioblock(struct snd_soc_component *component)
1918
{
1919
int status;
1920
1921
dev_dbg(component->dev, "%s: Enter.\n", __func__);
1922
1923
/* Reset audio-registers and disable 32kHz-clock output 2 */
1924
status = ab8500_sysctrl_write(AB8500_STW4500CTRL3,
1925
AB8500_STW4500CTRL3_CLK32KOUT2DIS |
1926
AB8500_STW4500CTRL3_RESETAUDN,
1927
AB8500_STW4500CTRL3_RESETAUDN);
1928
if (status < 0)
1929
return status;
1930
1931
return 0;
1932
}
1933
1934
static int ab8500_audio_setup_mics(struct snd_soc_component *component,
1935
struct amic_settings *amics)
1936
{
1937
struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
1938
u8 value8;
1939
unsigned int value;
1940
int status;
1941
const struct snd_soc_dapm_route *route;
1942
1943
dev_dbg(component->dev, "%s: Enter.\n", __func__);
1944
1945
/* Set DMic-clocks to outputs */
1946
status = abx500_get_register_interruptible(component->dev, AB8500_MISC,
1947
AB8500_GPIO_DIR4_REG,
1948
&value8);
1949
if (status < 0)
1950
return status;
1951
value = value8 | GPIO27_DIR_OUTPUT | GPIO29_DIR_OUTPUT |
1952
GPIO31_DIR_OUTPUT;
1953
status = abx500_set_register_interruptible(component->dev,
1954
AB8500_MISC,
1955
AB8500_GPIO_DIR4_REG,
1956
value);
1957
if (status < 0)
1958
return status;
1959
1960
/* Attach regulators to AMic DAPM-paths */
1961
dev_dbg(component->dev, "%s: Mic 1a regulator: %s\n", __func__,
1962
amic_micbias_str(amics->mic1a_micbias));
1963
route = &ab8500_dapm_routes_mic1a_vamicx[amics->mic1a_micbias];
1964
status = snd_soc_dapm_add_routes(dapm, route, 1);
1965
dev_dbg(component->dev, "%s: Mic 1b regulator: %s\n", __func__,
1966
amic_micbias_str(amics->mic1b_micbias));
1967
route = &ab8500_dapm_routes_mic1b_vamicx[amics->mic1b_micbias];
1968
status |= snd_soc_dapm_add_routes(dapm, route, 1);
1969
dev_dbg(component->dev, "%s: Mic 2 regulator: %s\n", __func__,
1970
amic_micbias_str(amics->mic2_micbias));
1971
route = &ab8500_dapm_routes_mic2_vamicx[amics->mic2_micbias];
1972
status |= snd_soc_dapm_add_routes(dapm, route, 1);
1973
if (status < 0) {
1974
dev_err(component->dev,
1975
"%s: Failed to add AMic-regulator DAPM-routes (%d).\n",
1976
__func__, status);
1977
return status;
1978
}
1979
1980
/* Set AMic-configuration */
1981
dev_dbg(component->dev, "%s: Mic 1 mic-type: %s\n", __func__,
1982
amic_type_str(amics->mic1_type));
1983
snd_soc_component_update_bits(component, AB8500_ANAGAIN1, AB8500_ANAGAINX_ENSEMICX,
1984
amics->mic1_type == AMIC_TYPE_DIFFERENTIAL ?
1985
0 : AB8500_ANAGAINX_ENSEMICX);
1986
dev_dbg(component->dev, "%s: Mic 2 mic-type: %s\n", __func__,
1987
amic_type_str(amics->mic2_type));
1988
snd_soc_component_update_bits(component, AB8500_ANAGAIN2, AB8500_ANAGAINX_ENSEMICX,
1989
amics->mic2_type == AMIC_TYPE_DIFFERENTIAL ?
1990
0 : AB8500_ANAGAINX_ENSEMICX);
1991
1992
return 0;
1993
}
1994
1995
static int ab8500_audio_set_ear_cmv(struct snd_soc_component *component,
1996
enum ear_cm_voltage ear_cmv)
1997
{
1998
char *cmv_str;
1999
2000
switch (ear_cmv) {
2001
case EAR_CMV_0_95V:
2002
cmv_str = "0.95V";
2003
break;
2004
case EAR_CMV_1_10V:
2005
cmv_str = "1.10V";
2006
break;
2007
case EAR_CMV_1_27V:
2008
cmv_str = "1.27V";
2009
break;
2010
case EAR_CMV_1_58V:
2011
cmv_str = "1.58V";
2012
break;
2013
default:
2014
dev_err(component->dev,
2015
"%s: Unknown earpiece CM-voltage (%d)!\n",
2016
__func__, (int)ear_cmv);
2017
return -EINVAL;
2018
}
2019
dev_dbg(component->dev, "%s: Earpiece CM-voltage: %s\n", __func__,
2020
cmv_str);
2021
snd_soc_component_update_bits(component, AB8500_ANACONF1, AB8500_ANACONF1_EARSELCM,
2022
ear_cmv);
2023
2024
return 0;
2025
}
2026
2027
static int ab8500_audio_set_bit_delay(struct snd_soc_dai *dai,
2028
unsigned int delay)
2029
{
2030
unsigned int mask, val;
2031
struct snd_soc_component *component = dai->component;
2032
2033
mask = BIT(AB8500_DIGIFCONF2_IF0DEL);
2034
val = 0;
2035
2036
switch (delay) {
2037
case 0:
2038
break;
2039
case 1:
2040
val |= BIT(AB8500_DIGIFCONF2_IF0DEL);
2041
break;
2042
default:
2043
dev_err(dai->component->dev,
2044
"%s: ERROR: Unsupported bit-delay (0x%x)!\n",
2045
__func__, delay);
2046
return -EINVAL;
2047
}
2048
2049
dev_dbg(dai->component->dev, "%s: IF0 Bit-delay: %d bits.\n",
2050
__func__, delay);
2051
snd_soc_component_update_bits(component, AB8500_DIGIFCONF2, mask, val);
2052
2053
return 0;
2054
}
2055
2056
/* Gates clocking according format mask */
2057
static int ab8500_codec_set_dai_clock_gate(struct snd_soc_component *component,
2058
unsigned int fmt)
2059
{
2060
unsigned int mask;
2061
unsigned int val;
2062
2063
mask = BIT(AB8500_DIGIFCONF1_ENMASTGEN) |
2064
BIT(AB8500_DIGIFCONF1_ENFSBITCLK0);
2065
2066
val = BIT(AB8500_DIGIFCONF1_ENMASTGEN);
2067
2068
switch (fmt & SND_SOC_DAIFMT_CLOCK_MASK) {
2069
case SND_SOC_DAIFMT_CONT: /* continuous clock */
2070
dev_dbg(component->dev, "%s: IF0 Clock is continuous.\n",
2071
__func__);
2072
val |= BIT(AB8500_DIGIFCONF1_ENFSBITCLK0);
2073
break;
2074
case SND_SOC_DAIFMT_GATED: /* clock is gated */
2075
dev_dbg(component->dev, "%s: IF0 Clock is gated.\n",
2076
__func__);
2077
break;
2078
default:
2079
dev_err(component->dev,
2080
"%s: ERROR: Unsupported clock mask (0x%x)!\n",
2081
__func__, fmt & SND_SOC_DAIFMT_CLOCK_MASK);
2082
return -EINVAL;
2083
}
2084
2085
snd_soc_component_update_bits(component, AB8500_DIGIFCONF1, mask, val);
2086
2087
return 0;
2088
}
2089
2090
static int ab8500_codec_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
2091
{
2092
unsigned int mask;
2093
unsigned int val;
2094
struct snd_soc_component *component = dai->component;
2095
int status;
2096
2097
dev_dbg(component->dev, "%s: Enter (fmt = 0x%x)\n", __func__, fmt);
2098
2099
mask = BIT(AB8500_DIGIFCONF3_IF1DATOIF0AD) |
2100
BIT(AB8500_DIGIFCONF3_IF1CLKTOIF0CLK) |
2101
BIT(AB8500_DIGIFCONF3_IF0BFIFOEN) |
2102
BIT(AB8500_DIGIFCONF3_IF0MASTER);
2103
val = 0;
2104
2105
switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
2106
case SND_SOC_DAIFMT_CBP_CFP:
2107
dev_dbg(dai->component->dev,
2108
"%s: IF0 Master-mode: AB8500 provider.\n", __func__);
2109
val |= BIT(AB8500_DIGIFCONF3_IF0MASTER);
2110
break;
2111
case SND_SOC_DAIFMT_CBC_CFC:
2112
dev_dbg(dai->component->dev,
2113
"%s: IF0 Master-mode: AB8500 consumer.\n", __func__);
2114
break;
2115
case SND_SOC_DAIFMT_CBC_CFP:
2116
case SND_SOC_DAIFMT_CBP_CFC:
2117
dev_err(dai->component->dev,
2118
"%s: ERROR: The device is either a provider or a consumer.\n",
2119
__func__);
2120
fallthrough;
2121
default:
2122
dev_err(dai->component->dev,
2123
"%s: ERROR: Unsupporter clocking mask 0x%x\n",
2124
__func__, fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK);
2125
return -EINVAL;
2126
}
2127
2128
snd_soc_component_update_bits(component, AB8500_DIGIFCONF3, mask, val);
2129
2130
/* Set clock gating */
2131
status = ab8500_codec_set_dai_clock_gate(component, fmt);
2132
if (status) {
2133
dev_err(dai->component->dev,
2134
"%s: ERROR: Failed to set clock gate (%d).\n",
2135
__func__, status);
2136
return status;
2137
}
2138
2139
/* Setting data transfer format */
2140
2141
mask = BIT(AB8500_DIGIFCONF2_IF0FORMAT0) |
2142
BIT(AB8500_DIGIFCONF2_IF0FORMAT1) |
2143
BIT(AB8500_DIGIFCONF2_FSYNC0P) |
2144
BIT(AB8500_DIGIFCONF2_BITCLK0P);
2145
val = 0;
2146
2147
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
2148
case SND_SOC_DAIFMT_I2S: /* I2S mode */
2149
dev_dbg(dai->component->dev, "%s: IF0 Protocol: I2S\n", __func__);
2150
val |= BIT(AB8500_DIGIFCONF2_IF0FORMAT1);
2151
ab8500_audio_set_bit_delay(dai, 0);
2152
break;
2153
2154
case SND_SOC_DAIFMT_DSP_A: /* L data MSB after FRM LRC */
2155
dev_dbg(dai->component->dev,
2156
"%s: IF0 Protocol: DSP A (TDM)\n", __func__);
2157
val |= BIT(AB8500_DIGIFCONF2_IF0FORMAT0);
2158
ab8500_audio_set_bit_delay(dai, 1);
2159
break;
2160
2161
case SND_SOC_DAIFMT_DSP_B: /* L data MSB during FRM LRC */
2162
dev_dbg(dai->component->dev,
2163
"%s: IF0 Protocol: DSP B (TDM)\n", __func__);
2164
val |= BIT(AB8500_DIGIFCONF2_IF0FORMAT0);
2165
ab8500_audio_set_bit_delay(dai, 0);
2166
break;
2167
2168
default:
2169
dev_err(dai->component->dev,
2170
"%s: ERROR: Unsupported format (0x%x)!\n",
2171
__func__, fmt & SND_SOC_DAIFMT_FORMAT_MASK);
2172
return -EINVAL;
2173
}
2174
2175
switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
2176
case SND_SOC_DAIFMT_NB_NF: /* normal bit clock + frame */
2177
dev_dbg(dai->component->dev,
2178
"%s: IF0: Normal bit clock, normal frame\n",
2179
__func__);
2180
break;
2181
case SND_SOC_DAIFMT_NB_IF: /* normal BCLK + inv FRM */
2182
dev_dbg(dai->component->dev,
2183
"%s: IF0: Normal bit clock, inverted frame\n",
2184
__func__);
2185
val |= BIT(AB8500_DIGIFCONF2_FSYNC0P);
2186
break;
2187
case SND_SOC_DAIFMT_IB_NF: /* invert BCLK + nor FRM */
2188
dev_dbg(dai->component->dev,
2189
"%s: IF0: Inverted bit clock, normal frame\n",
2190
__func__);
2191
val |= BIT(AB8500_DIGIFCONF2_BITCLK0P);
2192
break;
2193
case SND_SOC_DAIFMT_IB_IF: /* invert BCLK + FRM */
2194
dev_dbg(dai->component->dev,
2195
"%s: IF0: Inverted bit clock, inverted frame\n",
2196
__func__);
2197
val |= BIT(AB8500_DIGIFCONF2_FSYNC0P);
2198
val |= BIT(AB8500_DIGIFCONF2_BITCLK0P);
2199
break;
2200
default:
2201
dev_err(dai->component->dev,
2202
"%s: ERROR: Unsupported INV mask 0x%x\n",
2203
__func__, fmt & SND_SOC_DAIFMT_INV_MASK);
2204
return -EINVAL;
2205
}
2206
2207
snd_soc_component_update_bits(component, AB8500_DIGIFCONF2, mask, val);
2208
2209
return 0;
2210
}
2211
2212
static int ab8500_codec_set_dai_tdm_slot(struct snd_soc_dai *dai,
2213
unsigned int tx_mask, unsigned int rx_mask,
2214
int slots, int slot_width)
2215
{
2216
struct snd_soc_component *component = dai->component;
2217
unsigned int val, mask, slot, slots_active;
2218
2219
mask = BIT(AB8500_DIGIFCONF2_IF0WL0) |
2220
BIT(AB8500_DIGIFCONF2_IF0WL1);
2221
val = 0;
2222
2223
switch (slot_width) {
2224
case 16:
2225
break;
2226
case 20:
2227
val |= BIT(AB8500_DIGIFCONF2_IF0WL0);
2228
break;
2229
case 24:
2230
val |= BIT(AB8500_DIGIFCONF2_IF0WL1);
2231
break;
2232
case 32:
2233
val |= BIT(AB8500_DIGIFCONF2_IF0WL1) |
2234
BIT(AB8500_DIGIFCONF2_IF0WL0);
2235
break;
2236
default:
2237
dev_err(dai->component->dev, "%s: Unsupported slot-width 0x%x\n",
2238
__func__, slot_width);
2239
return -EINVAL;
2240
}
2241
2242
dev_dbg(dai->component->dev, "%s: IF0 slot-width: %d bits.\n",
2243
__func__, slot_width);
2244
snd_soc_component_update_bits(component, AB8500_DIGIFCONF2, mask, val);
2245
2246
/* Setup TDM clocking according to slot count */
2247
dev_dbg(dai->component->dev, "%s: Slots, total: %d\n", __func__, slots);
2248
mask = BIT(AB8500_DIGIFCONF1_IF0BITCLKOS0) |
2249
BIT(AB8500_DIGIFCONF1_IF0BITCLKOS1);
2250
switch (slots) {
2251
case 2:
2252
val = AB8500_MASK_NONE;
2253
break;
2254
case 4:
2255
val = BIT(AB8500_DIGIFCONF1_IF0BITCLKOS0);
2256
break;
2257
case 8:
2258
val = BIT(AB8500_DIGIFCONF1_IF0BITCLKOS1);
2259
break;
2260
case 16:
2261
val = BIT(AB8500_DIGIFCONF1_IF0BITCLKOS0) |
2262
BIT(AB8500_DIGIFCONF1_IF0BITCLKOS1);
2263
break;
2264
default:
2265
dev_err(dai->component->dev,
2266
"%s: ERROR: Unsupported number of slots (%d)!\n",
2267
__func__, slots);
2268
return -EINVAL;
2269
}
2270
snd_soc_component_update_bits(component, AB8500_DIGIFCONF1, mask, val);
2271
2272
/* Setup TDM DA according to active tx slots */
2273
2274
if (tx_mask & ~0xff)
2275
return -EINVAL;
2276
2277
mask = AB8500_DASLOTCONFX_SLTODAX_MASK;
2278
tx_mask = tx_mask << AB8500_DA_DATA0_OFFSET;
2279
slots_active = hweight32(tx_mask);
2280
2281
dev_dbg(dai->component->dev, "%s: Slots, active, TX: %d\n", __func__,
2282
slots_active);
2283
2284
switch (slots_active) {
2285
case 0:
2286
break;
2287
case 1:
2288
slot = ffs(tx_mask);
2289
snd_soc_component_update_bits(component, AB8500_DASLOTCONF1, mask, slot);
2290
snd_soc_component_update_bits(component, AB8500_DASLOTCONF3, mask, slot);
2291
snd_soc_component_update_bits(component, AB8500_DASLOTCONF2, mask, slot);
2292
snd_soc_component_update_bits(component, AB8500_DASLOTCONF4, mask, slot);
2293
break;
2294
case 2:
2295
slot = ffs(tx_mask);
2296
snd_soc_component_update_bits(component, AB8500_DASLOTCONF1, mask, slot);
2297
snd_soc_component_update_bits(component, AB8500_DASLOTCONF3, mask, slot);
2298
slot = fls(tx_mask);
2299
snd_soc_component_update_bits(component, AB8500_DASLOTCONF2, mask, slot);
2300
snd_soc_component_update_bits(component, AB8500_DASLOTCONF4, mask, slot);
2301
break;
2302
case 8:
2303
dev_dbg(dai->component->dev,
2304
"%s: In 8-channel mode DA-from-slot mapping is set manually.",
2305
__func__);
2306
break;
2307
default:
2308
dev_err(dai->component->dev,
2309
"%s: Unsupported number of active TX-slots (%d)!\n",
2310
__func__, slots_active);
2311
return -EINVAL;
2312
}
2313
2314
/* Setup TDM AD according to active RX-slots */
2315
2316
if (rx_mask & ~0xff)
2317
return -EINVAL;
2318
2319
rx_mask = rx_mask << AB8500_AD_DATA0_OFFSET;
2320
slots_active = hweight32(rx_mask);
2321
2322
dev_dbg(dai->component->dev, "%s: Slots, active, RX: %d\n", __func__,
2323
slots_active);
2324
2325
switch (slots_active) {
2326
case 0:
2327
break;
2328
case 1:
2329
slot = ffs(rx_mask);
2330
snd_soc_component_update_bits(component, AB8500_ADSLOTSEL(slot),
2331
AB8500_MASK_SLOT(slot),
2332
AB8500_ADSLOTSELX_AD_OUT_TO_SLOT(AB8500_AD_OUT3, slot));
2333
break;
2334
case 2:
2335
slot = ffs(rx_mask);
2336
snd_soc_component_update_bits(component,
2337
AB8500_ADSLOTSEL(slot),
2338
AB8500_MASK_SLOT(slot),
2339
AB8500_ADSLOTSELX_AD_OUT_TO_SLOT(AB8500_AD_OUT3, slot));
2340
slot = fls(rx_mask);
2341
snd_soc_component_update_bits(component,
2342
AB8500_ADSLOTSEL(slot),
2343
AB8500_MASK_SLOT(slot),
2344
AB8500_ADSLOTSELX_AD_OUT_TO_SLOT(AB8500_AD_OUT2, slot));
2345
break;
2346
case 8:
2347
dev_dbg(dai->component->dev,
2348
"%s: In 8-channel mode AD-to-slot mapping is set manually.",
2349
__func__);
2350
break;
2351
default:
2352
dev_err(dai->component->dev,
2353
"%s: Unsupported number of active RX-slots (%d)!\n",
2354
__func__, slots_active);
2355
return -EINVAL;
2356
}
2357
2358
return 0;
2359
}
2360
2361
static const struct snd_soc_dai_ops ab8500_codec_ops = {
2362
.set_fmt = ab8500_codec_set_dai_fmt,
2363
.set_tdm_slot = ab8500_codec_set_dai_tdm_slot,
2364
};
2365
2366
static struct snd_soc_dai_driver ab8500_codec_dai[] = {
2367
{
2368
.name = "ab8500-codec-dai.0",
2369
.id = 0,
2370
.playback = {
2371
.stream_name = "ab8500_0p",
2372
.channels_min = 1,
2373
.channels_max = 8,
2374
.rates = AB8500_SUPPORTED_RATE,
2375
.formats = AB8500_SUPPORTED_FMT,
2376
},
2377
.ops = &ab8500_codec_ops,
2378
.symmetric_rate = 1
2379
},
2380
{
2381
.name = "ab8500-codec-dai.1",
2382
.id = 1,
2383
.capture = {
2384
.stream_name = "ab8500_0c",
2385
.channels_min = 1,
2386
.channels_max = 8,
2387
.rates = AB8500_SUPPORTED_RATE,
2388
.formats = AB8500_SUPPORTED_FMT,
2389
},
2390
.ops = &ab8500_codec_ops,
2391
.symmetric_rate = 1
2392
}
2393
};
2394
2395
static void ab8500_codec_of_probe(struct device *dev, struct device_node *np,
2396
struct ab8500_codec_platform_data *codec)
2397
{
2398
u32 value;
2399
2400
if (of_property_read_bool(np, "stericsson,amic1-type-single-ended"))
2401
codec->amics.mic1_type = AMIC_TYPE_SINGLE_ENDED;
2402
else
2403
codec->amics.mic1_type = AMIC_TYPE_DIFFERENTIAL;
2404
2405
if (of_property_read_bool(np, "stericsson,amic2-type-single-ended"))
2406
codec->amics.mic2_type = AMIC_TYPE_SINGLE_ENDED;
2407
else
2408
codec->amics.mic2_type = AMIC_TYPE_DIFFERENTIAL;
2409
2410
/* Has a non-standard Vamic been requested? */
2411
if (of_property_read_bool(np, "stericsson,amic1a-bias-vamic2"))
2412
codec->amics.mic1a_micbias = AMIC_MICBIAS_VAMIC2;
2413
else
2414
codec->amics.mic1a_micbias = AMIC_MICBIAS_VAMIC1;
2415
2416
if (of_property_read_bool(np, "stericsson,amic1b-bias-vamic2"))
2417
codec->amics.mic1b_micbias = AMIC_MICBIAS_VAMIC2;
2418
else
2419
codec->amics.mic1b_micbias = AMIC_MICBIAS_VAMIC1;
2420
2421
if (of_property_read_bool(np, "stericsson,amic2-bias-vamic1"))
2422
codec->amics.mic2_micbias = AMIC_MICBIAS_VAMIC1;
2423
else
2424
codec->amics.mic2_micbias = AMIC_MICBIAS_VAMIC2;
2425
2426
if (!of_property_read_u32(np, "stericsson,earpeice-cmv", &value)) {
2427
switch (value) {
2428
case 950 :
2429
codec->ear_cmv = EAR_CMV_0_95V;
2430
break;
2431
case 1100 :
2432
codec->ear_cmv = EAR_CMV_1_10V;
2433
break;
2434
case 1270 :
2435
codec->ear_cmv = EAR_CMV_1_27V;
2436
break;
2437
case 1580 :
2438
codec->ear_cmv = EAR_CMV_1_58V;
2439
break;
2440
default :
2441
codec->ear_cmv = EAR_CMV_UNKNOWN;
2442
dev_err(dev, "Unsuitable earpiece voltage found in DT\n");
2443
}
2444
} else {
2445
dev_warn(dev, "No earpiece voltage found in DT - using default\n");
2446
codec->ear_cmv = EAR_CMV_0_95V;
2447
}
2448
}
2449
2450
static int ab8500_codec_probe(struct snd_soc_component *component)
2451
{
2452
struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
2453
struct device *dev = component->dev;
2454
struct device_node *np = dev->of_node;
2455
struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(dev);
2456
struct ab8500_codec_platform_data codec_pdata;
2457
struct filter_control *fc;
2458
int status;
2459
2460
dev_dbg(dev, "%s: Enter.\n", __func__);
2461
2462
ab8500_codec_of_probe(dev, np, &codec_pdata);
2463
2464
status = ab8500_audio_setup_mics(component, &codec_pdata.amics);
2465
if (status < 0) {
2466
pr_err("%s: Failed to setup mics (%d)!\n", __func__, status);
2467
return status;
2468
}
2469
status = ab8500_audio_set_ear_cmv(component, codec_pdata.ear_cmv);
2470
if (status < 0) {
2471
pr_err("%s: Failed to set earpiece CM-voltage (%d)!\n",
2472
__func__, status);
2473
return status;
2474
}
2475
2476
status = ab8500_audio_init_audioblock(component);
2477
if (status < 0) {
2478
dev_err(dev, "%s: failed to init audio-block (%d)!\n",
2479
__func__, status);
2480
return status;
2481
}
2482
2483
/* Override HW-defaults */
2484
snd_soc_component_write(component, AB8500_ANACONF5,
2485
BIT(AB8500_ANACONF5_HSAUTOEN));
2486
snd_soc_component_write(component, AB8500_SHORTCIRCONF,
2487
BIT(AB8500_SHORTCIRCONF_HSZCDDIS));
2488
2489
/* Add filter controls */
2490
status = snd_soc_add_component_controls(component, ab8500_filter_controls,
2491
ARRAY_SIZE(ab8500_filter_controls));
2492
if (status < 0) {
2493
dev_err(dev,
2494
"%s: failed to add ab8500 filter controls (%d).\n",
2495
__func__, status);
2496
return status;
2497
}
2498
fc = (struct filter_control *)
2499
&ab8500_filter_controls[AB8500_FILTER_ANC_FIR].private_value;
2500
drvdata->anc_fir_values = (long *)fc->value;
2501
fc = (struct filter_control *)
2502
&ab8500_filter_controls[AB8500_FILTER_ANC_IIR].private_value;
2503
drvdata->anc_iir_values = (long *)fc->value;
2504
fc = (struct filter_control *)
2505
&ab8500_filter_controls[AB8500_FILTER_SID_FIR].private_value;
2506
drvdata->sid_fir_values = (long *)fc->value;
2507
2508
snd_soc_dapm_disable_pin(dapm, "ANC Configure Input");
2509
2510
mutex_init(&drvdata->ctrl_lock);
2511
2512
return status;
2513
}
2514
2515
static const struct snd_soc_component_driver ab8500_component_driver = {
2516
.probe = ab8500_codec_probe,
2517
.controls = ab8500_ctrls,
2518
.num_controls = ARRAY_SIZE(ab8500_ctrls),
2519
.dapm_widgets = ab8500_dapm_widgets,
2520
.num_dapm_widgets = ARRAY_SIZE(ab8500_dapm_widgets),
2521
.dapm_routes = ab8500_dapm_routes,
2522
.num_dapm_routes = ARRAY_SIZE(ab8500_dapm_routes),
2523
.idle_bias_on = 1,
2524
.use_pmdown_time = 1,
2525
.endianness = 1,
2526
};
2527
2528
static int ab8500_codec_driver_probe(struct platform_device *pdev)
2529
{
2530
int status;
2531
struct ab8500_codec_drvdata *drvdata;
2532
2533
dev_dbg(&pdev->dev, "%s: Enter.\n", __func__);
2534
2535
/* Create driver private-data struct */
2536
drvdata = devm_kzalloc(&pdev->dev, sizeof(struct ab8500_codec_drvdata),
2537
GFP_KERNEL);
2538
if (!drvdata)
2539
return -ENOMEM;
2540
drvdata->sid_status = SID_UNCONFIGURED;
2541
drvdata->anc_status = ANC_UNCONFIGURED;
2542
dev_set_drvdata(&pdev->dev, drvdata);
2543
2544
drvdata->regmap = devm_regmap_init(&pdev->dev, NULL, &pdev->dev,
2545
&ab8500_codec_regmap);
2546
if (IS_ERR(drvdata->regmap)) {
2547
status = PTR_ERR(drvdata->regmap);
2548
dev_err(&pdev->dev, "%s: Failed to allocate regmap: %d\n",
2549
__func__, status);
2550
return status;
2551
}
2552
2553
dev_dbg(&pdev->dev, "%s: Register codec.\n", __func__);
2554
status = devm_snd_soc_register_component(&pdev->dev,
2555
&ab8500_component_driver,
2556
ab8500_codec_dai,
2557
ARRAY_SIZE(ab8500_codec_dai));
2558
if (status < 0)
2559
dev_err(&pdev->dev,
2560
"%s: Error: Failed to register codec (%d).\n",
2561
__func__, status);
2562
2563
return status;
2564
}
2565
2566
static struct platform_driver ab8500_codec_platform_driver = {
2567
.driver = {
2568
.name = "ab8500-codec",
2569
},
2570
.probe = ab8500_codec_driver_probe,
2571
};
2572
module_platform_driver(ab8500_codec_platform_driver);
2573
2574
MODULE_DESCRIPTION("ASoC AB8500 codec driver");
2575
MODULE_LICENSE("GPL v2");
2576
2577