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