1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) ST-Ericsson SA 2012
10 * Based on the early work done by:
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>
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>
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>
44 #include "ab8500-codec.h"
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
55 /* Macrocell register definitions */
56 #define AB8500_GPIO_DIR4_REG 0x13 /* Bank AB8500_MISC */
58 /* Nr of FIR/IIR-coeff banks in ANC-block */
59 #define AB8500_NR_OF_ANC_COEFF_BANKS 2
61 /* Minimum duration to keep ANC IIR Init bit high or
62 low before proceeding with the configuration sequence */
63 #define AB8500_ANC_SM_DELAY 2000
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} }
72 struct filter_control {
79 static const char * const enum_sid_state[] = {
87 SID_FIR_CONFIGURED = 2,
90 static const char * const enum_anc_state[] = {
93 "FIR and IIR are configured",
100 ANC_UNCONFIGURED = 0,
101 ANC_APPLY_FIR_IIR = 1,
102 ANC_FIR_IIR_CONFIGURED = 2,
104 ANC_FIR_CONFIGURED = 4,
106 ANC_IIR_CONFIGURED = 6
109 /* Analog microphones */
116 /* Private data for AB8500 device-driver */
117 struct ab8500_codec_drvdata {
118 struct regmap *regmap;
119 struct mutex ctrl_lock;
122 long *sid_fir_values;
123 enum sid_state sid_status;
126 long *anc_fir_values;
127 long *anc_iir_values;
128 enum anc_state anc_status;
131 static inline const char *amic_micbias_str(enum amic_micbias micbias)
134 case AMIC_MICBIAS_VAMIC1:
136 case AMIC_MICBIAS_VAMIC2:
143 static inline const char *amic_type_str(enum amic_type type)
146 case AMIC_TYPE_DIFFERENTIAL:
147 return "DIFFERENTIAL";
148 case AMIC_TYPE_SINGLE_ENDED:
149 return "SINGLE ENDED";
156 * Read'n'write functions
159 /* Read a register from the audio-bank of AB8500 */
160 static int ab8500_codec_read_reg(void *context, unsigned int reg,
163 struct device *dev = context;
167 status = abx500_get_register_interruptible(dev, AB8500_AUDIO,
169 *value = (unsigned int)value8;
174 /* Write to a register in the audio-bank of AB8500 */
175 static int ab8500_codec_write_reg(void *context, unsigned int reg,
178 struct device *dev = context;
180 return abx500_set_register_interruptible(dev, AB8500_AUDIO,
184 static const struct regmap_config ab8500_codec_regmap = {
185 .reg_read = ab8500_codec_read_reg,
186 .reg_write = ab8500_codec_write_reg,
195 /* Earpiece source selector */
196 static const char * const enum_ear_lineout_source[] = {"Headset Left",
198 static SOC_ENUM_SINGLE_DECL(dapm_enum_ear_lineout_source, AB8500_DMICFILTCONF,
199 AB8500_DMICFILTCONF_DA3TOEAR, enum_ear_lineout_source);
200 static const struct snd_kcontrol_new dapm_ear_lineout_source =
201 SOC_DAPM_ENUM("Earpiece or LineOut Mono Source",
202 dapm_enum_ear_lineout_source);
206 /* LineOut source selector */
207 static const char * const enum_lineout_source[] = {"Mono Path", "Stereo Path"};
208 static SOC_ENUM_DOUBLE_DECL(dapm_enum_lineout_source, AB8500_ANACONF5,
209 AB8500_ANACONF5_HSLDACTOLOL,
210 AB8500_ANACONF5_HSRDACTOLOR, enum_lineout_source);
211 static const struct snd_kcontrol_new dapm_lineout_source[] = {
212 SOC_DAPM_ENUM("LineOut Source", dapm_enum_lineout_source),
217 /* Speaker Left - ANC selector */
218 static const char * const enum_HFx_sel[] = {"Audio Path", "ANC"};
219 static SOC_ENUM_SINGLE_DECL(dapm_enum_HFl_sel, AB8500_DIGMULTCONF2,
220 AB8500_DIGMULTCONF2_HFLSEL, enum_HFx_sel);
221 static const struct snd_kcontrol_new dapm_HFl_select[] = {
222 SOC_DAPM_ENUM("Speaker Left Source", dapm_enum_HFl_sel),
225 /* Speaker Right - ANC selector */
226 static SOC_ENUM_SINGLE_DECL(dapm_enum_HFr_sel, AB8500_DIGMULTCONF2,
227 AB8500_DIGMULTCONF2_HFRSEL, enum_HFx_sel);
228 static const struct snd_kcontrol_new dapm_HFr_select[] = {
229 SOC_DAPM_ENUM("Speaker Right Source", dapm_enum_HFr_sel),
234 /* Mic 1 - Mic 1a or 1b selector */
235 static const char * const enum_mic1ab_sel[] = {"Mic 1b", "Mic 1a"};
236 static SOC_ENUM_SINGLE_DECL(dapm_enum_mic1ab_sel, AB8500_ANACONF3,
237 AB8500_ANACONF3_MIC1SEL, enum_mic1ab_sel);
238 static const struct snd_kcontrol_new dapm_mic1ab_mux[] = {
239 SOC_DAPM_ENUM("Mic 1a or 1b Select", dapm_enum_mic1ab_sel),
242 /* Mic 1 - AD3 - Mic 1 or DMic 3 selector */
243 static const char * const enum_ad3_sel[] = {"Mic 1", "DMic 3"};
244 static SOC_ENUM_SINGLE_DECL(dapm_enum_ad3_sel, AB8500_DIGMULTCONF1,
245 AB8500_DIGMULTCONF1_AD3SEL, enum_ad3_sel);
246 static const struct snd_kcontrol_new dapm_ad3_select[] = {
247 SOC_DAPM_ENUM("AD3 Source Select", dapm_enum_ad3_sel),
250 /* Mic 1 - AD6 - Mic 1 or DMic 6 selector */
251 static const char * const enum_ad6_sel[] = {"Mic 1", "DMic 6"};
252 static SOC_ENUM_SINGLE_DECL(dapm_enum_ad6_sel, AB8500_DIGMULTCONF1,
253 AB8500_DIGMULTCONF1_AD6SEL, enum_ad6_sel);
254 static const struct snd_kcontrol_new dapm_ad6_select[] = {
255 SOC_DAPM_ENUM("AD6 Source Select", dapm_enum_ad6_sel),
260 /* Mic 2 - AD5 - Mic 2 or DMic 5 selector */
261 static const char * const enum_ad5_sel[] = {"Mic 2", "DMic 5"};
262 static SOC_ENUM_SINGLE_DECL(dapm_enum_ad5_sel, AB8500_DIGMULTCONF1,
263 AB8500_DIGMULTCONF1_AD5SEL, enum_ad5_sel);
264 static const struct snd_kcontrol_new dapm_ad5_select[] = {
265 SOC_DAPM_ENUM("AD5 Source Select", dapm_enum_ad5_sel),
270 /* LineIn left - AD1 - LineIn Left or DMic 1 selector */
271 static const char * const enum_ad1_sel[] = {"LineIn Left", "DMic 1"};
272 static SOC_ENUM_SINGLE_DECL(dapm_enum_ad1_sel, AB8500_DIGMULTCONF1,
273 AB8500_DIGMULTCONF1_AD1SEL, enum_ad1_sel);
274 static const struct snd_kcontrol_new dapm_ad1_select[] = {
275 SOC_DAPM_ENUM("AD1 Source Select", dapm_enum_ad1_sel),
278 /* LineIn right - Mic 2 or LineIn Right selector */
279 static const char * const enum_mic2lr_sel[] = {"Mic 2", "LineIn Right"};
280 static SOC_ENUM_SINGLE_DECL(dapm_enum_mic2lr_sel, AB8500_ANACONF3,
281 AB8500_ANACONF3_LINRSEL, enum_mic2lr_sel);
282 static const struct snd_kcontrol_new dapm_mic2lr_select[] = {
283 SOC_DAPM_ENUM("Mic 2 or LINR Select", dapm_enum_mic2lr_sel),
286 /* LineIn right - AD2 - LineIn Right or DMic2 selector */
287 static const char * const enum_ad2_sel[] = {"LineIn Right", "DMic 2"};
288 static SOC_ENUM_SINGLE_DECL(dapm_enum_ad2_sel, AB8500_DIGMULTCONF1,
289 AB8500_DIGMULTCONF1_AD2SEL, enum_ad2_sel);
290 static const struct snd_kcontrol_new dapm_ad2_select[] = {
291 SOC_DAPM_ENUM("AD2 Source Select", dapm_enum_ad2_sel),
297 static const char * const enum_anc_in_sel[] = {"Mic 1 / DMic 6",
299 static SOC_ENUM_SINGLE_DECL(dapm_enum_anc_in_sel, AB8500_DMICFILTCONF,
300 AB8500_DMICFILTCONF_ANCINSEL, enum_anc_in_sel);
301 static const struct snd_kcontrol_new dapm_anc_in_select[] = {
302 SOC_DAPM_ENUM("ANC Source", dapm_enum_anc_in_sel),
305 /* ANC - Enable/Disable */
306 static const struct snd_kcontrol_new dapm_anc_enable[] = {
307 SOC_DAPM_SINGLE("Switch", AB8500_ANCCONF1,
308 AB8500_ANCCONF1_ENANC, 0, 0),
311 /* ANC to Earpiece - Mute */
312 static const struct snd_kcontrol_new dapm_anc_ear_mute[] = {
313 SOC_DAPM_SINGLE("Switch", AB8500_DIGMULTCONF1,
314 AB8500_DIGMULTCONF1_ANCSEL, 1, 0),
321 /* Sidetone left - Input selector */
322 static const char * const enum_stfir1_in_sel[] = {
323 "LineIn Left", "LineIn Right", "Mic 1", "Headset Left"
325 static SOC_ENUM_SINGLE_DECL(dapm_enum_stfir1_in_sel, AB8500_DIGMULTCONF2,
326 AB8500_DIGMULTCONF2_FIRSID1SEL, enum_stfir1_in_sel);
327 static const struct snd_kcontrol_new dapm_stfir1_in_select[] = {
328 SOC_DAPM_ENUM("Sidetone Left Source", dapm_enum_stfir1_in_sel),
331 /* Sidetone right path */
333 /* Sidetone right - Input selector */
334 static const char * const enum_stfir2_in_sel[] = {
335 "LineIn Right", "Mic 1", "DMic 4", "Headset Right"
337 static SOC_ENUM_SINGLE_DECL(dapm_enum_stfir2_in_sel, AB8500_DIGMULTCONF2,
338 AB8500_DIGMULTCONF2_FIRSID2SEL, enum_stfir2_in_sel);
339 static const struct snd_kcontrol_new dapm_stfir2_in_select[] = {
340 SOC_DAPM_ENUM("Sidetone Right Source", dapm_enum_stfir2_in_sel),
345 static const char * const enum_pwm2vibx[] = {"Audio Path", "PWM Generator"};
347 static SOC_ENUM_SINGLE_DECL(dapm_enum_pwm2vib1, AB8500_PWMGENCONF1,
348 AB8500_PWMGENCONF1_PWMTOVIB1, enum_pwm2vibx);
350 static const struct snd_kcontrol_new dapm_pwm2vib1[] = {
351 SOC_DAPM_ENUM("Vibra 1 Controller", dapm_enum_pwm2vib1),
354 static SOC_ENUM_SINGLE_DECL(dapm_enum_pwm2vib2, AB8500_PWMGENCONF1,
355 AB8500_PWMGENCONF1_PWMTOVIB2, enum_pwm2vibx);
357 static const struct snd_kcontrol_new dapm_pwm2vib2[] = {
358 SOC_DAPM_ENUM("Vibra 2 Controller", dapm_enum_pwm2vib2),
365 static const struct snd_soc_dapm_widget ab8500_dapm_widgets[] = {
368 SND_SOC_DAPM_CLOCK_SUPPLY("audioclk"),
371 SND_SOC_DAPM_REGULATOR_SUPPLY("V-AUD", 0, 0),
372 SND_SOC_DAPM_REGULATOR_SUPPLY("V-AMIC1", 0, 0),
373 SND_SOC_DAPM_REGULATOR_SUPPLY("V-AMIC2", 0, 0),
374 SND_SOC_DAPM_REGULATOR_SUPPLY("V-DMIC", 0, 0),
377 SND_SOC_DAPM_SUPPLY("Audio Power",
378 AB8500_POWERUP, AB8500_POWERUP_POWERUP, 0,
379 NULL, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
380 SND_SOC_DAPM_SUPPLY("Audio Analog Power",
381 AB8500_POWERUP, AB8500_POWERUP_ENANA, 0,
382 NULL, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
384 /* Main supply node */
385 SND_SOC_DAPM_SUPPLY("Main Supply", SND_SOC_NOPM, 0, 0,
386 NULL, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
390 SND_SOC_DAPM_INPUT("ADC Input"),
391 SND_SOC_DAPM_ADC("ADC", "ab8500_0c", SND_SOC_NOPM, 0, 0),
393 SND_SOC_DAPM_DAC("DAC", NULL, SND_SOC_NOPM, 0, 0),
394 SND_SOC_DAPM_OUTPUT("DAC Output"),
396 SND_SOC_DAPM_AIF_IN("DA_IN1", NULL, 0, SND_SOC_NOPM, 0, 0),
397 SND_SOC_DAPM_AIF_IN("DA_IN2", NULL, 0, SND_SOC_NOPM, 0, 0),
398 SND_SOC_DAPM_AIF_IN("DA_IN3", NULL, 0, SND_SOC_NOPM, 0, 0),
399 SND_SOC_DAPM_AIF_IN("DA_IN4", NULL, 0, SND_SOC_NOPM, 0, 0),
400 SND_SOC_DAPM_AIF_IN("DA_IN5", NULL, 0, SND_SOC_NOPM, 0, 0),
401 SND_SOC_DAPM_AIF_IN("DA_IN6", NULL, 0, SND_SOC_NOPM, 0, 0),
402 SND_SOC_DAPM_AIF_OUT("AD_OUT1", NULL, 0, SND_SOC_NOPM, 0, 0),
403 SND_SOC_DAPM_AIF_OUT("AD_OUT2", NULL, 0, SND_SOC_NOPM, 0, 0),
404 SND_SOC_DAPM_AIF_OUT("AD_OUT3", NULL, 0, SND_SOC_NOPM, 0, 0),
405 SND_SOC_DAPM_AIF_OUT("AD_OUT4", NULL, 0, SND_SOC_NOPM, 0, 0),
406 SND_SOC_DAPM_AIF_OUT("AD_OUT57", NULL, 0, SND_SOC_NOPM, 0, 0),
407 SND_SOC_DAPM_AIF_OUT("AD_OUT68", NULL, 0, SND_SOC_NOPM, 0, 0),
411 SND_SOC_DAPM_SUPPLY("Charge Pump", AB8500_ANACONF5,
412 AB8500_ANACONF5_ENCPHS, 0, NULL, 0),
414 SND_SOC_DAPM_DAC("DA1 Enable", "ab8500_0p",
415 AB8500_DAPATHENA, AB8500_DAPATHENA_ENDA1, 0),
416 SND_SOC_DAPM_DAC("DA2 Enable", "ab8500_0p",
417 AB8500_DAPATHENA, AB8500_DAPATHENA_ENDA2, 0),
419 SND_SOC_DAPM_PGA("HSL Digital Volume", SND_SOC_NOPM, 0, 0,
421 SND_SOC_DAPM_PGA("HSR Digital Volume", SND_SOC_NOPM, 0, 0,
424 SND_SOC_DAPM_DAC("HSL DAC", "ab8500_0p",
425 AB8500_DAPATHCONF, AB8500_DAPATHCONF_ENDACHSL, 0),
426 SND_SOC_DAPM_DAC("HSR DAC", "ab8500_0p",
427 AB8500_DAPATHCONF, AB8500_DAPATHCONF_ENDACHSR, 0),
428 SND_SOC_DAPM_MIXER("HSL DAC Mute", AB8500_MUTECONF,
429 AB8500_MUTECONF_MUTDACHSL, 1,
431 SND_SOC_DAPM_MIXER("HSR DAC Mute", AB8500_MUTECONF,
432 AB8500_MUTECONF_MUTDACHSR, 1,
434 SND_SOC_DAPM_DAC("HSL DAC Driver", "ab8500_0p",
435 AB8500_ANACONF3, AB8500_ANACONF3_ENDRVHSL, 0),
436 SND_SOC_DAPM_DAC("HSR DAC Driver", "ab8500_0p",
437 AB8500_ANACONF3, AB8500_ANACONF3_ENDRVHSR, 0),
439 SND_SOC_DAPM_MIXER("HSL Mute",
440 AB8500_MUTECONF, AB8500_MUTECONF_MUTHSL, 1,
442 SND_SOC_DAPM_MIXER("HSR Mute",
443 AB8500_MUTECONF, AB8500_MUTECONF_MUTHSR, 1,
445 SND_SOC_DAPM_MIXER("HSL Enable",
446 AB8500_ANACONF4, AB8500_ANACONF4_ENHSL, 0,
448 SND_SOC_DAPM_MIXER("HSR Enable",
449 AB8500_ANACONF4, AB8500_ANACONF4_ENHSR, 0,
451 SND_SOC_DAPM_PGA("HSL Volume",
454 SND_SOC_DAPM_PGA("HSR Volume",
458 SND_SOC_DAPM_OUTPUT("Headset Left"),
459 SND_SOC_DAPM_OUTPUT("Headset Right"),
463 SND_SOC_DAPM_MUX("LineOut Source",
464 SND_SOC_NOPM, 0, 0, dapm_lineout_source),
466 SND_SOC_DAPM_MIXER("LOL Disable HFL",
467 AB8500_ANACONF4, AB8500_ANACONF4_ENHFL, 1,
469 SND_SOC_DAPM_MIXER("LOR Disable HFR",
470 AB8500_ANACONF4, AB8500_ANACONF4_ENHFR, 1,
473 SND_SOC_DAPM_MIXER("LOL Enable",
474 AB8500_ANACONF5, AB8500_ANACONF5_ENLOL, 0,
476 SND_SOC_DAPM_MIXER("LOR Enable",
477 AB8500_ANACONF5, AB8500_ANACONF5_ENLOR, 0,
480 SND_SOC_DAPM_OUTPUT("LineOut Left"),
481 SND_SOC_DAPM_OUTPUT("LineOut Right"),
485 SND_SOC_DAPM_MUX("Earpiece or LineOut Mono Source",
486 SND_SOC_NOPM, 0, 0, &dapm_ear_lineout_source),
487 SND_SOC_DAPM_MIXER("EAR DAC",
488 AB8500_DAPATHCONF, AB8500_DAPATHCONF_ENDACEAR, 0,
490 SND_SOC_DAPM_MIXER("EAR Mute",
491 AB8500_MUTECONF, AB8500_MUTECONF_MUTEAR, 1,
493 SND_SOC_DAPM_MIXER("EAR Enable",
494 AB8500_ANACONF4, AB8500_ANACONF4_ENEAR, 0,
497 SND_SOC_DAPM_OUTPUT("Earpiece"),
501 SND_SOC_DAPM_MIXER("DA3 Channel Volume",
502 AB8500_DAPATHENA, AB8500_DAPATHENA_ENDA3, 0,
504 SND_SOC_DAPM_MIXER("DA4 Channel Volume",
505 AB8500_DAPATHENA, AB8500_DAPATHENA_ENDA4, 0,
507 SND_SOC_DAPM_MUX("Speaker Left Source",
508 SND_SOC_NOPM, 0, 0, dapm_HFl_select),
509 SND_SOC_DAPM_MUX("Speaker Right Source",
510 SND_SOC_NOPM, 0, 0, dapm_HFr_select),
511 SND_SOC_DAPM_MIXER("HFL DAC", AB8500_DAPATHCONF,
512 AB8500_DAPATHCONF_ENDACHFL, 0,
514 SND_SOC_DAPM_MIXER("HFR DAC",
515 AB8500_DAPATHCONF, AB8500_DAPATHCONF_ENDACHFR, 0,
517 SND_SOC_DAPM_MIXER("DA4 or ANC path to HfR",
518 AB8500_DIGMULTCONF2, AB8500_DIGMULTCONF2_DATOHFREN, 0,
520 SND_SOC_DAPM_MIXER("DA3 or ANC path to HfL",
521 AB8500_DIGMULTCONF2, AB8500_DIGMULTCONF2_DATOHFLEN, 0,
523 SND_SOC_DAPM_MIXER("HFL Enable",
524 AB8500_ANACONF4, AB8500_ANACONF4_ENHFL, 0,
526 SND_SOC_DAPM_MIXER("HFR Enable",
527 AB8500_ANACONF4, AB8500_ANACONF4_ENHFR, 0,
530 SND_SOC_DAPM_OUTPUT("Speaker Left"),
531 SND_SOC_DAPM_OUTPUT("Speaker Right"),
535 SND_SOC_DAPM_INPUT("PWMGEN1"),
536 SND_SOC_DAPM_INPUT("PWMGEN2"),
538 SND_SOC_DAPM_MIXER("DA5 Channel Volume",
539 AB8500_DAPATHENA, AB8500_DAPATHENA_ENDA5, 0,
541 SND_SOC_DAPM_MIXER("DA6 Channel Volume",
542 AB8500_DAPATHENA, AB8500_DAPATHENA_ENDA6, 0,
544 SND_SOC_DAPM_MIXER("VIB1 DAC",
545 AB8500_DAPATHCONF, AB8500_DAPATHCONF_ENDACVIB1, 0,
547 SND_SOC_DAPM_MIXER("VIB2 DAC",
548 AB8500_DAPATHCONF, AB8500_DAPATHCONF_ENDACVIB2, 0,
550 SND_SOC_DAPM_MUX("Vibra 1 Controller",
551 SND_SOC_NOPM, 0, 0, dapm_pwm2vib1),
552 SND_SOC_DAPM_MUX("Vibra 2 Controller",
553 SND_SOC_NOPM, 0, 0, dapm_pwm2vib2),
554 SND_SOC_DAPM_MIXER("VIB1 Enable",
555 AB8500_ANACONF4, AB8500_ANACONF4_ENVIB1, 0,
557 SND_SOC_DAPM_MIXER("VIB2 Enable",
558 AB8500_ANACONF4, AB8500_ANACONF4_ENVIB2, 0,
561 SND_SOC_DAPM_OUTPUT("Vibra 1"),
562 SND_SOC_DAPM_OUTPUT("Vibra 2"),
566 SND_SOC_DAPM_INPUT("Mic 1"),
568 SND_SOC_DAPM_MUX("Mic 1a or 1b Select",
569 SND_SOC_NOPM, 0, 0, dapm_mic1ab_mux),
570 SND_SOC_DAPM_MIXER("MIC1 Mute",
571 AB8500_ANACONF2, AB8500_ANACONF2_MUTMIC1, 1,
573 SND_SOC_DAPM_MIXER("MIC1A V-AMICx Enable",
574 AB8500_ANACONF2, AB8500_ANACONF2_ENMIC1, 0,
576 SND_SOC_DAPM_MIXER("MIC1B V-AMICx Enable",
577 AB8500_ANACONF2, AB8500_ANACONF2_ENMIC1, 0,
579 SND_SOC_DAPM_MIXER("MIC1 ADC",
580 AB8500_ANACONF3, AB8500_ANACONF3_ENADCMIC, 0,
582 SND_SOC_DAPM_MUX("AD3 Source Select",
583 SND_SOC_NOPM, 0, 0, dapm_ad3_select),
584 SND_SOC_DAPM_MIXER("AD3 Channel Volume",
587 SND_SOC_DAPM_MIXER("AD3 Enable",
588 AB8500_ADPATHENA, AB8500_ADPATHENA_ENAD34, 0,
593 SND_SOC_DAPM_INPUT("Mic 2"),
595 SND_SOC_DAPM_MIXER("MIC2 Mute",
596 AB8500_ANACONF2, AB8500_ANACONF2_MUTMIC2, 1,
598 SND_SOC_DAPM_MIXER("MIC2 V-AMICx Enable", AB8500_ANACONF2,
599 AB8500_ANACONF2_ENMIC2, 0,
604 SND_SOC_DAPM_INPUT("LineIn Left"),
605 SND_SOC_DAPM_INPUT("LineIn Right"),
607 SND_SOC_DAPM_MIXER("LINL Mute",
608 AB8500_ANACONF2, AB8500_ANACONF2_MUTLINL, 1,
610 SND_SOC_DAPM_MIXER("LINR Mute",
611 AB8500_ANACONF2, AB8500_ANACONF2_MUTLINR, 1,
613 SND_SOC_DAPM_MIXER("LINL Enable", AB8500_ANACONF2,
614 AB8500_ANACONF2_ENLINL, 0,
616 SND_SOC_DAPM_MIXER("LINR Enable", AB8500_ANACONF2,
617 AB8500_ANACONF2_ENLINR, 0,
620 /* LineIn Bypass path */
621 SND_SOC_DAPM_MIXER("LINL to HSL Volume",
624 SND_SOC_DAPM_MIXER("LINR to HSR Volume",
629 SND_SOC_DAPM_MUX("Mic 2 or LINR Select",
630 SND_SOC_NOPM, 0, 0, dapm_mic2lr_select),
631 SND_SOC_DAPM_MIXER("LINL ADC", AB8500_ANACONF3,
632 AB8500_ANACONF3_ENADCLINL, 0,
634 SND_SOC_DAPM_MIXER("LINR ADC", AB8500_ANACONF3,
635 AB8500_ANACONF3_ENADCLINR, 0,
637 SND_SOC_DAPM_MUX("AD1 Source Select",
638 SND_SOC_NOPM, 0, 0, dapm_ad1_select),
639 SND_SOC_DAPM_MUX("AD2 Source Select",
640 SND_SOC_NOPM, 0, 0, dapm_ad2_select),
641 SND_SOC_DAPM_MIXER("AD1 Channel Volume",
644 SND_SOC_DAPM_MIXER("AD2 Channel Volume",
648 SND_SOC_DAPM_MIXER("AD12 Enable",
649 AB8500_ADPATHENA, AB8500_ADPATHENA_ENAD12, 0,
652 /* HD Capture path */
654 SND_SOC_DAPM_MUX("AD5 Source Select",
655 SND_SOC_NOPM, 0, 0, dapm_ad5_select),
656 SND_SOC_DAPM_MUX("AD6 Source Select",
657 SND_SOC_NOPM, 0, 0, dapm_ad6_select),
658 SND_SOC_DAPM_MIXER("AD5 Channel Volume",
661 SND_SOC_DAPM_MIXER("AD6 Channel Volume",
664 SND_SOC_DAPM_MIXER("AD57 Enable",
665 AB8500_ADPATHENA, AB8500_ADPATHENA_ENAD5768, 0,
667 SND_SOC_DAPM_MIXER("AD68 Enable",
668 AB8500_ADPATHENA, AB8500_ADPATHENA_ENAD5768, 0,
671 /* Digital Microphone path */
673 SND_SOC_DAPM_INPUT("DMic 1"),
674 SND_SOC_DAPM_INPUT("DMic 2"),
675 SND_SOC_DAPM_INPUT("DMic 3"),
676 SND_SOC_DAPM_INPUT("DMic 4"),
677 SND_SOC_DAPM_INPUT("DMic 5"),
678 SND_SOC_DAPM_INPUT("DMic 6"),
680 SND_SOC_DAPM_MIXER("DMIC1",
681 AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC1, 0,
683 SND_SOC_DAPM_MIXER("DMIC2",
684 AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC2, 0,
686 SND_SOC_DAPM_MIXER("DMIC3",
687 AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC3, 0,
689 SND_SOC_DAPM_MIXER("DMIC4",
690 AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC4, 0,
692 SND_SOC_DAPM_MIXER("DMIC5",
693 AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC5, 0,
695 SND_SOC_DAPM_MIXER("DMIC6",
696 AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC6, 0,
698 SND_SOC_DAPM_MIXER("AD4 Channel Volume",
701 SND_SOC_DAPM_MIXER("AD4 Enable",
702 AB8500_ADPATHENA, AB8500_ADPATHENA_ENAD34,
705 /* Acoustical Noise Cancellation path */
707 SND_SOC_DAPM_INPUT("ANC Configure Input"),
708 SND_SOC_DAPM_OUTPUT("ANC Configure Output"),
710 SND_SOC_DAPM_MUX("ANC Source",
713 SND_SOC_DAPM_SWITCH("ANC",
716 SND_SOC_DAPM_SWITCH("ANC to Earpiece",
720 /* Sidetone Filter path */
722 SND_SOC_DAPM_MUX("Sidetone Left Source",
724 dapm_stfir1_in_select),
725 SND_SOC_DAPM_MUX("Sidetone Right Source",
727 dapm_stfir2_in_select),
728 SND_SOC_DAPM_MIXER("STFIR1 Control",
731 SND_SOC_DAPM_MIXER("STFIR2 Control",
734 SND_SOC_DAPM_MIXER("STFIR1 Volume",
737 SND_SOC_DAPM_MIXER("STFIR2 Volume",
745 static const struct snd_soc_dapm_route ab8500_dapm_routes[] = {
746 /* Power AB8500 audio-block when AD/DA is active */
747 {"Main Supply", NULL, "V-AUD"},
748 {"Main Supply", NULL, "audioclk"},
749 {"Main Supply", NULL, "Audio Power"},
750 {"Main Supply", NULL, "Audio Analog Power"},
752 {"DAC", NULL, "ab8500_0p"},
753 {"DAC", NULL, "Main Supply"},
754 {"ADC", NULL, "ab8500_0c"},
755 {"ADC", NULL, "Main Supply"},
758 {"ANC Configure Input", NULL, "Main Supply"},
759 {"ANC Configure Output", NULL, "ANC Configure Input"},
762 {"ADC", NULL, "ADC Input"},
763 {"DAC Output", NULL, "DAC"},
765 /* Powerup charge pump if DA1/2 is in use */
767 {"DA_IN1", NULL, "ab8500_0p"},
768 {"DA_IN1", NULL, "Charge Pump"},
769 {"DA_IN2", NULL, "ab8500_0p"},
770 {"DA_IN2", NULL, "Charge Pump"},
774 {"DA1 Enable", NULL, "DA_IN1"},
775 {"DA2 Enable", NULL, "DA_IN2"},
777 {"HSL Digital Volume", NULL, "DA1 Enable"},
778 {"HSR Digital Volume", NULL, "DA2 Enable"},
780 {"HSL DAC", NULL, "HSL Digital Volume"},
781 {"HSR DAC", NULL, "HSR Digital Volume"},
783 {"HSL DAC Mute", NULL, "HSL DAC"},
784 {"HSR DAC Mute", NULL, "HSR DAC"},
786 {"HSL DAC Driver", NULL, "HSL DAC Mute"},
787 {"HSR DAC Driver", NULL, "HSR DAC Mute"},
789 {"HSL Mute", NULL, "HSL DAC Driver"},
790 {"HSR Mute", NULL, "HSR DAC Driver"},
792 {"HSL Enable", NULL, "HSL Mute"},
793 {"HSR Enable", NULL, "HSR Mute"},
795 {"HSL Volume", NULL, "HSL Enable"},
796 {"HSR Volume", NULL, "HSR Enable"},
798 {"Headset Left", NULL, "HSL Volume"},
799 {"Headset Right", NULL, "HSR Volume"},
801 /* HF or LineOut path */
803 {"DA_IN3", NULL, "ab8500_0p"},
804 {"DA3 Channel Volume", NULL, "DA_IN3"},
805 {"DA_IN4", NULL, "ab8500_0p"},
806 {"DA4 Channel Volume", NULL, "DA_IN4"},
808 {"Speaker Left Source", "Audio Path", "DA3 Channel Volume"},
809 {"Speaker Right Source", "Audio Path", "DA4 Channel Volume"},
811 {"DA3 or ANC path to HfL", NULL, "Speaker Left Source"},
812 {"DA4 or ANC path to HfR", NULL, "Speaker Right Source"},
816 {"HFL DAC", NULL, "DA3 or ANC path to HfL"},
817 {"HFR DAC", NULL, "DA4 or ANC path to HfR"},
819 {"HFL Enable", NULL, "HFL DAC"},
820 {"HFR Enable", NULL, "HFR DAC"},
822 {"Speaker Left", NULL, "HFL Enable"},
823 {"Speaker Right", NULL, "HFR Enable"},
827 {"Earpiece or LineOut Mono Source", "Headset Left",
828 "HSL Digital Volume"},
829 {"Earpiece or LineOut Mono Source", "Speaker Left",
830 "DA3 or ANC path to HfL"},
832 {"EAR DAC", NULL, "Earpiece or LineOut Mono Source"},
834 {"EAR Mute", NULL, "EAR DAC"},
836 {"EAR Enable", NULL, "EAR Mute"},
838 {"Earpiece", NULL, "EAR Enable"},
840 /* LineOut path stereo */
842 {"LineOut Source", "Stereo Path", "HSL DAC Driver"},
843 {"LineOut Source", "Stereo Path", "HSR DAC Driver"},
845 /* LineOut path mono */
847 {"LineOut Source", "Mono Path", "EAR DAC"},
851 {"LOL Disable HFL", NULL, "LineOut Source"},
852 {"LOR Disable HFR", NULL, "LineOut Source"},
854 {"LOL Enable", NULL, "LOL Disable HFL"},
855 {"LOR Enable", NULL, "LOR Disable HFR"},
857 {"LineOut Left", NULL, "LOL Enable"},
858 {"LineOut Right", NULL, "LOR Enable"},
862 {"DA_IN5", NULL, "ab8500_0p"},
863 {"DA5 Channel Volume", NULL, "DA_IN5"},
864 {"DA_IN6", NULL, "ab8500_0p"},
865 {"DA6 Channel Volume", NULL, "DA_IN6"},
867 {"VIB1 DAC", NULL, "DA5 Channel Volume"},
868 {"VIB2 DAC", NULL, "DA6 Channel Volume"},
870 {"Vibra 1 Controller", "Audio Path", "VIB1 DAC"},
871 {"Vibra 2 Controller", "Audio Path", "VIB2 DAC"},
872 {"Vibra 1 Controller", "PWM Generator", "PWMGEN1"},
873 {"Vibra 2 Controller", "PWM Generator", "PWMGEN2"},
875 {"VIB1 Enable", NULL, "Vibra 1 Controller"},
876 {"VIB2 Enable", NULL, "Vibra 2 Controller"},
878 {"Vibra 1", NULL, "VIB1 Enable"},
879 {"Vibra 2", NULL, "VIB2 Enable"},
884 {"MIC2 V-AMICx Enable", NULL, "Mic 2"},
887 {"LINL Mute", NULL, "LineIn Left"},
888 {"LINR Mute", NULL, "LineIn Right"},
890 {"LINL Enable", NULL, "LINL Mute"},
891 {"LINR Enable", NULL, "LINR Mute"},
894 {"Mic 2 or LINR Select", "LineIn Right", "LINR Enable"},
895 {"Mic 2 or LINR Select", "Mic 2", "MIC2 V-AMICx Enable"},
897 {"LINL ADC", NULL, "LINL Enable"},
898 {"LINR ADC", NULL, "Mic 2 or LINR Select"},
900 {"AD1 Source Select", "LineIn Left", "LINL ADC"},
901 {"AD2 Source Select", "LineIn Right", "LINR ADC"},
903 {"AD1 Channel Volume", NULL, "AD1 Source Select"},
904 {"AD2 Channel Volume", NULL, "AD2 Source Select"},
906 {"AD12 Enable", NULL, "AD1 Channel Volume"},
907 {"AD12 Enable", NULL, "AD2 Channel Volume"},
909 {"AD_OUT1", NULL, "ab8500_0c"},
910 {"AD_OUT1", NULL, "AD12 Enable"},
911 {"AD_OUT2", NULL, "ab8500_0c"},
912 {"AD_OUT2", NULL, "AD12 Enable"},
916 {"MIC1 Mute", NULL, "Mic 1"},
918 {"MIC1A V-AMICx Enable", NULL, "MIC1 Mute"},
919 {"MIC1B V-AMICx Enable", NULL, "MIC1 Mute"},
921 {"Mic 1a or 1b Select", "Mic 1a", "MIC1A V-AMICx Enable"},
922 {"Mic 1a or 1b Select", "Mic 1b", "MIC1B V-AMICx Enable"},
924 {"MIC1 ADC", NULL, "Mic 1a or 1b Select"},
926 {"AD3 Source Select", "Mic 1", "MIC1 ADC"},
928 {"AD3 Channel Volume", NULL, "AD3 Source Select"},
930 {"AD3 Enable", NULL, "AD3 Channel Volume"},
932 {"AD_OUT3", NULL, "ab8500_0c"},
933 {"AD_OUT3", NULL, "AD3 Enable"},
935 /* HD Capture path */
937 {"AD5 Source Select", "Mic 2", "LINR ADC"},
938 {"AD6 Source Select", "Mic 1", "MIC1 ADC"},
940 {"AD5 Channel Volume", NULL, "AD5 Source Select"},
941 {"AD6 Channel Volume", NULL, "AD6 Source Select"},
943 {"AD57 Enable", NULL, "AD5 Channel Volume"},
944 {"AD68 Enable", NULL, "AD6 Channel Volume"},
946 {"AD_OUT57", NULL, "ab8500_0c"},
947 {"AD_OUT57", NULL, "AD57 Enable"},
948 {"AD_OUT68", NULL, "ab8500_0c"},
949 {"AD_OUT68", NULL, "AD68 Enable"},
951 /* Digital Microphone path */
953 {"DMic 1", NULL, "V-DMIC"},
954 {"DMic 2", NULL, "V-DMIC"},
955 {"DMic 3", NULL, "V-DMIC"},
956 {"DMic 4", NULL, "V-DMIC"},
957 {"DMic 5", NULL, "V-DMIC"},
958 {"DMic 6", NULL, "V-DMIC"},
960 {"AD1 Source Select", NULL, "DMic 1"},
961 {"AD2 Source Select", NULL, "DMic 2"},
962 {"AD3 Source Select", NULL, "DMic 3"},
963 {"AD5 Source Select", NULL, "DMic 5"},
964 {"AD6 Source Select", NULL, "DMic 6"},
966 {"AD4 Channel Volume", NULL, "DMic 4"},
967 {"AD4 Enable", NULL, "AD4 Channel Volume"},
969 {"AD_OUT4", NULL, "ab8500_0c"},
970 {"AD_OUT4", NULL, "AD4 Enable"},
972 /* LineIn Bypass path */
974 {"LINL to HSL Volume", NULL, "LINL Enable"},
975 {"LINR to HSR Volume", NULL, "LINR Enable"},
977 {"HSL DAC Driver", NULL, "LINL to HSL Volume"},
978 {"HSR DAC Driver", NULL, "LINR to HSR Volume"},
980 /* ANC path (Acoustic Noise Cancellation) */
982 {"ANC Source", "Mic 2 / DMic 5", "AD5 Channel Volume"},
983 {"ANC Source", "Mic 1 / DMic 6", "AD6 Channel Volume"},
985 {"ANC", "Switch", "ANC Source"},
987 {"Speaker Left Source", "ANC", "ANC"},
988 {"Speaker Right Source", "ANC", "ANC"},
989 {"ANC to Earpiece", "Switch", "ANC"},
991 {"HSL Digital Volume", NULL, "ANC to Earpiece"},
993 /* Sidetone Filter path */
995 {"Sidetone Left Source", "LineIn Left", "AD12 Enable"},
996 {"Sidetone Left Source", "LineIn Right", "AD12 Enable"},
997 {"Sidetone Left Source", "Mic 1", "AD3 Enable"},
998 {"Sidetone Left Source", "Headset Left", "DA_IN1"},
999 {"Sidetone Right Source", "LineIn Right", "AD12 Enable"},
1000 {"Sidetone Right Source", "Mic 1", "AD3 Enable"},
1001 {"Sidetone Right Source", "DMic 4", "AD4 Enable"},
1002 {"Sidetone Right Source", "Headset Right", "DA_IN2"},
1004 {"STFIR1 Control", NULL, "Sidetone Left Source"},
1005 {"STFIR2 Control", NULL, "Sidetone Right Source"},
1007 {"STFIR1 Volume", NULL, "STFIR1 Control"},
1008 {"STFIR2 Volume", NULL, "STFIR2 Control"},
1010 {"DA1 Enable", NULL, "STFIR1 Volume"},
1011 {"DA2 Enable", NULL, "STFIR2 Volume"},
1014 static const struct snd_soc_dapm_route ab8500_dapm_routes_mic1a_vamicx[] = {
1015 {"MIC1A V-AMICx Enable", NULL, "V-AMIC1"},
1016 {"MIC1A V-AMICx Enable", NULL, "V-AMIC2"},
1019 static const struct snd_soc_dapm_route ab8500_dapm_routes_mic1b_vamicx[] = {
1020 {"MIC1B V-AMICx Enable", NULL, "V-AMIC1"},
1021 {"MIC1B V-AMICx Enable", NULL, "V-AMIC2"},
1024 static const struct snd_soc_dapm_route ab8500_dapm_routes_mic2_vamicx[] = {
1025 {"MIC2 V-AMICx Enable", NULL, "V-AMIC1"},
1026 {"MIC2 V-AMICx Enable", NULL, "V-AMIC2"},
1029 /* ANC FIR-coefficients configuration sequence */
1030 static void anc_fir(struct snd_soc_component *component,
1031 unsigned int bnk, unsigned int par, unsigned int val)
1033 if (par == 0 && bnk == 0)
1034 snd_soc_component_update_bits(component, AB8500_ANCCONF1,
1035 BIT(AB8500_ANCCONF1_ANCFIRUPDATE),
1036 BIT(AB8500_ANCCONF1_ANCFIRUPDATE));
1038 snd_soc_component_write(component, AB8500_ANCCONF5, val >> 8 & 0xff);
1039 snd_soc_component_write(component, AB8500_ANCCONF6, val & 0xff);
1041 if (par == AB8500_ANC_FIR_COEFFS - 1 && bnk == 1)
1042 snd_soc_component_update_bits(component, AB8500_ANCCONF1,
1043 BIT(AB8500_ANCCONF1_ANCFIRUPDATE), 0);
1046 /* ANC IIR-coefficients configuration sequence */
1047 static void anc_iir(struct snd_soc_component *component, unsigned int bnk,
1048 unsigned int par, unsigned int val)
1052 snd_soc_component_update_bits(component, AB8500_ANCCONF1,
1053 BIT(AB8500_ANCCONF1_ANCIIRINIT),
1054 BIT(AB8500_ANCCONF1_ANCIIRINIT));
1055 usleep_range(AB8500_ANC_SM_DELAY, AB8500_ANC_SM_DELAY*2);
1056 snd_soc_component_update_bits(component, AB8500_ANCCONF1,
1057 BIT(AB8500_ANCCONF1_ANCIIRINIT), 0);
1058 usleep_range(AB8500_ANC_SM_DELAY, AB8500_ANC_SM_DELAY*2);
1060 snd_soc_component_update_bits(component, AB8500_ANCCONF1,
1061 BIT(AB8500_ANCCONF1_ANCIIRUPDATE),
1062 BIT(AB8500_ANCCONF1_ANCIIRUPDATE));
1064 } else if (par > 3) {
1065 snd_soc_component_write(component, AB8500_ANCCONF7, 0);
1066 snd_soc_component_write(component, AB8500_ANCCONF8, val >> 16 & 0xff);
1069 snd_soc_component_write(component, AB8500_ANCCONF7, val >> 8 & 0xff);
1070 snd_soc_component_write(component, AB8500_ANCCONF8, val & 0xff);
1072 if (par == AB8500_ANC_IIR_COEFFS - 1 && bnk == 1)
1073 snd_soc_component_update_bits(component, AB8500_ANCCONF1,
1074 BIT(AB8500_ANCCONF1_ANCIIRUPDATE), 0);
1077 /* ANC IIR-/FIR-coefficients configuration sequence */
1078 static void anc_configure(struct snd_soc_component *component,
1079 bool apply_fir, bool apply_iir)
1081 struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev);
1082 unsigned int bnk, par, val;
1084 dev_dbg(component->dev, "%s: Enter.\n", __func__);
1087 snd_soc_component_update_bits(component, AB8500_ANCCONF1,
1088 BIT(AB8500_ANCCONF1_ENANC), 0);
1090 snd_soc_component_update_bits(component, AB8500_ANCCONF1,
1091 BIT(AB8500_ANCCONF1_ENANC), BIT(AB8500_ANCCONF1_ENANC));
1094 for (bnk = 0; bnk < AB8500_NR_OF_ANC_COEFF_BANKS; bnk++)
1095 for (par = 0; par < AB8500_ANC_FIR_COEFFS; par++) {
1096 val = snd_soc_component_read(component,
1097 drvdata->anc_fir_values[par]);
1098 anc_fir(component, bnk, par, val);
1102 for (bnk = 0; bnk < AB8500_NR_OF_ANC_COEFF_BANKS; bnk++)
1103 for (par = 0; par < AB8500_ANC_IIR_COEFFS; par++) {
1104 val = snd_soc_component_read(component,
1105 drvdata->anc_iir_values[par]);
1106 anc_iir(component, bnk, par, val);
1109 dev_dbg(component->dev, "%s: Exit.\n", __func__);
1116 static int sid_status_control_get(struct snd_kcontrol *kcontrol,
1117 struct snd_ctl_elem_value *ucontrol)
1119 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1120 struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev);
1122 mutex_lock(&drvdata->ctrl_lock);
1123 ucontrol->value.enumerated.item[0] = drvdata->sid_status;
1124 mutex_unlock(&drvdata->ctrl_lock);
1129 /* Write sidetone FIR-coefficients configuration sequence */
1130 static int sid_status_control_put(struct snd_kcontrol *kcontrol,
1131 struct snd_ctl_elem_value *ucontrol)
1133 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1134 struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev);
1135 unsigned int param, sidconf, val;
1138 dev_dbg(component->dev, "%s: Enter\n", __func__);
1140 if (ucontrol->value.enumerated.item[0] != SID_APPLY_FIR) {
1141 dev_err(component->dev,
1142 "%s: ERROR: This control supports '%s' only!\n",
1143 __func__, enum_sid_state[SID_APPLY_FIR]);
1147 mutex_lock(&drvdata->ctrl_lock);
1149 sidconf = snd_soc_component_read(component, AB8500_SIDFIRCONF);
1150 if (((sidconf & BIT(AB8500_SIDFIRCONF_FIRSIDBUSY)) != 0)) {
1151 if ((sidconf & BIT(AB8500_SIDFIRCONF_ENFIRSIDS)) == 0) {
1152 dev_err(component->dev, "%s: Sidetone busy while off!\n",
1161 snd_soc_component_write(component, AB8500_SIDFIRADR, 0);
1163 for (param = 0; param < AB8500_SID_FIR_COEFFS; param++) {
1164 val = snd_soc_component_read(component, drvdata->sid_fir_values[param]);
1165 snd_soc_component_write(component, AB8500_SIDFIRCOEF1, val >> 8 & 0xff);
1166 snd_soc_component_write(component, AB8500_SIDFIRCOEF2, val & 0xff);
1169 snd_soc_component_update_bits(component, AB8500_SIDFIRADR,
1170 BIT(AB8500_SIDFIRADR_FIRSIDSET),
1171 BIT(AB8500_SIDFIRADR_FIRSIDSET));
1172 snd_soc_component_update_bits(component, AB8500_SIDFIRADR,
1173 BIT(AB8500_SIDFIRADR_FIRSIDSET), 0);
1175 drvdata->sid_status = SID_FIR_CONFIGURED;
1178 mutex_unlock(&drvdata->ctrl_lock);
1180 dev_dbg(component->dev, "%s: Exit\n", __func__);
1185 static int anc_status_control_get(struct snd_kcontrol *kcontrol,
1186 struct snd_ctl_elem_value *ucontrol)
1188 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1189 struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev);
1191 mutex_lock(&drvdata->ctrl_lock);
1192 ucontrol->value.enumerated.item[0] = drvdata->anc_status;
1193 mutex_unlock(&drvdata->ctrl_lock);
1198 static int anc_status_control_put(struct snd_kcontrol *kcontrol,
1199 struct snd_ctl_elem_value *ucontrol)
1201 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1202 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
1203 struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(component->dev);
1204 struct device *dev = component->dev;
1205 bool apply_fir, apply_iir;
1209 dev_dbg(dev, "%s: Enter.\n", __func__);
1211 mutex_lock(&drvdata->ctrl_lock);
1213 req = ucontrol->value.enumerated.item[0];
1214 if (req >= ARRAY_SIZE(enum_anc_state)) {
1218 if (req != ANC_APPLY_FIR_IIR && req != ANC_APPLY_FIR &&
1219 req != ANC_APPLY_IIR) {
1220 dev_err(dev, "%s: ERROR: Unsupported status to set '%s'!\n",
1221 __func__, enum_anc_state[req]);
1225 apply_fir = req == ANC_APPLY_FIR || req == ANC_APPLY_FIR_IIR;
1226 apply_iir = req == ANC_APPLY_IIR || req == ANC_APPLY_FIR_IIR;
1228 status = snd_soc_dapm_force_enable_pin(dapm, "ANC Configure Input");
1231 "%s: ERROR: Failed to enable power (status = %d)!\n",
1235 snd_soc_dapm_sync(dapm);
1237 anc_configure(component, apply_fir, apply_iir);
1240 if (drvdata->anc_status == ANC_IIR_CONFIGURED)
1241 drvdata->anc_status = ANC_FIR_IIR_CONFIGURED;
1242 else if (drvdata->anc_status != ANC_FIR_IIR_CONFIGURED)
1243 drvdata->anc_status = ANC_FIR_CONFIGURED;
1246 if (drvdata->anc_status == ANC_FIR_CONFIGURED)
1247 drvdata->anc_status = ANC_FIR_IIR_CONFIGURED;
1248 else if (drvdata->anc_status != ANC_FIR_IIR_CONFIGURED)
1249 drvdata->anc_status = ANC_IIR_CONFIGURED;
1252 status = snd_soc_dapm_disable_pin(dapm, "ANC Configure Input");
1253 snd_soc_dapm_sync(dapm);
1256 mutex_unlock(&drvdata->ctrl_lock);
1259 dev_err(dev, "%s: Unable to configure ANC! (status = %d)\n",
1262 dev_dbg(dev, "%s: Exit.\n", __func__);
1264 return (status < 0) ? status : 1;
1267 static int filter_control_info(struct snd_kcontrol *kcontrol,
1268 struct snd_ctl_elem_info *uinfo)
1270 struct filter_control *fc =
1271 (struct filter_control *)kcontrol->private_value;
1273 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1274 uinfo->count = fc->count;
1275 uinfo->value.integer.min = fc->min;
1276 uinfo->value.integer.max = fc->max;
1281 static int filter_control_get(struct snd_kcontrol *kcontrol,
1282 struct snd_ctl_elem_value *ucontrol)
1284 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1285 struct ab8500_codec_drvdata *drvdata = snd_soc_component_get_drvdata(component);
1286 struct filter_control *fc =
1287 (struct filter_control *)kcontrol->private_value;
1290 mutex_lock(&drvdata->ctrl_lock);
1291 for (i = 0; i < fc->count; i++)
1292 ucontrol->value.integer.value[i] = fc->value[i];
1293 mutex_unlock(&drvdata->ctrl_lock);
1298 static int filter_control_put(struct snd_kcontrol *kcontrol,
1299 struct snd_ctl_elem_value *ucontrol)
1301 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
1302 struct ab8500_codec_drvdata *drvdata = snd_soc_component_get_drvdata(component);
1303 struct filter_control *fc =
1304 (struct filter_control *)kcontrol->private_value;
1307 mutex_lock(&drvdata->ctrl_lock);
1308 for (i = 0; i < fc->count; i++)
1309 fc->value[i] = ucontrol->value.integer.value[i];
1310 mutex_unlock(&drvdata->ctrl_lock);
1316 * Controls - Non-DAPM ASoC
1319 static DECLARE_TLV_DB_SCALE(adx_dig_gain_tlv, -3200, 100, 1);
1322 static DECLARE_TLV_DB_SCALE(dax_dig_gain_tlv, -6300, 100, 1);
1325 static DECLARE_TLV_DB_SCALE(hs_ear_dig_gain_tlv, -100, 100, 1);
1328 static const DECLARE_TLV_DB_RANGE(hs_gain_tlv,
1329 0, 3, TLV_DB_SCALE_ITEM(-3200, 400, 0),
1330 4, 15, TLV_DB_SCALE_ITEM(-1800, 200, 0)
1333 static DECLARE_TLV_DB_SCALE(mic_gain_tlv, 0, 100, 0);
1335 static DECLARE_TLV_DB_SCALE(lin_gain_tlv, -1000, 200, 0);
1337 static DECLARE_TLV_DB_SCALE(lin2hs_gain_tlv, -3800, 200, 1);
1340 static const char * const enum_hsfadspeed[] = {"2ms", "0.5ms", "10.6ms",
1342 static SOC_ENUM_SINGLE_DECL(soc_enum_hsfadspeed,
1343 AB8500_DIGMICCONF, AB8500_DIGMICCONF_HSFADSPEED, enum_hsfadspeed);
1345 static const char * const enum_envdetthre[] = {
1346 "250mV", "300mV", "350mV", "400mV",
1347 "450mV", "500mV", "550mV", "600mV",
1348 "650mV", "700mV", "750mV", "800mV",
1349 "850mV", "900mV", "950mV", "1.00V" };
1350 static SOC_ENUM_SINGLE_DECL(soc_enum_envdeththre,
1351 AB8500_ENVCPCONF, AB8500_ENVCPCONF_ENVDETHTHRE, enum_envdetthre);
1352 static SOC_ENUM_SINGLE_DECL(soc_enum_envdetlthre,
1353 AB8500_ENVCPCONF, AB8500_ENVCPCONF_ENVDETLTHRE, enum_envdetthre);
1354 static const char * const enum_envdettime[] = {
1355 "26.6us", "53.2us", "106us", "213us",
1356 "426us", "851us", "1.70ms", "3.40ms",
1357 "6.81ms", "13.6ms", "27.2ms", "54.5ms",
1358 "109ms", "218ms", "436ms", "872ms" };
1359 static SOC_ENUM_SINGLE_DECL(soc_enum_envdettime,
1360 AB8500_SIGENVCONF, AB8500_SIGENVCONF_ENVDETTIME, enum_envdettime);
1362 static const char * const enum_sinc31[] = {"Sinc 3", "Sinc 1"};
1363 static SOC_ENUM_SINGLE_DECL(soc_enum_hsesinc, AB8500_HSLEARDIGGAIN,
1364 AB8500_HSLEARDIGGAIN_HSSINC1, enum_sinc31);
1366 static const char * const enum_fadespeed[] = {"1ms", "4ms", "8ms", "16ms"};
1367 static SOC_ENUM_SINGLE_DECL(soc_enum_fadespeed, AB8500_HSRDIGGAIN,
1368 AB8500_HSRDIGGAIN_FADESPEED, enum_fadespeed);
1372 static const char * const enum_lowpow[] = {"Normal", "Low Power"};
1373 static SOC_ENUM_SINGLE_DECL(soc_enum_eardaclowpow, AB8500_ANACONF1,
1374 AB8500_ANACONF1_EARDACLOWPOW, enum_lowpow);
1375 static SOC_ENUM_SINGLE_DECL(soc_enum_eardrvlowpow, AB8500_ANACONF1,
1376 AB8500_ANACONF1_EARDRVLOWPOW, enum_lowpow);
1378 static const char * const enum_av_mode[] = {"Audio", "Voice"};
1379 static SOC_ENUM_DOUBLE_DECL(soc_enum_ad12voice, AB8500_ADFILTCONF,
1380 AB8500_ADFILTCONF_AD1VOICE, AB8500_ADFILTCONF_AD2VOICE, enum_av_mode);
1381 static SOC_ENUM_DOUBLE_DECL(soc_enum_ad34voice, AB8500_ADFILTCONF,
1382 AB8500_ADFILTCONF_AD3VOICE, AB8500_ADFILTCONF_AD4VOICE, enum_av_mode);
1386 static SOC_ENUM_SINGLE_DECL(soc_enum_da12voice,
1387 AB8500_DASLOTCONF1, AB8500_DASLOTCONF1_DA12VOICE,
1389 static SOC_ENUM_SINGLE_DECL(soc_enum_da34voice,
1390 AB8500_DASLOTCONF3, AB8500_DASLOTCONF3_DA34VOICE,
1392 static SOC_ENUM_SINGLE_DECL(soc_enum_da56voice,
1393 AB8500_DASLOTCONF5, AB8500_DASLOTCONF5_DA56VOICE,
1396 static const char * const enum_da2hslr[] = {"Sidetone", "Audio Path"};
1397 static SOC_ENUM_DOUBLE_DECL(soc_enum_da2hslr, AB8500_DIGMULTCONF1,
1398 AB8500_DIGMULTCONF1_DATOHSLEN,
1399 AB8500_DIGMULTCONF1_DATOHSREN, enum_da2hslr);
1401 static const char * const enum_sinc53[] = {"Sinc 5", "Sinc 3"};
1402 static SOC_ENUM_DOUBLE_DECL(soc_enum_dmic12sinc, AB8500_DMICFILTCONF,
1403 AB8500_DMICFILTCONF_DMIC1SINC3,
1404 AB8500_DMICFILTCONF_DMIC2SINC3, enum_sinc53);
1405 static SOC_ENUM_DOUBLE_DECL(soc_enum_dmic34sinc, AB8500_DMICFILTCONF,
1406 AB8500_DMICFILTCONF_DMIC3SINC3,
1407 AB8500_DMICFILTCONF_DMIC4SINC3, enum_sinc53);
1408 static SOC_ENUM_DOUBLE_DECL(soc_enum_dmic56sinc, AB8500_DMICFILTCONF,
1409 AB8500_DMICFILTCONF_DMIC5SINC3,
1410 AB8500_DMICFILTCONF_DMIC6SINC3, enum_sinc53);
1412 /* Digital interface - DA from slot mapping */
1413 static const char * const enum_da_from_slot_map[] = {"SLOT0",
1445 static SOC_ENUM_SINGLE_DECL(soc_enum_da1slotmap,
1446 AB8500_DASLOTCONF1, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
1447 enum_da_from_slot_map);
1448 static SOC_ENUM_SINGLE_DECL(soc_enum_da2slotmap,
1449 AB8500_DASLOTCONF2, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
1450 enum_da_from_slot_map);
1451 static SOC_ENUM_SINGLE_DECL(soc_enum_da3slotmap,
1452 AB8500_DASLOTCONF3, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
1453 enum_da_from_slot_map);
1454 static SOC_ENUM_SINGLE_DECL(soc_enum_da4slotmap,
1455 AB8500_DASLOTCONF4, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
1456 enum_da_from_slot_map);
1457 static SOC_ENUM_SINGLE_DECL(soc_enum_da5slotmap,
1458 AB8500_DASLOTCONF5, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
1459 enum_da_from_slot_map);
1460 static SOC_ENUM_SINGLE_DECL(soc_enum_da6slotmap,
1461 AB8500_DASLOTCONF6, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
1462 enum_da_from_slot_map);
1463 static SOC_ENUM_SINGLE_DECL(soc_enum_da7slotmap,
1464 AB8500_DASLOTCONF7, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
1465 enum_da_from_slot_map);
1466 static SOC_ENUM_SINGLE_DECL(soc_enum_da8slotmap,
1467 AB8500_DASLOTCONF8, AB8500_DASLOTCONFX_SLTODAX_SHIFT,
1468 enum_da_from_slot_map);
1470 /* Digital interface - AD to slot mapping */
1471 static const char * const enum_ad_to_slot_map[] = {"AD_OUT1",
1487 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot0map,
1488 AB8500_ADSLOTSEL1, AB8500_ADSLOTSELX_EVEN_SHIFT,
1489 enum_ad_to_slot_map);
1490 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot1map,
1491 AB8500_ADSLOTSEL1, AB8500_ADSLOTSELX_ODD_SHIFT,
1492 enum_ad_to_slot_map);
1493 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot2map,
1494 AB8500_ADSLOTSEL2, AB8500_ADSLOTSELX_EVEN_SHIFT,
1495 enum_ad_to_slot_map);
1496 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot3map,
1497 AB8500_ADSLOTSEL2, AB8500_ADSLOTSELX_ODD_SHIFT,
1498 enum_ad_to_slot_map);
1499 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot4map,
1500 AB8500_ADSLOTSEL3, AB8500_ADSLOTSELX_EVEN_SHIFT,
1501 enum_ad_to_slot_map);
1502 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot5map,
1503 AB8500_ADSLOTSEL3, AB8500_ADSLOTSELX_ODD_SHIFT,
1504 enum_ad_to_slot_map);
1505 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot6map,
1506 AB8500_ADSLOTSEL4, AB8500_ADSLOTSELX_EVEN_SHIFT,
1507 enum_ad_to_slot_map);
1508 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot7map,
1509 AB8500_ADSLOTSEL4, AB8500_ADSLOTSELX_ODD_SHIFT,
1510 enum_ad_to_slot_map);
1511 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot8map,
1512 AB8500_ADSLOTSEL5, AB8500_ADSLOTSELX_EVEN_SHIFT,
1513 enum_ad_to_slot_map);
1514 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot9map,
1515 AB8500_ADSLOTSEL5, AB8500_ADSLOTSELX_ODD_SHIFT,
1516 enum_ad_to_slot_map);
1517 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot10map,
1518 AB8500_ADSLOTSEL6, AB8500_ADSLOTSELX_EVEN_SHIFT,
1519 enum_ad_to_slot_map);
1520 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot11map,
1521 AB8500_ADSLOTSEL6, AB8500_ADSLOTSELX_ODD_SHIFT,
1522 enum_ad_to_slot_map);
1523 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot12map,
1524 AB8500_ADSLOTSEL7, AB8500_ADSLOTSELX_EVEN_SHIFT,
1525 enum_ad_to_slot_map);
1526 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot13map,
1527 AB8500_ADSLOTSEL7, AB8500_ADSLOTSELX_ODD_SHIFT,
1528 enum_ad_to_slot_map);
1529 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot14map,
1530 AB8500_ADSLOTSEL8, AB8500_ADSLOTSELX_EVEN_SHIFT,
1531 enum_ad_to_slot_map);
1532 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot15map,
1533 AB8500_ADSLOTSEL8, AB8500_ADSLOTSELX_ODD_SHIFT,
1534 enum_ad_to_slot_map);
1535 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot16map,
1536 AB8500_ADSLOTSEL9, AB8500_ADSLOTSELX_EVEN_SHIFT,
1537 enum_ad_to_slot_map);
1538 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot17map,
1539 AB8500_ADSLOTSEL9, AB8500_ADSLOTSELX_ODD_SHIFT,
1540 enum_ad_to_slot_map);
1541 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot18map,
1542 AB8500_ADSLOTSEL10, AB8500_ADSLOTSELX_EVEN_SHIFT,
1543 enum_ad_to_slot_map);
1544 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot19map,
1545 AB8500_ADSLOTSEL10, AB8500_ADSLOTSELX_ODD_SHIFT,
1546 enum_ad_to_slot_map);
1547 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot20map,
1548 AB8500_ADSLOTSEL11, AB8500_ADSLOTSELX_EVEN_SHIFT,
1549 enum_ad_to_slot_map);
1550 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot21map,
1551 AB8500_ADSLOTSEL11, AB8500_ADSLOTSELX_ODD_SHIFT,
1552 enum_ad_to_slot_map);
1553 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot22map,
1554 AB8500_ADSLOTSEL12, AB8500_ADSLOTSELX_EVEN_SHIFT,
1555 enum_ad_to_slot_map);
1556 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot23map,
1557 AB8500_ADSLOTSEL12, AB8500_ADSLOTSELX_ODD_SHIFT,
1558 enum_ad_to_slot_map);
1559 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot24map,
1560 AB8500_ADSLOTSEL13, AB8500_ADSLOTSELX_EVEN_SHIFT,
1561 enum_ad_to_slot_map);
1562 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot25map,
1563 AB8500_ADSLOTSEL13, AB8500_ADSLOTSELX_ODD_SHIFT,
1564 enum_ad_to_slot_map);
1565 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot26map,
1566 AB8500_ADSLOTSEL14, AB8500_ADSLOTSELX_EVEN_SHIFT,
1567 enum_ad_to_slot_map);
1568 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot27map,
1569 AB8500_ADSLOTSEL14, AB8500_ADSLOTSELX_ODD_SHIFT,
1570 enum_ad_to_slot_map);
1571 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot28map,
1572 AB8500_ADSLOTSEL15, AB8500_ADSLOTSELX_EVEN_SHIFT,
1573 enum_ad_to_slot_map);
1574 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot29map,
1575 AB8500_ADSLOTSEL15, AB8500_ADSLOTSELX_ODD_SHIFT,
1576 enum_ad_to_slot_map);
1577 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot30map,
1578 AB8500_ADSLOTSEL16, AB8500_ADSLOTSELX_EVEN_SHIFT,
1579 enum_ad_to_slot_map);
1580 static SOC_ENUM_SINGLE_DECL(soc_enum_adslot31map,
1581 AB8500_ADSLOTSEL16, AB8500_ADSLOTSELX_ODD_SHIFT,
1582 enum_ad_to_slot_map);
1584 /* Digital interface - Burst mode */
1585 static const char * const enum_mask[] = {"Unmasked", "Masked"};
1586 static SOC_ENUM_SINGLE_DECL(soc_enum_bfifomask,
1587 AB8500_FIFOCONF1, AB8500_FIFOCONF1_BFIFOMASK,
1589 static const char * const enum_bitclk0[] = {"19_2_MHz", "38_4_MHz"};
1590 static SOC_ENUM_SINGLE_DECL(soc_enum_bfifo19m2,
1591 AB8500_FIFOCONF1, AB8500_FIFOCONF1_BFIFO19M2,
1593 static const char * const enum_slavemaster[] = {"Slave", "Master"};
1594 static SOC_ENUM_SINGLE_DECL(soc_enum_bfifomast,
1595 AB8500_FIFOCONF3, AB8500_FIFOCONF3_BFIFOMAST_SHIFT,
1599 static SOC_ENUM_SINGLE_EXT_DECL(soc_enum_sidstate, enum_sid_state);
1602 static SOC_ENUM_SINGLE_EXT_DECL(soc_enum_ancstate, enum_anc_state);
1604 static struct snd_kcontrol_new ab8500_ctrls[] = {
1606 SOC_ENUM("Charge Pump High Threshold For Low Voltage",
1607 soc_enum_envdeththre),
1608 SOC_ENUM("Charge Pump Low Threshold For Low Voltage",
1609 soc_enum_envdetlthre),
1610 SOC_SINGLE("Charge Pump Envelope Detection Switch",
1611 AB8500_SIGENVCONF, AB8500_SIGENVCONF_ENVDETCPEN,
1613 SOC_ENUM("Charge Pump Envelope Detection Decay Time",
1614 soc_enum_envdettime),
1617 SOC_ENUM("Headset Mode", soc_enum_da12voice),
1618 SOC_SINGLE("Headset High Pass Switch",
1619 AB8500_ANACONF1, AB8500_ANACONF1_HSHPEN,
1621 SOC_SINGLE("Headset Low Power Switch",
1622 AB8500_ANACONF1, AB8500_ANACONF1_HSLOWPOW,
1624 SOC_SINGLE("Headset DAC Low Power Switch",
1625 AB8500_ANACONF1, AB8500_ANACONF1_DACLOWPOW1,
1627 SOC_SINGLE("Headset DAC Drv Low Power Switch",
1628 AB8500_ANACONF1, AB8500_ANACONF1_DACLOWPOW0,
1630 SOC_ENUM("Headset Fade Speed", soc_enum_hsfadspeed),
1631 SOC_ENUM("Headset Source", soc_enum_da2hslr),
1632 SOC_ENUM("Headset Filter", soc_enum_hsesinc),
1633 SOC_DOUBLE_R_TLV("Headset Master Volume",
1634 AB8500_DADIGGAIN1, AB8500_DADIGGAIN2,
1635 0, AB8500_DADIGGAINX_DAXGAIN_MAX, 1, dax_dig_gain_tlv),
1636 SOC_DOUBLE_R_TLV("Headset Digital Volume",
1637 AB8500_HSLEARDIGGAIN, AB8500_HSRDIGGAIN,
1638 0, AB8500_HSLEARDIGGAIN_HSLDGAIN_MAX, 1, hs_ear_dig_gain_tlv),
1639 SOC_DOUBLE_TLV("Headset Volume",
1641 AB8500_ANAGAIN3_HSLGAIN, AB8500_ANAGAIN3_HSRGAIN,
1642 AB8500_ANAGAIN3_HSXGAIN_MAX, 1, hs_gain_tlv),
1645 SOC_ENUM("Earpiece DAC Mode",
1646 soc_enum_eardaclowpow),
1647 SOC_ENUM("Earpiece DAC Drv Mode",
1648 soc_enum_eardrvlowpow),
1651 SOC_ENUM("HF Mode", soc_enum_da34voice),
1652 SOC_SINGLE("HF and Headset Swap Switch",
1653 AB8500_DASLOTCONF1, AB8500_DASLOTCONF1_SWAPDA12_34,
1655 SOC_DOUBLE("HF Low EMI Mode Switch",
1657 AB8500_CLASSDCONF1_HFLSWAPEN, AB8500_CLASSDCONF1_HFRSWAPEN,
1659 SOC_DOUBLE("HF FIR Bypass Switch",
1661 AB8500_CLASSDCONF2_FIRBYP0, AB8500_CLASSDCONF2_FIRBYP1,
1663 SOC_DOUBLE("HF High Volume Switch",
1665 AB8500_CLASSDCONF2_HIGHVOLEN0, AB8500_CLASSDCONF2_HIGHVOLEN1,
1667 SOC_SINGLE("HF L and R Bridge Switch",
1668 AB8500_CLASSDCONF1, AB8500_CLASSDCONF1_PARLHF,
1670 SOC_DOUBLE_R_TLV("HF Master Volume",
1671 AB8500_DADIGGAIN3, AB8500_DADIGGAIN4,
1672 0, AB8500_DADIGGAINX_DAXGAIN_MAX, 1, dax_dig_gain_tlv),
1675 SOC_DOUBLE("Vibra High Volume Switch",
1677 AB8500_CLASSDCONF2_HIGHVOLEN2, AB8500_CLASSDCONF2_HIGHVOLEN3,
1679 SOC_DOUBLE("Vibra Low EMI Mode Switch",
1681 AB8500_CLASSDCONF1_VIB1SWAPEN, AB8500_CLASSDCONF1_VIB2SWAPEN,
1683 SOC_DOUBLE("Vibra FIR Bypass Switch",
1685 AB8500_CLASSDCONF2_FIRBYP2, AB8500_CLASSDCONF2_FIRBYP3,
1687 SOC_ENUM("Vibra Mode", soc_enum_da56voice),
1688 SOC_DOUBLE_R("Vibra PWM Duty Cycle N",
1689 AB8500_PWMGENCONF3, AB8500_PWMGENCONF5,
1690 AB8500_PWMGENCONFX_PWMVIBXDUTCYC,
1691 AB8500_PWMGENCONFX_PWMVIBXDUTCYC_MAX, 0),
1692 SOC_DOUBLE_R("Vibra PWM Duty Cycle P",
1693 AB8500_PWMGENCONF2, AB8500_PWMGENCONF4,
1694 AB8500_PWMGENCONFX_PWMVIBXDUTCYC,
1695 AB8500_PWMGENCONFX_PWMVIBXDUTCYC_MAX, 0),
1696 SOC_SINGLE("Vibra 1 and 2 Bridge Switch",
1697 AB8500_CLASSDCONF1, AB8500_CLASSDCONF1_PARLVIB,
1699 SOC_DOUBLE_R_TLV("Vibra Master Volume",
1700 AB8500_DADIGGAIN5, AB8500_DADIGGAIN6,
1701 0, AB8500_DADIGGAINX_DAXGAIN_MAX, 1, dax_dig_gain_tlv),
1703 /* HandsFree, Vibra */
1704 SOC_SINGLE("ClassD High Pass Volume",
1705 AB8500_CLASSDCONF3, AB8500_CLASSDCONF3_DITHHPGAIN,
1706 AB8500_CLASSDCONF3_DITHHPGAIN_MAX, 0),
1707 SOC_SINGLE("ClassD White Volume",
1708 AB8500_CLASSDCONF3, AB8500_CLASSDCONF3_DITHWGAIN,
1709 AB8500_CLASSDCONF3_DITHWGAIN_MAX, 0),
1711 /* Mic 1, Mic 2, LineIn */
1712 SOC_DOUBLE_R_TLV("Mic Master Volume",
1713 AB8500_ADDIGGAIN3, AB8500_ADDIGGAIN4,
1714 0, AB8500_ADDIGGAINX_ADXGAIN_MAX, 1, adx_dig_gain_tlv),
1717 SOC_SINGLE_TLV("Mic 1",
1719 AB8500_ANAGAINX_MICXGAIN,
1720 AB8500_ANAGAINX_MICXGAIN_MAX, 0, mic_gain_tlv),
1721 SOC_SINGLE("Mic 1 Low Power Switch",
1722 AB8500_ANAGAIN1, AB8500_ANAGAINX_LOWPOWMICX,
1726 SOC_DOUBLE("Mic High Pass Switch",
1728 AB8500_ADFILTCONF_AD3NH, AB8500_ADFILTCONF_AD4NH,
1730 SOC_ENUM("Mic Mode", soc_enum_ad34voice),
1731 SOC_ENUM("Mic Filter", soc_enum_dmic34sinc),
1732 SOC_SINGLE_TLV("Mic 2",
1734 AB8500_ANAGAINX_MICXGAIN,
1735 AB8500_ANAGAINX_MICXGAIN_MAX, 0, mic_gain_tlv),
1736 SOC_SINGLE("Mic 2 Low Power Switch",
1737 AB8500_ANAGAIN2, AB8500_ANAGAINX_LOWPOWMICX,
1741 SOC_DOUBLE("LineIn High Pass Switch",
1743 AB8500_ADFILTCONF_AD1NH, AB8500_ADFILTCONF_AD2NH,
1745 SOC_ENUM("LineIn Filter", soc_enum_dmic12sinc),
1746 SOC_ENUM("LineIn Mode", soc_enum_ad12voice),
1747 SOC_DOUBLE_R_TLV("LineIn Master Volume",
1748 AB8500_ADDIGGAIN1, AB8500_ADDIGGAIN2,
1749 0, AB8500_ADDIGGAINX_ADXGAIN_MAX, 1, adx_dig_gain_tlv),
1750 SOC_DOUBLE_TLV("LineIn",
1752 AB8500_ANAGAIN4_LINLGAIN, AB8500_ANAGAIN4_LINRGAIN,
1753 AB8500_ANAGAIN4_LINXGAIN_MAX, 0, lin_gain_tlv),
1754 SOC_DOUBLE_R_TLV("LineIn to Headset Volume",
1755 AB8500_DIGLINHSLGAIN, AB8500_DIGLINHSRGAIN,
1756 AB8500_DIGLINHSXGAIN_LINTOHSXGAIN,
1757 AB8500_DIGLINHSXGAIN_LINTOHSXGAIN_MAX,
1758 1, lin2hs_gain_tlv),
1761 SOC_ENUM("DMic Filter", soc_enum_dmic56sinc),
1762 SOC_DOUBLE_R_TLV("DMic Master Volume",
1763 AB8500_ADDIGGAIN5, AB8500_ADDIGGAIN6,
1764 0, AB8500_ADDIGGAINX_ADXGAIN_MAX, 1, adx_dig_gain_tlv),
1767 SOC_ENUM("Digital Gain Fade Speed", soc_enum_fadespeed),
1769 /* Analog loopback */
1770 SOC_DOUBLE_R_TLV("Analog Loopback Volume",
1771 AB8500_ADDIGLOOPGAIN1, AB8500_ADDIGLOOPGAIN2,
1772 0, AB8500_ADDIGLOOPGAINX_ADXLBGAIN_MAX, 1, dax_dig_gain_tlv),
1774 /* Digital interface - DA from slot mapping */
1775 SOC_ENUM("Digital Interface DA 1 From Slot Map", soc_enum_da1slotmap),
1776 SOC_ENUM("Digital Interface DA 2 From Slot Map", soc_enum_da2slotmap),
1777 SOC_ENUM("Digital Interface DA 3 From Slot Map", soc_enum_da3slotmap),
1778 SOC_ENUM("Digital Interface DA 4 From Slot Map", soc_enum_da4slotmap),
1779 SOC_ENUM("Digital Interface DA 5 From Slot Map", soc_enum_da5slotmap),
1780 SOC_ENUM("Digital Interface DA 6 From Slot Map", soc_enum_da6slotmap),
1781 SOC_ENUM("Digital Interface DA 7 From Slot Map", soc_enum_da7slotmap),
1782 SOC_ENUM("Digital Interface DA 8 From Slot Map", soc_enum_da8slotmap),
1784 /* Digital interface - AD to slot mapping */
1785 SOC_ENUM("Digital Interface AD To Slot 0 Map", soc_enum_adslot0map),
1786 SOC_ENUM("Digital Interface AD To Slot 1 Map", soc_enum_adslot1map),
1787 SOC_ENUM("Digital Interface AD To Slot 2 Map", soc_enum_adslot2map),
1788 SOC_ENUM("Digital Interface AD To Slot 3 Map", soc_enum_adslot3map),
1789 SOC_ENUM("Digital Interface AD To Slot 4 Map", soc_enum_adslot4map),
1790 SOC_ENUM("Digital Interface AD To Slot 5 Map", soc_enum_adslot5map),
1791 SOC_ENUM("Digital Interface AD To Slot 6 Map", soc_enum_adslot6map),
1792 SOC_ENUM("Digital Interface AD To Slot 7 Map", soc_enum_adslot7map),
1793 SOC_ENUM("Digital Interface AD To Slot 8 Map", soc_enum_adslot8map),
1794 SOC_ENUM("Digital Interface AD To Slot 9 Map", soc_enum_adslot9map),
1795 SOC_ENUM("Digital Interface AD To Slot 10 Map", soc_enum_adslot10map),
1796 SOC_ENUM("Digital Interface AD To Slot 11 Map", soc_enum_adslot11map),
1797 SOC_ENUM("Digital Interface AD To Slot 12 Map", soc_enum_adslot12map),
1798 SOC_ENUM("Digital Interface AD To Slot 13 Map", soc_enum_adslot13map),
1799 SOC_ENUM("Digital Interface AD To Slot 14 Map", soc_enum_adslot14map),
1800 SOC_ENUM("Digital Interface AD To Slot 15 Map", soc_enum_adslot15map),
1801 SOC_ENUM("Digital Interface AD To Slot 16 Map", soc_enum_adslot16map),
1802 SOC_ENUM("Digital Interface AD To Slot 17 Map", soc_enum_adslot17map),
1803 SOC_ENUM("Digital Interface AD To Slot 18 Map", soc_enum_adslot18map),
1804 SOC_ENUM("Digital Interface AD To Slot 19 Map", soc_enum_adslot19map),
1805 SOC_ENUM("Digital Interface AD To Slot 20 Map", soc_enum_adslot20map),
1806 SOC_ENUM("Digital Interface AD To Slot 21 Map", soc_enum_adslot21map),
1807 SOC_ENUM("Digital Interface AD To Slot 22 Map", soc_enum_adslot22map),
1808 SOC_ENUM("Digital Interface AD To Slot 23 Map", soc_enum_adslot23map),
1809 SOC_ENUM("Digital Interface AD To Slot 24 Map", soc_enum_adslot24map),
1810 SOC_ENUM("Digital Interface AD To Slot 25 Map", soc_enum_adslot25map),
1811 SOC_ENUM("Digital Interface AD To Slot 26 Map", soc_enum_adslot26map),
1812 SOC_ENUM("Digital Interface AD To Slot 27 Map", soc_enum_adslot27map),
1813 SOC_ENUM("Digital Interface AD To Slot 28 Map", soc_enum_adslot28map),
1814 SOC_ENUM("Digital Interface AD To Slot 29 Map", soc_enum_adslot29map),
1815 SOC_ENUM("Digital Interface AD To Slot 30 Map", soc_enum_adslot30map),
1816 SOC_ENUM("Digital Interface AD To Slot 31 Map", soc_enum_adslot31map),
1818 /* Digital interface - Loopback */
1819 SOC_SINGLE("Digital Interface AD 1 Loopback Switch",
1820 AB8500_DASLOTCONF1, AB8500_DASLOTCONF1_DAI7TOADO1,
1822 SOC_SINGLE("Digital Interface AD 2 Loopback Switch",
1823 AB8500_DASLOTCONF2, AB8500_DASLOTCONF2_DAI8TOADO2,
1825 SOC_SINGLE("Digital Interface AD 3 Loopback Switch",
1826 AB8500_DASLOTCONF3, AB8500_DASLOTCONF3_DAI7TOADO3,
1828 SOC_SINGLE("Digital Interface AD 4 Loopback Switch",
1829 AB8500_DASLOTCONF4, AB8500_DASLOTCONF4_DAI8TOADO4,
1831 SOC_SINGLE("Digital Interface AD 5 Loopback Switch",
1832 AB8500_DASLOTCONF5, AB8500_DASLOTCONF5_DAI7TOADO5,
1834 SOC_SINGLE("Digital Interface AD 6 Loopback Switch",
1835 AB8500_DASLOTCONF6, AB8500_DASLOTCONF6_DAI8TOADO6,
1837 SOC_SINGLE("Digital Interface AD 7 Loopback Switch",
1838 AB8500_DASLOTCONF7, AB8500_DASLOTCONF7_DAI8TOADO7,
1840 SOC_SINGLE("Digital Interface AD 8 Loopback Switch",
1841 AB8500_DASLOTCONF8, AB8500_DASLOTCONF8_DAI7TOADO8,
1844 /* Digital interface - Burst FIFO */
1845 SOC_SINGLE("Digital Interface 0 FIFO Enable Switch",
1846 AB8500_DIGIFCONF3, AB8500_DIGIFCONF3_IF0BFIFOEN,
1848 SOC_ENUM("Burst FIFO Mask", soc_enum_bfifomask),
1849 SOC_ENUM("Burst FIFO Bit-clock Frequency", soc_enum_bfifo19m2),
1850 SOC_SINGLE("Burst FIFO Threshold",
1851 AB8500_FIFOCONF1, AB8500_FIFOCONF1_BFIFOINT_SHIFT,
1852 AB8500_FIFOCONF1_BFIFOINT_MAX, 0),
1853 SOC_SINGLE("Burst FIFO Length",
1854 AB8500_FIFOCONF2, AB8500_FIFOCONF2_BFIFOTX_SHIFT,
1855 AB8500_FIFOCONF2_BFIFOTX_MAX, 0),
1856 SOC_SINGLE("Burst FIFO EOS Extra Slots",
1857 AB8500_FIFOCONF3, AB8500_FIFOCONF3_BFIFOEXSL_SHIFT,
1858 AB8500_FIFOCONF3_BFIFOEXSL_MAX, 0),
1859 SOC_SINGLE("Burst FIFO FS Extra Bit-clocks",
1860 AB8500_FIFOCONF3, AB8500_FIFOCONF3_PREBITCLK0_SHIFT,
1861 AB8500_FIFOCONF3_PREBITCLK0_MAX, 0),
1862 SOC_ENUM("Burst FIFO Interface Mode", soc_enum_bfifomast),
1864 SOC_SINGLE("Burst FIFO Interface Switch",
1865 AB8500_FIFOCONF3, AB8500_FIFOCONF3_BFIFORUN_SHIFT,
1867 SOC_SINGLE("Burst FIFO Switch Frame Number",
1868 AB8500_FIFOCONF4, AB8500_FIFOCONF4_BFIFOFRAMSW_SHIFT,
1869 AB8500_FIFOCONF4_BFIFOFRAMSW_MAX, 0),
1870 SOC_SINGLE("Burst FIFO Wake Up Delay",
1871 AB8500_FIFOCONF5, AB8500_FIFOCONF5_BFIFOWAKEUP_SHIFT,
1872 AB8500_FIFOCONF5_BFIFOWAKEUP_MAX, 0),
1873 SOC_SINGLE("Burst FIFO Samples In FIFO",
1874 AB8500_FIFOCONF6, AB8500_FIFOCONF6_BFIFOSAMPLE_SHIFT,
1875 AB8500_FIFOCONF6_BFIFOSAMPLE_MAX, 0),
1878 SOC_ENUM_EXT("ANC Status", soc_enum_ancstate,
1879 anc_status_control_get, anc_status_control_put),
1880 SOC_SINGLE_XR_SX("ANC Warp Delay Shift",
1881 AB8500_ANCCONF2, 1, AB8500_ANCCONF2_SHIFT,
1882 AB8500_ANCCONF2_MIN, AB8500_ANCCONF2_MAX, 0),
1883 SOC_SINGLE_XR_SX("ANC FIR Output Shift",
1884 AB8500_ANCCONF3, 1, AB8500_ANCCONF3_SHIFT,
1885 AB8500_ANCCONF3_MIN, AB8500_ANCCONF3_MAX, 0),
1886 SOC_SINGLE_XR_SX("ANC IIR Output Shift",
1887 AB8500_ANCCONF4, 1, AB8500_ANCCONF4_SHIFT,
1888 AB8500_ANCCONF4_MIN, AB8500_ANCCONF4_MAX, 0),
1889 SOC_SINGLE_XR_SX("ANC Warp Delay",
1890 AB8500_ANCCONF9, 2, AB8500_ANC_WARP_DELAY_SHIFT,
1891 AB8500_ANC_WARP_DELAY_MIN, AB8500_ANC_WARP_DELAY_MAX, 0),
1894 SOC_ENUM_EXT("Sidetone Status", soc_enum_sidstate,
1895 sid_status_control_get, sid_status_control_put),
1896 SOC_SINGLE_STROBE("Sidetone Reset",
1897 AB8500_SIDFIRADR, AB8500_SIDFIRADR_FIRSIDSET, 0),
1900 static struct snd_kcontrol_new ab8500_filter_controls[] = {
1901 AB8500_FILTER_CONTROL("ANC FIR Coefficients", AB8500_ANC_FIR_COEFFS,
1902 AB8500_ANC_FIR_COEFF_MIN, AB8500_ANC_FIR_COEFF_MAX),
1903 AB8500_FILTER_CONTROL("ANC IIR Coefficients", AB8500_ANC_IIR_COEFFS,
1904 AB8500_ANC_IIR_COEFF_MIN, AB8500_ANC_IIR_COEFF_MAX),
1905 AB8500_FILTER_CONTROL("Sidetone FIR Coefficients",
1906 AB8500_SID_FIR_COEFFS, AB8500_SID_FIR_COEFF_MIN,
1907 AB8500_SID_FIR_COEFF_MAX)
1909 enum ab8500_filter {
1910 AB8500_FILTER_ANC_FIR = 0,
1911 AB8500_FILTER_ANC_IIR = 1,
1912 AB8500_FILTER_SID_FIR = 2,
1916 * Extended interface for codec-driver
1919 static int ab8500_audio_init_audioblock(struct snd_soc_component *component)
1923 dev_dbg(component->dev, "%s: Enter.\n", __func__);
1925 /* Reset audio-registers and disable 32kHz-clock output 2 */
1926 status = ab8500_sysctrl_write(AB8500_STW4500CTRL3,
1927 AB8500_STW4500CTRL3_CLK32KOUT2DIS |
1928 AB8500_STW4500CTRL3_RESETAUDN,
1929 AB8500_STW4500CTRL3_RESETAUDN);
1936 static int ab8500_audio_setup_mics(struct snd_soc_component *component,
1937 struct amic_settings *amics)
1939 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
1943 const struct snd_soc_dapm_route *route;
1945 dev_dbg(component->dev, "%s: Enter.\n", __func__);
1947 /* Set DMic-clocks to outputs */
1948 status = abx500_get_register_interruptible(component->dev, AB8500_MISC,
1949 AB8500_GPIO_DIR4_REG,
1953 value = value8 | GPIO27_DIR_OUTPUT | GPIO29_DIR_OUTPUT |
1955 status = abx500_set_register_interruptible(component->dev,
1957 AB8500_GPIO_DIR4_REG,
1962 /* Attach regulators to AMic DAPM-paths */
1963 dev_dbg(component->dev, "%s: Mic 1a regulator: %s\n", __func__,
1964 amic_micbias_str(amics->mic1a_micbias));
1965 route = &ab8500_dapm_routes_mic1a_vamicx[amics->mic1a_micbias];
1966 status = snd_soc_dapm_add_routes(dapm, route, 1);
1967 dev_dbg(component->dev, "%s: Mic 1b regulator: %s\n", __func__,
1968 amic_micbias_str(amics->mic1b_micbias));
1969 route = &ab8500_dapm_routes_mic1b_vamicx[amics->mic1b_micbias];
1970 status |= snd_soc_dapm_add_routes(dapm, route, 1);
1971 dev_dbg(component->dev, "%s: Mic 2 regulator: %s\n", __func__,
1972 amic_micbias_str(amics->mic2_micbias));
1973 route = &ab8500_dapm_routes_mic2_vamicx[amics->mic2_micbias];
1974 status |= snd_soc_dapm_add_routes(dapm, route, 1);
1976 dev_err(component->dev,
1977 "%s: Failed to add AMic-regulator DAPM-routes (%d).\n",
1982 /* Set AMic-configuration */
1983 dev_dbg(component->dev, "%s: Mic 1 mic-type: %s\n", __func__,
1984 amic_type_str(amics->mic1_type));
1985 snd_soc_component_update_bits(component, AB8500_ANAGAIN1, AB8500_ANAGAINX_ENSEMICX,
1986 amics->mic1_type == AMIC_TYPE_DIFFERENTIAL ?
1987 0 : AB8500_ANAGAINX_ENSEMICX);
1988 dev_dbg(component->dev, "%s: Mic 2 mic-type: %s\n", __func__,
1989 amic_type_str(amics->mic2_type));
1990 snd_soc_component_update_bits(component, AB8500_ANAGAIN2, AB8500_ANAGAINX_ENSEMICX,
1991 amics->mic2_type == AMIC_TYPE_DIFFERENTIAL ?
1992 0 : AB8500_ANAGAINX_ENSEMICX);
1997 static int ab8500_audio_set_ear_cmv(struct snd_soc_component *component,
1998 enum ear_cm_voltage ear_cmv)
2016 dev_err(component->dev,
2017 "%s: Unknown earpiece CM-voltage (%d)!\n",
2018 __func__, (int)ear_cmv);
2021 dev_dbg(component->dev, "%s: Earpiece CM-voltage: %s\n", __func__,
2023 snd_soc_component_update_bits(component, AB8500_ANACONF1, AB8500_ANACONF1_EARSELCM,
2029 static int ab8500_audio_set_bit_delay(struct snd_soc_dai *dai,
2032 unsigned int mask, val;
2033 struct snd_soc_component *component = dai->component;
2035 mask = BIT(AB8500_DIGIFCONF2_IF0DEL);
2042 val |= BIT(AB8500_DIGIFCONF2_IF0DEL);
2045 dev_err(dai->component->dev,
2046 "%s: ERROR: Unsupported bit-delay (0x%x)!\n",
2051 dev_dbg(dai->component->dev, "%s: IF0 Bit-delay: %d bits.\n",
2053 snd_soc_component_update_bits(component, AB8500_DIGIFCONF2, mask, val);
2058 /* Gates clocking according format mask */
2059 static int ab8500_codec_set_dai_clock_gate(struct snd_soc_component *component,
2065 mask = BIT(AB8500_DIGIFCONF1_ENMASTGEN) |
2066 BIT(AB8500_DIGIFCONF1_ENFSBITCLK0);
2068 val = BIT(AB8500_DIGIFCONF1_ENMASTGEN);
2070 switch (fmt & SND_SOC_DAIFMT_CLOCK_MASK) {
2071 case SND_SOC_DAIFMT_CONT: /* continuous clock */
2072 dev_dbg(component->dev, "%s: IF0 Clock is continuous.\n",
2074 val |= BIT(AB8500_DIGIFCONF1_ENFSBITCLK0);
2076 case SND_SOC_DAIFMT_GATED: /* clock is gated */
2077 dev_dbg(component->dev, "%s: IF0 Clock is gated.\n",
2081 dev_err(component->dev,
2082 "%s: ERROR: Unsupported clock mask (0x%x)!\n",
2083 __func__, fmt & SND_SOC_DAIFMT_CLOCK_MASK);
2087 snd_soc_component_update_bits(component, AB8500_DIGIFCONF1, mask, val);
2092 static int ab8500_codec_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
2096 struct snd_soc_component *component = dai->component;
2099 dev_dbg(component->dev, "%s: Enter (fmt = 0x%x)\n", __func__, fmt);
2101 mask = BIT(AB8500_DIGIFCONF3_IF1DATOIF0AD) |
2102 BIT(AB8500_DIGIFCONF3_IF1CLKTOIF0CLK) |
2103 BIT(AB8500_DIGIFCONF3_IF0BFIFOEN) |
2104 BIT(AB8500_DIGIFCONF3_IF0MASTER);
2107 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
2108 case SND_SOC_DAIFMT_CBP_CFP:
2109 dev_dbg(dai->component->dev,
2110 "%s: IF0 Master-mode: AB8500 provider.\n", __func__);
2111 val |= BIT(AB8500_DIGIFCONF3_IF0MASTER);
2113 case SND_SOC_DAIFMT_CBC_CFC:
2114 dev_dbg(dai->component->dev,
2115 "%s: IF0 Master-mode: AB8500 consumer.\n", __func__);
2117 case SND_SOC_DAIFMT_CBC_CFP:
2118 case SND_SOC_DAIFMT_CBP_CFC:
2119 dev_err(dai->component->dev,
2120 "%s: ERROR: The device is either a provider or a consumer.\n",
2124 dev_err(dai->component->dev,
2125 "%s: ERROR: Unsupporter clocking mask 0x%x\n",
2126 __func__, fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK);
2130 snd_soc_component_update_bits(component, AB8500_DIGIFCONF3, mask, val);
2132 /* Set clock gating */
2133 status = ab8500_codec_set_dai_clock_gate(component, fmt);
2135 dev_err(dai->component->dev,
2136 "%s: ERROR: Failed to set clock gate (%d).\n",
2141 /* Setting data transfer format */
2143 mask = BIT(AB8500_DIGIFCONF2_IF0FORMAT0) |
2144 BIT(AB8500_DIGIFCONF2_IF0FORMAT1) |
2145 BIT(AB8500_DIGIFCONF2_FSYNC0P) |
2146 BIT(AB8500_DIGIFCONF2_BITCLK0P);
2149 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
2150 case SND_SOC_DAIFMT_I2S: /* I2S mode */
2151 dev_dbg(dai->component->dev, "%s: IF0 Protocol: I2S\n", __func__);
2152 val |= BIT(AB8500_DIGIFCONF2_IF0FORMAT1);
2153 ab8500_audio_set_bit_delay(dai, 0);
2156 case SND_SOC_DAIFMT_DSP_A: /* L data MSB after FRM LRC */
2157 dev_dbg(dai->component->dev,
2158 "%s: IF0 Protocol: DSP A (TDM)\n", __func__);
2159 val |= BIT(AB8500_DIGIFCONF2_IF0FORMAT0);
2160 ab8500_audio_set_bit_delay(dai, 1);
2163 case SND_SOC_DAIFMT_DSP_B: /* L data MSB during FRM LRC */
2164 dev_dbg(dai->component->dev,
2165 "%s: IF0 Protocol: DSP B (TDM)\n", __func__);
2166 val |= BIT(AB8500_DIGIFCONF2_IF0FORMAT0);
2167 ab8500_audio_set_bit_delay(dai, 0);
2171 dev_err(dai->component->dev,
2172 "%s: ERROR: Unsupported format (0x%x)!\n",
2173 __func__, fmt & SND_SOC_DAIFMT_FORMAT_MASK);
2177 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
2178 case SND_SOC_DAIFMT_NB_NF: /* normal bit clock + frame */
2179 dev_dbg(dai->component->dev,
2180 "%s: IF0: Normal bit clock, normal frame\n",
2183 case SND_SOC_DAIFMT_NB_IF: /* normal BCLK + inv FRM */
2184 dev_dbg(dai->component->dev,
2185 "%s: IF0: Normal bit clock, inverted frame\n",
2187 val |= BIT(AB8500_DIGIFCONF2_FSYNC0P);
2189 case SND_SOC_DAIFMT_IB_NF: /* invert BCLK + nor FRM */
2190 dev_dbg(dai->component->dev,
2191 "%s: IF0: Inverted bit clock, normal frame\n",
2193 val |= BIT(AB8500_DIGIFCONF2_BITCLK0P);
2195 case SND_SOC_DAIFMT_IB_IF: /* invert BCLK + FRM */
2196 dev_dbg(dai->component->dev,
2197 "%s: IF0: Inverted bit clock, inverted frame\n",
2199 val |= BIT(AB8500_DIGIFCONF2_FSYNC0P);
2200 val |= BIT(AB8500_DIGIFCONF2_BITCLK0P);
2203 dev_err(dai->component->dev,
2204 "%s: ERROR: Unsupported INV mask 0x%x\n",
2205 __func__, fmt & SND_SOC_DAIFMT_INV_MASK);
2209 snd_soc_component_update_bits(component, AB8500_DIGIFCONF2, mask, val);
2214 static int ab8500_codec_set_dai_tdm_slot(struct snd_soc_dai *dai,
2215 unsigned int tx_mask, unsigned int rx_mask,
2216 int slots, int slot_width)
2218 struct snd_soc_component *component = dai->component;
2219 unsigned int val, mask, slot, slots_active;
2221 mask = BIT(AB8500_DIGIFCONF2_IF0WL0) |
2222 BIT(AB8500_DIGIFCONF2_IF0WL1);
2225 switch (slot_width) {
2229 val |= BIT(AB8500_DIGIFCONF2_IF0WL0);
2232 val |= BIT(AB8500_DIGIFCONF2_IF0WL1);
2235 val |= BIT(AB8500_DIGIFCONF2_IF0WL1) |
2236 BIT(AB8500_DIGIFCONF2_IF0WL0);
2239 dev_err(dai->component->dev, "%s: Unsupported slot-width 0x%x\n",
2240 __func__, slot_width);
2244 dev_dbg(dai->component->dev, "%s: IF0 slot-width: %d bits.\n",
2245 __func__, slot_width);
2246 snd_soc_component_update_bits(component, AB8500_DIGIFCONF2, mask, val);
2248 /* Setup TDM clocking according to slot count */
2249 dev_dbg(dai->component->dev, "%s: Slots, total: %d\n", __func__, slots);
2250 mask = BIT(AB8500_DIGIFCONF1_IF0BITCLKOS0) |
2251 BIT(AB8500_DIGIFCONF1_IF0BITCLKOS1);
2254 val = AB8500_MASK_NONE;
2257 val = BIT(AB8500_DIGIFCONF1_IF0BITCLKOS0);
2260 val = BIT(AB8500_DIGIFCONF1_IF0BITCLKOS1);
2263 val = BIT(AB8500_DIGIFCONF1_IF0BITCLKOS0) |
2264 BIT(AB8500_DIGIFCONF1_IF0BITCLKOS1);
2267 dev_err(dai->component->dev,
2268 "%s: ERROR: Unsupported number of slots (%d)!\n",
2272 snd_soc_component_update_bits(component, AB8500_DIGIFCONF1, mask, val);
2274 /* Setup TDM DA according to active tx slots */
2276 if (tx_mask & ~0xff)
2279 mask = AB8500_DASLOTCONFX_SLTODAX_MASK;
2280 tx_mask = tx_mask << AB8500_DA_DATA0_OFFSET;
2281 slots_active = hweight32(tx_mask);
2283 dev_dbg(dai->component->dev, "%s: Slots, active, TX: %d\n", __func__,
2286 switch (slots_active) {
2290 slot = ffs(tx_mask);
2291 snd_soc_component_update_bits(component, AB8500_DASLOTCONF1, mask, slot);
2292 snd_soc_component_update_bits(component, AB8500_DASLOTCONF3, mask, slot);
2293 snd_soc_component_update_bits(component, AB8500_DASLOTCONF2, mask, slot);
2294 snd_soc_component_update_bits(component, AB8500_DASLOTCONF4, mask, slot);
2297 slot = ffs(tx_mask);
2298 snd_soc_component_update_bits(component, AB8500_DASLOTCONF1, mask, slot);
2299 snd_soc_component_update_bits(component, AB8500_DASLOTCONF3, mask, slot);
2300 slot = fls(tx_mask);
2301 snd_soc_component_update_bits(component, AB8500_DASLOTCONF2, mask, slot);
2302 snd_soc_component_update_bits(component, AB8500_DASLOTCONF4, mask, slot);
2305 dev_dbg(dai->component->dev,
2306 "%s: In 8-channel mode DA-from-slot mapping is set manually.",
2310 dev_err(dai->component->dev,
2311 "%s: Unsupported number of active TX-slots (%d)!\n",
2312 __func__, slots_active);
2316 /* Setup TDM AD according to active RX-slots */
2318 if (rx_mask & ~0xff)
2321 rx_mask = rx_mask << AB8500_AD_DATA0_OFFSET;
2322 slots_active = hweight32(rx_mask);
2324 dev_dbg(dai->component->dev, "%s: Slots, active, RX: %d\n", __func__,
2327 switch (slots_active) {
2331 slot = ffs(rx_mask);
2332 snd_soc_component_update_bits(component, AB8500_ADSLOTSEL(slot),
2333 AB8500_MASK_SLOT(slot),
2334 AB8500_ADSLOTSELX_AD_OUT_TO_SLOT(AB8500_AD_OUT3, slot));
2337 slot = ffs(rx_mask);
2338 snd_soc_component_update_bits(component,
2339 AB8500_ADSLOTSEL(slot),
2340 AB8500_MASK_SLOT(slot),
2341 AB8500_ADSLOTSELX_AD_OUT_TO_SLOT(AB8500_AD_OUT3, slot));
2342 slot = fls(rx_mask);
2343 snd_soc_component_update_bits(component,
2344 AB8500_ADSLOTSEL(slot),
2345 AB8500_MASK_SLOT(slot),
2346 AB8500_ADSLOTSELX_AD_OUT_TO_SLOT(AB8500_AD_OUT2, slot));
2349 dev_dbg(dai->component->dev,
2350 "%s: In 8-channel mode AD-to-slot mapping is set manually.",
2354 dev_err(dai->component->dev,
2355 "%s: Unsupported number of active RX-slots (%d)!\n",
2356 __func__, slots_active);
2363 static const struct snd_soc_dai_ops ab8500_codec_ops = {
2364 .set_fmt = ab8500_codec_set_dai_fmt,
2365 .set_tdm_slot = ab8500_codec_set_dai_tdm_slot,
2368 static struct snd_soc_dai_driver ab8500_codec_dai[] = {
2370 .name = "ab8500-codec-dai.0",
2373 .stream_name = "ab8500_0p",
2376 .rates = AB8500_SUPPORTED_RATE,
2377 .formats = AB8500_SUPPORTED_FMT,
2379 .ops = &ab8500_codec_ops,
2383 .name = "ab8500-codec-dai.1",
2386 .stream_name = "ab8500_0c",
2389 .rates = AB8500_SUPPORTED_RATE,
2390 .formats = AB8500_SUPPORTED_FMT,
2392 .ops = &ab8500_codec_ops,
2397 static void ab8500_codec_of_probe(struct device *dev, struct device_node *np,
2398 struct ab8500_codec_platform_data *codec)
2402 if (of_property_read_bool(np, "stericsson,amic1-type-single-ended"))
2403 codec->amics.mic1_type = AMIC_TYPE_SINGLE_ENDED;
2405 codec->amics.mic1_type = AMIC_TYPE_DIFFERENTIAL;
2407 if (of_property_read_bool(np, "stericsson,amic2-type-single-ended"))
2408 codec->amics.mic2_type = AMIC_TYPE_SINGLE_ENDED;
2410 codec->amics.mic2_type = AMIC_TYPE_DIFFERENTIAL;
2412 /* Has a non-standard Vamic been requested? */
2413 if (of_property_read_bool(np, "stericsson,amic1a-bias-vamic2"))
2414 codec->amics.mic1a_micbias = AMIC_MICBIAS_VAMIC2;
2416 codec->amics.mic1a_micbias = AMIC_MICBIAS_VAMIC1;
2418 if (of_property_read_bool(np, "stericsson,amic1b-bias-vamic2"))
2419 codec->amics.mic1b_micbias = AMIC_MICBIAS_VAMIC2;
2421 codec->amics.mic1b_micbias = AMIC_MICBIAS_VAMIC1;
2423 if (of_property_read_bool(np, "stericsson,amic2-bias-vamic1"))
2424 codec->amics.mic2_micbias = AMIC_MICBIAS_VAMIC1;
2426 codec->amics.mic2_micbias = AMIC_MICBIAS_VAMIC2;
2428 if (!of_property_read_u32(np, "stericsson,earpeice-cmv", &value)) {
2431 codec->ear_cmv = EAR_CMV_0_95V;
2434 codec->ear_cmv = EAR_CMV_1_10V;
2437 codec->ear_cmv = EAR_CMV_1_27V;
2440 codec->ear_cmv = EAR_CMV_1_58V;
2443 codec->ear_cmv = EAR_CMV_UNKNOWN;
2444 dev_err(dev, "Unsuitable earpiece voltage found in DT\n");
2447 dev_warn(dev, "No earpiece voltage found in DT - using default\n");
2448 codec->ear_cmv = EAR_CMV_0_95V;
2452 static int ab8500_codec_probe(struct snd_soc_component *component)
2454 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
2455 struct device *dev = component->dev;
2456 struct device_node *np = dev->of_node;
2457 struct ab8500_codec_drvdata *drvdata = dev_get_drvdata(dev);
2458 struct ab8500_codec_platform_data codec_pdata;
2459 struct filter_control *fc;
2462 dev_dbg(dev, "%s: Enter.\n", __func__);
2464 ab8500_codec_of_probe(dev, np, &codec_pdata);
2466 status = ab8500_audio_setup_mics(component, &codec_pdata.amics);
2468 pr_err("%s: Failed to setup mics (%d)!\n", __func__, status);
2471 status = ab8500_audio_set_ear_cmv(component, codec_pdata.ear_cmv);
2473 pr_err("%s: Failed to set earpiece CM-voltage (%d)!\n",
2478 status = ab8500_audio_init_audioblock(component);
2480 dev_err(dev, "%s: failed to init audio-block (%d)!\n",
2485 /* Override HW-defaults */
2486 snd_soc_component_write(component, AB8500_ANACONF5,
2487 BIT(AB8500_ANACONF5_HSAUTOEN));
2488 snd_soc_component_write(component, AB8500_SHORTCIRCONF,
2489 BIT(AB8500_SHORTCIRCONF_HSZCDDIS));
2491 /* Add filter controls */
2492 status = snd_soc_add_component_controls(component, ab8500_filter_controls,
2493 ARRAY_SIZE(ab8500_filter_controls));
2496 "%s: failed to add ab8500 filter controls (%d).\n",
2500 fc = (struct filter_control *)
2501 &ab8500_filter_controls[AB8500_FILTER_ANC_FIR].private_value;
2502 drvdata->anc_fir_values = (long *)fc->value;
2503 fc = (struct filter_control *)
2504 &ab8500_filter_controls[AB8500_FILTER_ANC_IIR].private_value;
2505 drvdata->anc_iir_values = (long *)fc->value;
2506 fc = (struct filter_control *)
2507 &ab8500_filter_controls[AB8500_FILTER_SID_FIR].private_value;
2508 drvdata->sid_fir_values = (long *)fc->value;
2510 snd_soc_dapm_disable_pin(dapm, "ANC Configure Input");
2512 mutex_init(&drvdata->ctrl_lock);
2517 static const struct snd_soc_component_driver ab8500_component_driver = {
2518 .probe = ab8500_codec_probe,
2519 .controls = ab8500_ctrls,
2520 .num_controls = ARRAY_SIZE(ab8500_ctrls),
2521 .dapm_widgets = ab8500_dapm_widgets,
2522 .num_dapm_widgets = ARRAY_SIZE(ab8500_dapm_widgets),
2523 .dapm_routes = ab8500_dapm_routes,
2524 .num_dapm_routes = ARRAY_SIZE(ab8500_dapm_routes),
2526 .use_pmdown_time = 1,
2528 .non_legacy_dai_naming = 1,
2531 static int ab8500_codec_driver_probe(struct platform_device *pdev)
2534 struct ab8500_codec_drvdata *drvdata;
2536 dev_dbg(&pdev->dev, "%s: Enter.\n", __func__);
2538 /* Create driver private-data struct */
2539 drvdata = devm_kzalloc(&pdev->dev, sizeof(struct ab8500_codec_drvdata),
2543 drvdata->sid_status = SID_UNCONFIGURED;
2544 drvdata->anc_status = ANC_UNCONFIGURED;
2545 dev_set_drvdata(&pdev->dev, drvdata);
2547 drvdata->regmap = devm_regmap_init(&pdev->dev, NULL, &pdev->dev,
2548 &ab8500_codec_regmap);
2549 if (IS_ERR(drvdata->regmap)) {
2550 status = PTR_ERR(drvdata->regmap);
2551 dev_err(&pdev->dev, "%s: Failed to allocate regmap: %d\n",
2556 dev_dbg(&pdev->dev, "%s: Register codec.\n", __func__);
2557 status = devm_snd_soc_register_component(&pdev->dev,
2558 &ab8500_component_driver,
2560 ARRAY_SIZE(ab8500_codec_dai));
2563 "%s: Error: Failed to register codec (%d).\n",
2569 static struct platform_driver ab8500_codec_platform_driver = {
2571 .name = "ab8500-codec",
2573 .probe = ab8500_codec_driver_probe,
2575 module_platform_driver(ab8500_codec_platform_driver);
2577 MODULE_LICENSE("GPL v2");