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