ASoC: wm9081: fix resource reclaim in wm9081_register error path
[deliverable/linux.git] / sound / soc / codecs / twl4030.c
1 /*
2 * ALSA SoC TWL4030 codec driver
3 *
4 * Author: Steve Sakoman, <steve@sakoman.com>
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * version 2 as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
18 * 02110-1301 USA
19 *
20 */
21
22 #include <linux/module.h>
23 #include <linux/moduleparam.h>
24 #include <linux/init.h>
25 #include <linux/delay.h>
26 #include <linux/pm.h>
27 #include <linux/i2c.h>
28 #include <linux/platform_device.h>
29 #include <linux/i2c/twl.h>
30 #include <linux/slab.h>
31 #include <sound/core.h>
32 #include <sound/pcm.h>
33 #include <sound/pcm_params.h>
34 #include <sound/soc.h>
35 #include <sound/soc-dapm.h>
36 #include <sound/initval.h>
37 #include <sound/tlv.h>
38
39 #include "twl4030.h"
40
41 /*
42 * twl4030 register cache & default register settings
43 */
44 static const u8 twl4030_reg[TWL4030_CACHEREGNUM] = {
45 0x00, /* this register not used */
46 0x00, /* REG_CODEC_MODE (0x1) */
47 0x00, /* REG_OPTION (0x2) */
48 0x00, /* REG_UNKNOWN (0x3) */
49 0x00, /* REG_MICBIAS_CTL (0x4) */
50 0x00, /* REG_ANAMICL (0x5) */
51 0x00, /* REG_ANAMICR (0x6) */
52 0x00, /* REG_AVADC_CTL (0x7) */
53 0x00, /* REG_ADCMICSEL (0x8) */
54 0x00, /* REG_DIGMIXING (0x9) */
55 0x0f, /* REG_ATXL1PGA (0xA) */
56 0x0f, /* REG_ATXR1PGA (0xB) */
57 0x0f, /* REG_AVTXL2PGA (0xC) */
58 0x0f, /* REG_AVTXR2PGA (0xD) */
59 0x00, /* REG_AUDIO_IF (0xE) */
60 0x00, /* REG_VOICE_IF (0xF) */
61 0x3f, /* REG_ARXR1PGA (0x10) */
62 0x3f, /* REG_ARXL1PGA (0x11) */
63 0x3f, /* REG_ARXR2PGA (0x12) */
64 0x3f, /* REG_ARXL2PGA (0x13) */
65 0x25, /* REG_VRXPGA (0x14) */
66 0x00, /* REG_VSTPGA (0x15) */
67 0x00, /* REG_VRX2ARXPGA (0x16) */
68 0x00, /* REG_AVDAC_CTL (0x17) */
69 0x00, /* REG_ARX2VTXPGA (0x18) */
70 0x32, /* REG_ARXL1_APGA_CTL (0x19) */
71 0x32, /* REG_ARXR1_APGA_CTL (0x1A) */
72 0x32, /* REG_ARXL2_APGA_CTL (0x1B) */
73 0x32, /* REG_ARXR2_APGA_CTL (0x1C) */
74 0x00, /* REG_ATX2ARXPGA (0x1D) */
75 0x00, /* REG_BT_IF (0x1E) */
76 0x55, /* REG_BTPGA (0x1F) */
77 0x00, /* REG_BTSTPGA (0x20) */
78 0x00, /* REG_EAR_CTL (0x21) */
79 0x00, /* REG_HS_SEL (0x22) */
80 0x00, /* REG_HS_GAIN_SET (0x23) */
81 0x00, /* REG_HS_POPN_SET (0x24) */
82 0x00, /* REG_PREDL_CTL (0x25) */
83 0x00, /* REG_PREDR_CTL (0x26) */
84 0x00, /* REG_PRECKL_CTL (0x27) */
85 0x00, /* REG_PRECKR_CTL (0x28) */
86 0x00, /* REG_HFL_CTL (0x29) */
87 0x00, /* REG_HFR_CTL (0x2A) */
88 0x05, /* REG_ALC_CTL (0x2B) */
89 0x00, /* REG_ALC_SET1 (0x2C) */
90 0x00, /* REG_ALC_SET2 (0x2D) */
91 0x00, /* REG_BOOST_CTL (0x2E) */
92 0x00, /* REG_SOFTVOL_CTL (0x2F) */
93 0x13, /* REG_DTMF_FREQSEL (0x30) */
94 0x00, /* REG_DTMF_TONEXT1H (0x31) */
95 0x00, /* REG_DTMF_TONEXT1L (0x32) */
96 0x00, /* REG_DTMF_TONEXT2H (0x33) */
97 0x00, /* REG_DTMF_TONEXT2L (0x34) */
98 0x79, /* REG_DTMF_TONOFF (0x35) */
99 0x11, /* REG_DTMF_WANONOFF (0x36) */
100 0x00, /* REG_I2S_RX_SCRAMBLE_H (0x37) */
101 0x00, /* REG_I2S_RX_SCRAMBLE_M (0x38) */
102 0x00, /* REG_I2S_RX_SCRAMBLE_L (0x39) */
103 0x06, /* REG_APLL_CTL (0x3A) */
104 0x00, /* REG_DTMF_CTL (0x3B) */
105 0x44, /* REG_DTMF_PGA_CTL2 (0x3C) */
106 0x69, /* REG_DTMF_PGA_CTL1 (0x3D) */
107 0x00, /* REG_MISC_SET_1 (0x3E) */
108 0x00, /* REG_PCMBTMUX (0x3F) */
109 0x00, /* not used (0x40) */
110 0x00, /* not used (0x41) */
111 0x00, /* not used (0x42) */
112 0x00, /* REG_RX_PATH_SEL (0x43) */
113 0x32, /* REG_VDL_APGA_CTL (0x44) */
114 0x00, /* REG_VIBRA_CTL (0x45) */
115 0x00, /* REG_VIBRA_SET (0x46) */
116 0x00, /* REG_VIBRA_PWM_SET (0x47) */
117 0x00, /* REG_ANAMIC_GAIN (0x48) */
118 0x00, /* REG_MISC_SET_2 (0x49) */
119 0x00, /* REG_SW_SHADOW (0x4A) - Shadow, non HW register */
120 };
121
122 /* codec private data */
123 struct twl4030_priv {
124 struct snd_soc_codec codec;
125
126 unsigned int codec_powered;
127
128 /* reference counts of AIF/APLL users */
129 unsigned int apll_enabled;
130
131 struct snd_pcm_substream *master_substream;
132 struct snd_pcm_substream *slave_substream;
133
134 unsigned int configured;
135 unsigned int rate;
136 unsigned int sample_bits;
137 unsigned int channels;
138
139 unsigned int sysclk;
140
141 /* Output (with associated amp) states */
142 u8 hsl_enabled, hsr_enabled;
143 u8 earpiece_enabled;
144 u8 predrivel_enabled, predriver_enabled;
145 u8 carkitl_enabled, carkitr_enabled;
146
147 /* Delay needed after enabling the digimic interface */
148 unsigned int digimic_delay;
149 };
150
151 /*
152 * read twl4030 register cache
153 */
154 static inline unsigned int twl4030_read_reg_cache(struct snd_soc_codec *codec,
155 unsigned int reg)
156 {
157 u8 *cache = codec->reg_cache;
158
159 if (reg >= TWL4030_CACHEREGNUM)
160 return -EIO;
161
162 return cache[reg];
163 }
164
165 /*
166 * write twl4030 register cache
167 */
168 static inline void twl4030_write_reg_cache(struct snd_soc_codec *codec,
169 u8 reg, u8 value)
170 {
171 u8 *cache = codec->reg_cache;
172
173 if (reg >= TWL4030_CACHEREGNUM)
174 return;
175 cache[reg] = value;
176 }
177
178 /*
179 * write to the twl4030 register space
180 */
181 static int twl4030_write(struct snd_soc_codec *codec,
182 unsigned int reg, unsigned int value)
183 {
184 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
185 int write_to_reg = 0;
186
187 twl4030_write_reg_cache(codec, reg, value);
188 if (likely(reg < TWL4030_REG_SW_SHADOW)) {
189 /* Decide if the given register can be written */
190 switch (reg) {
191 case TWL4030_REG_EAR_CTL:
192 if (twl4030->earpiece_enabled)
193 write_to_reg = 1;
194 break;
195 case TWL4030_REG_PREDL_CTL:
196 if (twl4030->predrivel_enabled)
197 write_to_reg = 1;
198 break;
199 case TWL4030_REG_PREDR_CTL:
200 if (twl4030->predriver_enabled)
201 write_to_reg = 1;
202 break;
203 case TWL4030_REG_PRECKL_CTL:
204 if (twl4030->carkitl_enabled)
205 write_to_reg = 1;
206 break;
207 case TWL4030_REG_PRECKR_CTL:
208 if (twl4030->carkitr_enabled)
209 write_to_reg = 1;
210 break;
211 case TWL4030_REG_HS_GAIN_SET:
212 if (twl4030->hsl_enabled || twl4030->hsr_enabled)
213 write_to_reg = 1;
214 break;
215 default:
216 /* All other register can be written */
217 write_to_reg = 1;
218 break;
219 }
220 if (write_to_reg)
221 return twl_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE,
222 value, reg);
223 }
224 return 0;
225 }
226
227 static void twl4030_codec_enable(struct snd_soc_codec *codec, int enable)
228 {
229 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
230 int mode;
231
232 if (enable == twl4030->codec_powered)
233 return;
234
235 if (enable)
236 mode = twl4030_codec_enable_resource(TWL4030_CODEC_RES_POWER);
237 else
238 mode = twl4030_codec_disable_resource(TWL4030_CODEC_RES_POWER);
239
240 if (mode >= 0) {
241 twl4030_write_reg_cache(codec, TWL4030_REG_CODEC_MODE, mode);
242 twl4030->codec_powered = enable;
243 }
244
245 /* REVISIT: this delay is present in TI sample drivers */
246 /* but there seems to be no TRM requirement for it */
247 udelay(10);
248 }
249
250 static inline void twl4030_check_defaults(struct snd_soc_codec *codec)
251 {
252 int i, difference = 0;
253 u8 val;
254
255 dev_dbg(codec->dev, "Checking TWL audio default configuration\n");
256 for (i = 1; i <= TWL4030_REG_MISC_SET_2; i++) {
257 twl_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, &val, i);
258 if (val != twl4030_reg[i]) {
259 difference++;
260 dev_dbg(codec->dev,
261 "Reg 0x%02x: chip: 0x%02x driver: 0x%02x\n",
262 i, val, twl4030_reg[i]);
263 }
264 }
265 dev_dbg(codec->dev, "Found %d non maching registers. %s\n",
266 difference, difference ? "Not OK" : "OK");
267 }
268
269 static inline void twl4030_reset_registers(struct snd_soc_codec *codec)
270 {
271 int i;
272
273 /* set all audio section registers to reasonable defaults */
274 for (i = TWL4030_REG_OPTION; i <= TWL4030_REG_MISC_SET_2; i++)
275 if (i != TWL4030_REG_APLL_CTL)
276 twl4030_write(codec, i, twl4030_reg[i]);
277
278 }
279
280 static void twl4030_init_chip(struct platform_device *pdev)
281 {
282 struct snd_soc_device *socdev = platform_get_drvdata(pdev);
283 struct twl4030_setup_data *setup = socdev->codec_data;
284 struct snd_soc_codec *codec = socdev->card->codec;
285 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
286 u8 reg, byte;
287 int i = 0;
288
289 /* Check defaults, if instructed before anything else */
290 if (setup && setup->check_defaults)
291 twl4030_check_defaults(codec);
292
293 /* Reset registers, if no setup data or if instructed to do so */
294 if (!setup || (setup && setup->reset_registers))
295 twl4030_reset_registers(codec);
296
297 /* Refresh APLL_CTL register from HW */
298 twl_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, &byte,
299 TWL4030_REG_APLL_CTL);
300 twl4030_write_reg_cache(codec, TWL4030_REG_APLL_CTL, byte);
301
302 /* anti-pop when changing analog gain */
303 reg = twl4030_read_reg_cache(codec, TWL4030_REG_MISC_SET_1);
304 twl4030_write(codec, TWL4030_REG_MISC_SET_1,
305 reg | TWL4030_SMOOTH_ANAVOL_EN);
306
307 twl4030_write(codec, TWL4030_REG_OPTION,
308 TWL4030_ATXL1_EN | TWL4030_ATXR1_EN |
309 TWL4030_ARXL2_EN | TWL4030_ARXR2_EN);
310
311 /* REG_ARXR2_APGA_CTL reset according to the TRM: 0dB, DA_EN */
312 twl4030_write(codec, TWL4030_REG_ARXR2_APGA_CTL, 0x32);
313
314 /* Machine dependent setup */
315 if (!setup)
316 return;
317
318 twl4030->digimic_delay = setup->digimic_delay;
319
320 /* Configuration for headset ramp delay from setup data */
321 if (setup->sysclk != twl4030->sysclk)
322 dev_warn(codec->dev,
323 "Mismatch in APLL mclk: %u (configured: %u)\n",
324 setup->sysclk, twl4030->sysclk);
325
326 reg = twl4030_read_reg_cache(codec, TWL4030_REG_HS_POPN_SET);
327 reg &= ~TWL4030_RAMP_DELAY;
328 reg |= (setup->ramp_delay_value << 2);
329 twl4030_write_reg_cache(codec, TWL4030_REG_HS_POPN_SET, reg);
330
331 /* initiate offset cancellation */
332 twl4030_codec_enable(codec, 1);
333
334 reg = twl4030_read_reg_cache(codec, TWL4030_REG_ANAMICL);
335 reg &= ~TWL4030_OFFSET_CNCL_SEL;
336 reg |= setup->offset_cncl_path;
337 twl4030_write(codec, TWL4030_REG_ANAMICL,
338 reg | TWL4030_CNCL_OFFSET_START);
339
340 /* wait for offset cancellation to complete */
341 do {
342 /* this takes a little while, so don't slam i2c */
343 udelay(2000);
344 twl_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, &byte,
345 TWL4030_REG_ANAMICL);
346 } while ((i++ < 100) &&
347 ((byte & TWL4030_CNCL_OFFSET_START) ==
348 TWL4030_CNCL_OFFSET_START));
349
350 /* Make sure that the reg_cache has the same value as the HW */
351 twl4030_write_reg_cache(codec, TWL4030_REG_ANAMICL, byte);
352
353 twl4030_codec_enable(codec, 0);
354 }
355
356 static void twl4030_apll_enable(struct snd_soc_codec *codec, int enable)
357 {
358 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
359 int status = -1;
360
361 if (enable) {
362 twl4030->apll_enabled++;
363 if (twl4030->apll_enabled == 1)
364 status = twl4030_codec_enable_resource(
365 TWL4030_CODEC_RES_APLL);
366 } else {
367 twl4030->apll_enabled--;
368 if (!twl4030->apll_enabled)
369 status = twl4030_codec_disable_resource(
370 TWL4030_CODEC_RES_APLL);
371 }
372
373 if (status >= 0)
374 twl4030_write_reg_cache(codec, TWL4030_REG_APLL_CTL, status);
375 }
376
377 /* Earpiece */
378 static const struct snd_kcontrol_new twl4030_dapm_earpiece_controls[] = {
379 SOC_DAPM_SINGLE("Voice", TWL4030_REG_EAR_CTL, 0, 1, 0),
380 SOC_DAPM_SINGLE("AudioL1", TWL4030_REG_EAR_CTL, 1, 1, 0),
381 SOC_DAPM_SINGLE("AudioL2", TWL4030_REG_EAR_CTL, 2, 1, 0),
382 SOC_DAPM_SINGLE("AudioR1", TWL4030_REG_EAR_CTL, 3, 1, 0),
383 };
384
385 /* PreDrive Left */
386 static const struct snd_kcontrol_new twl4030_dapm_predrivel_controls[] = {
387 SOC_DAPM_SINGLE("Voice", TWL4030_REG_PREDL_CTL, 0, 1, 0),
388 SOC_DAPM_SINGLE("AudioL1", TWL4030_REG_PREDL_CTL, 1, 1, 0),
389 SOC_DAPM_SINGLE("AudioL2", TWL4030_REG_PREDL_CTL, 2, 1, 0),
390 SOC_DAPM_SINGLE("AudioR2", TWL4030_REG_PREDL_CTL, 3, 1, 0),
391 };
392
393 /* PreDrive Right */
394 static const struct snd_kcontrol_new twl4030_dapm_predriver_controls[] = {
395 SOC_DAPM_SINGLE("Voice", TWL4030_REG_PREDR_CTL, 0, 1, 0),
396 SOC_DAPM_SINGLE("AudioR1", TWL4030_REG_PREDR_CTL, 1, 1, 0),
397 SOC_DAPM_SINGLE("AudioR2", TWL4030_REG_PREDR_CTL, 2, 1, 0),
398 SOC_DAPM_SINGLE("AudioL2", TWL4030_REG_PREDR_CTL, 3, 1, 0),
399 };
400
401 /* Headset Left */
402 static const struct snd_kcontrol_new twl4030_dapm_hsol_controls[] = {
403 SOC_DAPM_SINGLE("Voice", TWL4030_REG_HS_SEL, 0, 1, 0),
404 SOC_DAPM_SINGLE("AudioL1", TWL4030_REG_HS_SEL, 1, 1, 0),
405 SOC_DAPM_SINGLE("AudioL2", TWL4030_REG_HS_SEL, 2, 1, 0),
406 };
407
408 /* Headset Right */
409 static const struct snd_kcontrol_new twl4030_dapm_hsor_controls[] = {
410 SOC_DAPM_SINGLE("Voice", TWL4030_REG_HS_SEL, 3, 1, 0),
411 SOC_DAPM_SINGLE("AudioR1", TWL4030_REG_HS_SEL, 4, 1, 0),
412 SOC_DAPM_SINGLE("AudioR2", TWL4030_REG_HS_SEL, 5, 1, 0),
413 };
414
415 /* Carkit Left */
416 static const struct snd_kcontrol_new twl4030_dapm_carkitl_controls[] = {
417 SOC_DAPM_SINGLE("Voice", TWL4030_REG_PRECKL_CTL, 0, 1, 0),
418 SOC_DAPM_SINGLE("AudioL1", TWL4030_REG_PRECKL_CTL, 1, 1, 0),
419 SOC_DAPM_SINGLE("AudioL2", TWL4030_REG_PRECKL_CTL, 2, 1, 0),
420 };
421
422 /* Carkit Right */
423 static const struct snd_kcontrol_new twl4030_dapm_carkitr_controls[] = {
424 SOC_DAPM_SINGLE("Voice", TWL4030_REG_PRECKR_CTL, 0, 1, 0),
425 SOC_DAPM_SINGLE("AudioR1", TWL4030_REG_PRECKR_CTL, 1, 1, 0),
426 SOC_DAPM_SINGLE("AudioR2", TWL4030_REG_PRECKR_CTL, 2, 1, 0),
427 };
428
429 /* Handsfree Left */
430 static const char *twl4030_handsfreel_texts[] =
431 {"Voice", "AudioL1", "AudioL2", "AudioR2"};
432
433 static const struct soc_enum twl4030_handsfreel_enum =
434 SOC_ENUM_SINGLE(TWL4030_REG_HFL_CTL, 0,
435 ARRAY_SIZE(twl4030_handsfreel_texts),
436 twl4030_handsfreel_texts);
437
438 static const struct snd_kcontrol_new twl4030_dapm_handsfreel_control =
439 SOC_DAPM_ENUM("Route", twl4030_handsfreel_enum);
440
441 /* Handsfree Left virtual mute */
442 static const struct snd_kcontrol_new twl4030_dapm_handsfreelmute_control =
443 SOC_DAPM_SINGLE("Switch", TWL4030_REG_SW_SHADOW, 0, 1, 0);
444
445 /* Handsfree Right */
446 static const char *twl4030_handsfreer_texts[] =
447 {"Voice", "AudioR1", "AudioR2", "AudioL2"};
448
449 static const struct soc_enum twl4030_handsfreer_enum =
450 SOC_ENUM_SINGLE(TWL4030_REG_HFR_CTL, 0,
451 ARRAY_SIZE(twl4030_handsfreer_texts),
452 twl4030_handsfreer_texts);
453
454 static const struct snd_kcontrol_new twl4030_dapm_handsfreer_control =
455 SOC_DAPM_ENUM("Route", twl4030_handsfreer_enum);
456
457 /* Handsfree Right virtual mute */
458 static const struct snd_kcontrol_new twl4030_dapm_handsfreermute_control =
459 SOC_DAPM_SINGLE("Switch", TWL4030_REG_SW_SHADOW, 1, 1, 0);
460
461 /* Vibra */
462 /* Vibra audio path selection */
463 static const char *twl4030_vibra_texts[] =
464 {"AudioL1", "AudioR1", "AudioL2", "AudioR2"};
465
466 static const struct soc_enum twl4030_vibra_enum =
467 SOC_ENUM_SINGLE(TWL4030_REG_VIBRA_CTL, 2,
468 ARRAY_SIZE(twl4030_vibra_texts),
469 twl4030_vibra_texts);
470
471 static const struct snd_kcontrol_new twl4030_dapm_vibra_control =
472 SOC_DAPM_ENUM("Route", twl4030_vibra_enum);
473
474 /* Vibra path selection: local vibrator (PWM) or audio driven */
475 static const char *twl4030_vibrapath_texts[] =
476 {"Local vibrator", "Audio"};
477
478 static const struct soc_enum twl4030_vibrapath_enum =
479 SOC_ENUM_SINGLE(TWL4030_REG_VIBRA_CTL, 4,
480 ARRAY_SIZE(twl4030_vibrapath_texts),
481 twl4030_vibrapath_texts);
482
483 static const struct snd_kcontrol_new twl4030_dapm_vibrapath_control =
484 SOC_DAPM_ENUM("Route", twl4030_vibrapath_enum);
485
486 /* Left analog microphone selection */
487 static const struct snd_kcontrol_new twl4030_dapm_analoglmic_controls[] = {
488 SOC_DAPM_SINGLE("Main Mic Capture Switch",
489 TWL4030_REG_ANAMICL, 0, 1, 0),
490 SOC_DAPM_SINGLE("Headset Mic Capture Switch",
491 TWL4030_REG_ANAMICL, 1, 1, 0),
492 SOC_DAPM_SINGLE("AUXL Capture Switch",
493 TWL4030_REG_ANAMICL, 2, 1, 0),
494 SOC_DAPM_SINGLE("Carkit Mic Capture Switch",
495 TWL4030_REG_ANAMICL, 3, 1, 0),
496 };
497
498 /* Right analog microphone selection */
499 static const struct snd_kcontrol_new twl4030_dapm_analogrmic_controls[] = {
500 SOC_DAPM_SINGLE("Sub Mic Capture Switch", TWL4030_REG_ANAMICR, 0, 1, 0),
501 SOC_DAPM_SINGLE("AUXR Capture Switch", TWL4030_REG_ANAMICR, 2, 1, 0),
502 };
503
504 /* TX1 L/R Analog/Digital microphone selection */
505 static const char *twl4030_micpathtx1_texts[] =
506 {"Analog", "Digimic0"};
507
508 static const struct soc_enum twl4030_micpathtx1_enum =
509 SOC_ENUM_SINGLE(TWL4030_REG_ADCMICSEL, 0,
510 ARRAY_SIZE(twl4030_micpathtx1_texts),
511 twl4030_micpathtx1_texts);
512
513 static const struct snd_kcontrol_new twl4030_dapm_micpathtx1_control =
514 SOC_DAPM_ENUM("Route", twl4030_micpathtx1_enum);
515
516 /* TX2 L/R Analog/Digital microphone selection */
517 static const char *twl4030_micpathtx2_texts[] =
518 {"Analog", "Digimic1"};
519
520 static const struct soc_enum twl4030_micpathtx2_enum =
521 SOC_ENUM_SINGLE(TWL4030_REG_ADCMICSEL, 2,
522 ARRAY_SIZE(twl4030_micpathtx2_texts),
523 twl4030_micpathtx2_texts);
524
525 static const struct snd_kcontrol_new twl4030_dapm_micpathtx2_control =
526 SOC_DAPM_ENUM("Route", twl4030_micpathtx2_enum);
527
528 /* Analog bypass for AudioR1 */
529 static const struct snd_kcontrol_new twl4030_dapm_abypassr1_control =
530 SOC_DAPM_SINGLE("Switch", TWL4030_REG_ARXR1_APGA_CTL, 2, 1, 0);
531
532 /* Analog bypass for AudioL1 */
533 static const struct snd_kcontrol_new twl4030_dapm_abypassl1_control =
534 SOC_DAPM_SINGLE("Switch", TWL4030_REG_ARXL1_APGA_CTL, 2, 1, 0);
535
536 /* Analog bypass for AudioR2 */
537 static const struct snd_kcontrol_new twl4030_dapm_abypassr2_control =
538 SOC_DAPM_SINGLE("Switch", TWL4030_REG_ARXR2_APGA_CTL, 2, 1, 0);
539
540 /* Analog bypass for AudioL2 */
541 static const struct snd_kcontrol_new twl4030_dapm_abypassl2_control =
542 SOC_DAPM_SINGLE("Switch", TWL4030_REG_ARXL2_APGA_CTL, 2, 1, 0);
543
544 /* Analog bypass for Voice */
545 static const struct snd_kcontrol_new twl4030_dapm_abypassv_control =
546 SOC_DAPM_SINGLE("Switch", TWL4030_REG_VDL_APGA_CTL, 2, 1, 0);
547
548 /* Digital bypass gain, mute instead of -30dB */
549 static const unsigned int twl4030_dapm_dbypass_tlv[] = {
550 TLV_DB_RANGE_HEAD(3),
551 0, 1, TLV_DB_SCALE_ITEM(-3000, 600, 1),
552 2, 3, TLV_DB_SCALE_ITEM(-2400, 0, 0),
553 4, 7, TLV_DB_SCALE_ITEM(-1800, 600, 0),
554 };
555
556 /* Digital bypass left (TX1L -> RX2L) */
557 static const struct snd_kcontrol_new twl4030_dapm_dbypassl_control =
558 SOC_DAPM_SINGLE_TLV("Volume",
559 TWL4030_REG_ATX2ARXPGA, 3, 7, 0,
560 twl4030_dapm_dbypass_tlv);
561
562 /* Digital bypass right (TX1R -> RX2R) */
563 static const struct snd_kcontrol_new twl4030_dapm_dbypassr_control =
564 SOC_DAPM_SINGLE_TLV("Volume",
565 TWL4030_REG_ATX2ARXPGA, 0, 7, 0,
566 twl4030_dapm_dbypass_tlv);
567
568 /*
569 * Voice Sidetone GAIN volume control:
570 * from -51 to -10 dB in 1 dB steps (mute instead of -51 dB)
571 */
572 static DECLARE_TLV_DB_SCALE(twl4030_dapm_dbypassv_tlv, -5100, 100, 1);
573
574 /* Digital bypass voice: sidetone (VUL -> VDL)*/
575 static const struct snd_kcontrol_new twl4030_dapm_dbypassv_control =
576 SOC_DAPM_SINGLE_TLV("Volume",
577 TWL4030_REG_VSTPGA, 0, 0x29, 0,
578 twl4030_dapm_dbypassv_tlv);
579
580 static int micpath_event(struct snd_soc_dapm_widget *w,
581 struct snd_kcontrol *kcontrol, int event)
582 {
583 struct soc_enum *e = (struct soc_enum *)w->kcontrols->private_value;
584 unsigned char adcmicsel, micbias_ctl;
585
586 adcmicsel = twl4030_read_reg_cache(w->codec, TWL4030_REG_ADCMICSEL);
587 micbias_ctl = twl4030_read_reg_cache(w->codec, TWL4030_REG_MICBIAS_CTL);
588 /* Prepare the bits for the given TX path:
589 * shift_l == 0: TX1 microphone path
590 * shift_l == 2: TX2 microphone path */
591 if (e->shift_l) {
592 /* TX2 microphone path */
593 if (adcmicsel & TWL4030_TX2IN_SEL)
594 micbias_ctl |= TWL4030_MICBIAS2_CTL; /* digimic */
595 else
596 micbias_ctl &= ~TWL4030_MICBIAS2_CTL;
597 } else {
598 /* TX1 microphone path */
599 if (adcmicsel & TWL4030_TX1IN_SEL)
600 micbias_ctl |= TWL4030_MICBIAS1_CTL; /* digimic */
601 else
602 micbias_ctl &= ~TWL4030_MICBIAS1_CTL;
603 }
604
605 twl4030_write(w->codec, TWL4030_REG_MICBIAS_CTL, micbias_ctl);
606
607 return 0;
608 }
609
610 /*
611 * Output PGA builder:
612 * Handle the muting and unmuting of the given output (turning off the
613 * amplifier associated with the output pin)
614 * On mute bypass the reg_cache and write 0 to the register
615 * On unmute: restore the register content from the reg_cache
616 * Outputs handled in this way: Earpiece, PreDrivL/R, CarkitL/R
617 */
618 #define TWL4030_OUTPUT_PGA(pin_name, reg, mask) \
619 static int pin_name##pga_event(struct snd_soc_dapm_widget *w, \
620 struct snd_kcontrol *kcontrol, int event) \
621 { \
622 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(w->codec); \
623 \
624 switch (event) { \
625 case SND_SOC_DAPM_POST_PMU: \
626 twl4030->pin_name##_enabled = 1; \
627 twl4030_write(w->codec, reg, \
628 twl4030_read_reg_cache(w->codec, reg)); \
629 break; \
630 case SND_SOC_DAPM_POST_PMD: \
631 twl4030->pin_name##_enabled = 0; \
632 twl_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE, \
633 0, reg); \
634 break; \
635 } \
636 return 0; \
637 }
638
639 TWL4030_OUTPUT_PGA(earpiece, TWL4030_REG_EAR_CTL, TWL4030_EAR_GAIN);
640 TWL4030_OUTPUT_PGA(predrivel, TWL4030_REG_PREDL_CTL, TWL4030_PREDL_GAIN);
641 TWL4030_OUTPUT_PGA(predriver, TWL4030_REG_PREDR_CTL, TWL4030_PREDR_GAIN);
642 TWL4030_OUTPUT_PGA(carkitl, TWL4030_REG_PRECKL_CTL, TWL4030_PRECKL_GAIN);
643 TWL4030_OUTPUT_PGA(carkitr, TWL4030_REG_PRECKR_CTL, TWL4030_PRECKR_GAIN);
644
645 static void handsfree_ramp(struct snd_soc_codec *codec, int reg, int ramp)
646 {
647 unsigned char hs_ctl;
648
649 hs_ctl = twl4030_read_reg_cache(codec, reg);
650
651 if (ramp) {
652 /* HF ramp-up */
653 hs_ctl |= TWL4030_HF_CTL_REF_EN;
654 twl4030_write(codec, reg, hs_ctl);
655 udelay(10);
656 hs_ctl |= TWL4030_HF_CTL_RAMP_EN;
657 twl4030_write(codec, reg, hs_ctl);
658 udelay(40);
659 hs_ctl |= TWL4030_HF_CTL_LOOP_EN;
660 hs_ctl |= TWL4030_HF_CTL_HB_EN;
661 twl4030_write(codec, reg, hs_ctl);
662 } else {
663 /* HF ramp-down */
664 hs_ctl &= ~TWL4030_HF_CTL_LOOP_EN;
665 hs_ctl &= ~TWL4030_HF_CTL_HB_EN;
666 twl4030_write(codec, reg, hs_ctl);
667 hs_ctl &= ~TWL4030_HF_CTL_RAMP_EN;
668 twl4030_write(codec, reg, hs_ctl);
669 udelay(40);
670 hs_ctl &= ~TWL4030_HF_CTL_REF_EN;
671 twl4030_write(codec, reg, hs_ctl);
672 }
673 }
674
675 static int handsfreelpga_event(struct snd_soc_dapm_widget *w,
676 struct snd_kcontrol *kcontrol, int event)
677 {
678 switch (event) {
679 case SND_SOC_DAPM_POST_PMU:
680 handsfree_ramp(w->codec, TWL4030_REG_HFL_CTL, 1);
681 break;
682 case SND_SOC_DAPM_POST_PMD:
683 handsfree_ramp(w->codec, TWL4030_REG_HFL_CTL, 0);
684 break;
685 }
686 return 0;
687 }
688
689 static int handsfreerpga_event(struct snd_soc_dapm_widget *w,
690 struct snd_kcontrol *kcontrol, int event)
691 {
692 switch (event) {
693 case SND_SOC_DAPM_POST_PMU:
694 handsfree_ramp(w->codec, TWL4030_REG_HFR_CTL, 1);
695 break;
696 case SND_SOC_DAPM_POST_PMD:
697 handsfree_ramp(w->codec, TWL4030_REG_HFR_CTL, 0);
698 break;
699 }
700 return 0;
701 }
702
703 static int vibramux_event(struct snd_soc_dapm_widget *w,
704 struct snd_kcontrol *kcontrol, int event)
705 {
706 twl4030_write(w->codec, TWL4030_REG_VIBRA_SET, 0xff);
707 return 0;
708 }
709
710 static int apll_event(struct snd_soc_dapm_widget *w,
711 struct snd_kcontrol *kcontrol, int event)
712 {
713 switch (event) {
714 case SND_SOC_DAPM_PRE_PMU:
715 twl4030_apll_enable(w->codec, 1);
716 break;
717 case SND_SOC_DAPM_POST_PMD:
718 twl4030_apll_enable(w->codec, 0);
719 break;
720 }
721 return 0;
722 }
723
724 static int aif_event(struct snd_soc_dapm_widget *w,
725 struct snd_kcontrol *kcontrol, int event)
726 {
727 u8 audio_if;
728
729 audio_if = twl4030_read_reg_cache(w->codec, TWL4030_REG_AUDIO_IF);
730 switch (event) {
731 case SND_SOC_DAPM_PRE_PMU:
732 /* Enable AIF */
733 /* enable the PLL before we use it to clock the DAI */
734 twl4030_apll_enable(w->codec, 1);
735
736 twl4030_write(w->codec, TWL4030_REG_AUDIO_IF,
737 audio_if | TWL4030_AIF_EN);
738 break;
739 case SND_SOC_DAPM_POST_PMD:
740 /* disable the DAI before we stop it's source PLL */
741 twl4030_write(w->codec, TWL4030_REG_AUDIO_IF,
742 audio_if & ~TWL4030_AIF_EN);
743 twl4030_apll_enable(w->codec, 0);
744 break;
745 }
746 return 0;
747 }
748
749 static void headset_ramp(struct snd_soc_codec *codec, int ramp)
750 {
751 struct snd_soc_device *socdev = codec->socdev;
752 struct twl4030_setup_data *setup = socdev->codec_data;
753
754 unsigned char hs_gain, hs_pop;
755 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
756 /* Base values for ramp delay calculation: 2^19 - 2^26 */
757 unsigned int ramp_base[] = {524288, 1048576, 2097152, 4194304,
758 8388608, 16777216, 33554432, 67108864};
759
760 hs_gain = twl4030_read_reg_cache(codec, TWL4030_REG_HS_GAIN_SET);
761 hs_pop = twl4030_read_reg_cache(codec, TWL4030_REG_HS_POPN_SET);
762
763 /* Enable external mute control, this dramatically reduces
764 * the pop-noise */
765 if (setup && setup->hs_extmute) {
766 if (setup->set_hs_extmute) {
767 setup->set_hs_extmute(1);
768 } else {
769 hs_pop |= TWL4030_EXTMUTE;
770 twl4030_write(codec, TWL4030_REG_HS_POPN_SET, hs_pop);
771 }
772 }
773
774 if (ramp) {
775 /* Headset ramp-up according to the TRM */
776 hs_pop |= TWL4030_VMID_EN;
777 twl4030_write(codec, TWL4030_REG_HS_POPN_SET, hs_pop);
778 /* Actually write to the register */
779 twl_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE,
780 hs_gain,
781 TWL4030_REG_HS_GAIN_SET);
782 hs_pop |= TWL4030_RAMP_EN;
783 twl4030_write(codec, TWL4030_REG_HS_POPN_SET, hs_pop);
784 /* Wait ramp delay time + 1, so the VMID can settle */
785 mdelay((ramp_base[(hs_pop & TWL4030_RAMP_DELAY) >> 2] /
786 twl4030->sysclk) + 1);
787 } else {
788 /* Headset ramp-down _not_ according to
789 * the TRM, but in a way that it is working */
790 hs_pop &= ~TWL4030_RAMP_EN;
791 twl4030_write(codec, TWL4030_REG_HS_POPN_SET, hs_pop);
792 /* Wait ramp delay time + 1, so the VMID can settle */
793 mdelay((ramp_base[(hs_pop & TWL4030_RAMP_DELAY) >> 2] /
794 twl4030->sysclk) + 1);
795 /* Bypass the reg_cache to mute the headset */
796 twl_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE,
797 hs_gain & (~0x0f),
798 TWL4030_REG_HS_GAIN_SET);
799
800 hs_pop &= ~TWL4030_VMID_EN;
801 twl4030_write(codec, TWL4030_REG_HS_POPN_SET, hs_pop);
802 }
803
804 /* Disable external mute */
805 if (setup && setup->hs_extmute) {
806 if (setup->set_hs_extmute) {
807 setup->set_hs_extmute(0);
808 } else {
809 hs_pop &= ~TWL4030_EXTMUTE;
810 twl4030_write(codec, TWL4030_REG_HS_POPN_SET, hs_pop);
811 }
812 }
813 }
814
815 static int headsetlpga_event(struct snd_soc_dapm_widget *w,
816 struct snd_kcontrol *kcontrol, int event)
817 {
818 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(w->codec);
819
820 switch (event) {
821 case SND_SOC_DAPM_POST_PMU:
822 /* Do the ramp-up only once */
823 if (!twl4030->hsr_enabled)
824 headset_ramp(w->codec, 1);
825
826 twl4030->hsl_enabled = 1;
827 break;
828 case SND_SOC_DAPM_POST_PMD:
829 /* Do the ramp-down only if both headsetL/R is disabled */
830 if (!twl4030->hsr_enabled)
831 headset_ramp(w->codec, 0);
832
833 twl4030->hsl_enabled = 0;
834 break;
835 }
836 return 0;
837 }
838
839 static int headsetrpga_event(struct snd_soc_dapm_widget *w,
840 struct snd_kcontrol *kcontrol, int event)
841 {
842 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(w->codec);
843
844 switch (event) {
845 case SND_SOC_DAPM_POST_PMU:
846 /* Do the ramp-up only once */
847 if (!twl4030->hsl_enabled)
848 headset_ramp(w->codec, 1);
849
850 twl4030->hsr_enabled = 1;
851 break;
852 case SND_SOC_DAPM_POST_PMD:
853 /* Do the ramp-down only if both headsetL/R is disabled */
854 if (!twl4030->hsl_enabled)
855 headset_ramp(w->codec, 0);
856
857 twl4030->hsr_enabled = 0;
858 break;
859 }
860 return 0;
861 }
862
863 static int digimic_event(struct snd_soc_dapm_widget *w,
864 struct snd_kcontrol *kcontrol, int event)
865 {
866 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(w->codec);
867
868 if (twl4030->digimic_delay)
869 mdelay(twl4030->digimic_delay);
870 return 0;
871 }
872
873 /*
874 * Some of the gain controls in TWL (mostly those which are associated with
875 * the outputs) are implemented in an interesting way:
876 * 0x0 : Power down (mute)
877 * 0x1 : 6dB
878 * 0x2 : 0 dB
879 * 0x3 : -6 dB
880 * Inverting not going to help with these.
881 * Custom volsw and volsw_2r get/put functions to handle these gain bits.
882 */
883 #define SOC_DOUBLE_TLV_TWL4030(xname, xreg, shift_left, shift_right, xmax,\
884 xinvert, tlv_array) \
885 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
886 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
887 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
888 .tlv.p = (tlv_array), \
889 .info = snd_soc_info_volsw, \
890 .get = snd_soc_get_volsw_twl4030, \
891 .put = snd_soc_put_volsw_twl4030, \
892 .private_value = (unsigned long)&(struct soc_mixer_control) \
893 {.reg = xreg, .shift = shift_left, .rshift = shift_right,\
894 .max = xmax, .invert = xinvert} }
895 #define SOC_DOUBLE_R_TLV_TWL4030(xname, reg_left, reg_right, xshift, xmax,\
896 xinvert, tlv_array) \
897 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
898 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
899 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
900 .tlv.p = (tlv_array), \
901 .info = snd_soc_info_volsw_2r, \
902 .get = snd_soc_get_volsw_r2_twl4030,\
903 .put = snd_soc_put_volsw_r2_twl4030, \
904 .private_value = (unsigned long)&(struct soc_mixer_control) \
905 {.reg = reg_left, .rreg = reg_right, .shift = xshift, \
906 .rshift = xshift, .max = xmax, .invert = xinvert} }
907 #define SOC_SINGLE_TLV_TWL4030(xname, xreg, xshift, xmax, xinvert, tlv_array) \
908 SOC_DOUBLE_TLV_TWL4030(xname, xreg, xshift, xshift, xmax, \
909 xinvert, tlv_array)
910
911 static int snd_soc_get_volsw_twl4030(struct snd_kcontrol *kcontrol,
912 struct snd_ctl_elem_value *ucontrol)
913 {
914 struct soc_mixer_control *mc =
915 (struct soc_mixer_control *)kcontrol->private_value;
916 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
917 unsigned int reg = mc->reg;
918 unsigned int shift = mc->shift;
919 unsigned int rshift = mc->rshift;
920 int max = mc->max;
921 int mask = (1 << fls(max)) - 1;
922
923 ucontrol->value.integer.value[0] =
924 (snd_soc_read(codec, reg) >> shift) & mask;
925 if (ucontrol->value.integer.value[0])
926 ucontrol->value.integer.value[0] =
927 max + 1 - ucontrol->value.integer.value[0];
928
929 if (shift != rshift) {
930 ucontrol->value.integer.value[1] =
931 (snd_soc_read(codec, reg) >> rshift) & mask;
932 if (ucontrol->value.integer.value[1])
933 ucontrol->value.integer.value[1] =
934 max + 1 - ucontrol->value.integer.value[1];
935 }
936
937 return 0;
938 }
939
940 static int snd_soc_put_volsw_twl4030(struct snd_kcontrol *kcontrol,
941 struct snd_ctl_elem_value *ucontrol)
942 {
943 struct soc_mixer_control *mc =
944 (struct soc_mixer_control *)kcontrol->private_value;
945 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
946 unsigned int reg = mc->reg;
947 unsigned int shift = mc->shift;
948 unsigned int rshift = mc->rshift;
949 int max = mc->max;
950 int mask = (1 << fls(max)) - 1;
951 unsigned short val, val2, val_mask;
952
953 val = (ucontrol->value.integer.value[0] & mask);
954
955 val_mask = mask << shift;
956 if (val)
957 val = max + 1 - val;
958 val = val << shift;
959 if (shift != rshift) {
960 val2 = (ucontrol->value.integer.value[1] & mask);
961 val_mask |= mask << rshift;
962 if (val2)
963 val2 = max + 1 - val2;
964 val |= val2 << rshift;
965 }
966 return snd_soc_update_bits(codec, reg, val_mask, val);
967 }
968
969 static int snd_soc_get_volsw_r2_twl4030(struct snd_kcontrol *kcontrol,
970 struct snd_ctl_elem_value *ucontrol)
971 {
972 struct soc_mixer_control *mc =
973 (struct soc_mixer_control *)kcontrol->private_value;
974 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
975 unsigned int reg = mc->reg;
976 unsigned int reg2 = mc->rreg;
977 unsigned int shift = mc->shift;
978 int max = mc->max;
979 int mask = (1<<fls(max))-1;
980
981 ucontrol->value.integer.value[0] =
982 (snd_soc_read(codec, reg) >> shift) & mask;
983 ucontrol->value.integer.value[1] =
984 (snd_soc_read(codec, reg2) >> shift) & mask;
985
986 if (ucontrol->value.integer.value[0])
987 ucontrol->value.integer.value[0] =
988 max + 1 - ucontrol->value.integer.value[0];
989 if (ucontrol->value.integer.value[1])
990 ucontrol->value.integer.value[1] =
991 max + 1 - ucontrol->value.integer.value[1];
992
993 return 0;
994 }
995
996 static int snd_soc_put_volsw_r2_twl4030(struct snd_kcontrol *kcontrol,
997 struct snd_ctl_elem_value *ucontrol)
998 {
999 struct soc_mixer_control *mc =
1000 (struct soc_mixer_control *)kcontrol->private_value;
1001 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
1002 unsigned int reg = mc->reg;
1003 unsigned int reg2 = mc->rreg;
1004 unsigned int shift = mc->shift;
1005 int max = mc->max;
1006 int mask = (1 << fls(max)) - 1;
1007 int err;
1008 unsigned short val, val2, val_mask;
1009
1010 val_mask = mask << shift;
1011 val = (ucontrol->value.integer.value[0] & mask);
1012 val2 = (ucontrol->value.integer.value[1] & mask);
1013
1014 if (val)
1015 val = max + 1 - val;
1016 if (val2)
1017 val2 = max + 1 - val2;
1018
1019 val = val << shift;
1020 val2 = val2 << shift;
1021
1022 err = snd_soc_update_bits(codec, reg, val_mask, val);
1023 if (err < 0)
1024 return err;
1025
1026 err = snd_soc_update_bits(codec, reg2, val_mask, val2);
1027 return err;
1028 }
1029
1030 /* Codec operation modes */
1031 static const char *twl4030_op_modes_texts[] = {
1032 "Option 2 (voice/audio)", "Option 1 (audio)"
1033 };
1034
1035 static const struct soc_enum twl4030_op_modes_enum =
1036 SOC_ENUM_SINGLE(TWL4030_REG_CODEC_MODE, 0,
1037 ARRAY_SIZE(twl4030_op_modes_texts),
1038 twl4030_op_modes_texts);
1039
1040 static int snd_soc_put_twl4030_opmode_enum_double(struct snd_kcontrol *kcontrol,
1041 struct snd_ctl_elem_value *ucontrol)
1042 {
1043 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
1044 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
1045 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1046 unsigned short val;
1047 unsigned short mask, bitmask;
1048
1049 if (twl4030->configured) {
1050 printk(KERN_ERR "twl4030 operation mode cannot be "
1051 "changed on-the-fly\n");
1052 return -EBUSY;
1053 }
1054
1055 for (bitmask = 1; bitmask < e->max; bitmask <<= 1)
1056 ;
1057 if (ucontrol->value.enumerated.item[0] > e->max - 1)
1058 return -EINVAL;
1059
1060 val = ucontrol->value.enumerated.item[0] << e->shift_l;
1061 mask = (bitmask - 1) << e->shift_l;
1062 if (e->shift_l != e->shift_r) {
1063 if (ucontrol->value.enumerated.item[1] > e->max - 1)
1064 return -EINVAL;
1065 val |= ucontrol->value.enumerated.item[1] << e->shift_r;
1066 mask |= (bitmask - 1) << e->shift_r;
1067 }
1068
1069 return snd_soc_update_bits(codec, e->reg, mask, val);
1070 }
1071
1072 /*
1073 * FGAIN volume control:
1074 * from -62 to 0 dB in 1 dB steps (mute instead of -63 dB)
1075 */
1076 static DECLARE_TLV_DB_SCALE(digital_fine_tlv, -6300, 100, 1);
1077
1078 /*
1079 * CGAIN volume control:
1080 * 0 dB to 12 dB in 6 dB steps
1081 * value 2 and 3 means 12 dB
1082 */
1083 static DECLARE_TLV_DB_SCALE(digital_coarse_tlv, 0, 600, 0);
1084
1085 /*
1086 * Voice Downlink GAIN volume control:
1087 * from -37 to 12 dB in 1 dB steps (mute instead of -37 dB)
1088 */
1089 static DECLARE_TLV_DB_SCALE(digital_voice_downlink_tlv, -3700, 100, 1);
1090
1091 /*
1092 * Analog playback gain
1093 * -24 dB to 12 dB in 2 dB steps
1094 */
1095 static DECLARE_TLV_DB_SCALE(analog_tlv, -2400, 200, 0);
1096
1097 /*
1098 * Gain controls tied to outputs
1099 * -6 dB to 6 dB in 6 dB steps (mute instead of -12)
1100 */
1101 static DECLARE_TLV_DB_SCALE(output_tvl, -1200, 600, 1);
1102
1103 /*
1104 * Gain control for earpiece amplifier
1105 * 0 dB to 12 dB in 6 dB steps (mute instead of -6)
1106 */
1107 static DECLARE_TLV_DB_SCALE(output_ear_tvl, -600, 600, 1);
1108
1109 /*
1110 * Capture gain after the ADCs
1111 * from 0 dB to 31 dB in 1 dB steps
1112 */
1113 static DECLARE_TLV_DB_SCALE(digital_capture_tlv, 0, 100, 0);
1114
1115 /*
1116 * Gain control for input amplifiers
1117 * 0 dB to 30 dB in 6 dB steps
1118 */
1119 static DECLARE_TLV_DB_SCALE(input_gain_tlv, 0, 600, 0);
1120
1121 /* AVADC clock priority */
1122 static const char *twl4030_avadc_clk_priority_texts[] = {
1123 "Voice high priority", "HiFi high priority"
1124 };
1125
1126 static const struct soc_enum twl4030_avadc_clk_priority_enum =
1127 SOC_ENUM_SINGLE(TWL4030_REG_AVADC_CTL, 2,
1128 ARRAY_SIZE(twl4030_avadc_clk_priority_texts),
1129 twl4030_avadc_clk_priority_texts);
1130
1131 static const char *twl4030_rampdelay_texts[] = {
1132 "27/20/14 ms", "55/40/27 ms", "109/81/55 ms", "218/161/109 ms",
1133 "437/323/218 ms", "874/645/437 ms", "1748/1291/874 ms",
1134 "3495/2581/1748 ms"
1135 };
1136
1137 static const struct soc_enum twl4030_rampdelay_enum =
1138 SOC_ENUM_SINGLE(TWL4030_REG_HS_POPN_SET, 2,
1139 ARRAY_SIZE(twl4030_rampdelay_texts),
1140 twl4030_rampdelay_texts);
1141
1142 /* Vibra H-bridge direction mode */
1143 static const char *twl4030_vibradirmode_texts[] = {
1144 "Vibra H-bridge direction", "Audio data MSB",
1145 };
1146
1147 static const struct soc_enum twl4030_vibradirmode_enum =
1148 SOC_ENUM_SINGLE(TWL4030_REG_VIBRA_CTL, 5,
1149 ARRAY_SIZE(twl4030_vibradirmode_texts),
1150 twl4030_vibradirmode_texts);
1151
1152 /* Vibra H-bridge direction */
1153 static const char *twl4030_vibradir_texts[] = {
1154 "Positive polarity", "Negative polarity",
1155 };
1156
1157 static const struct soc_enum twl4030_vibradir_enum =
1158 SOC_ENUM_SINGLE(TWL4030_REG_VIBRA_CTL, 1,
1159 ARRAY_SIZE(twl4030_vibradir_texts),
1160 twl4030_vibradir_texts);
1161
1162 /* Digimic Left and right swapping */
1163 static const char *twl4030_digimicswap_texts[] = {
1164 "Not swapped", "Swapped",
1165 };
1166
1167 static const struct soc_enum twl4030_digimicswap_enum =
1168 SOC_ENUM_SINGLE(TWL4030_REG_MISC_SET_1, 0,
1169 ARRAY_SIZE(twl4030_digimicswap_texts),
1170 twl4030_digimicswap_texts);
1171
1172 static const struct snd_kcontrol_new twl4030_snd_controls[] = {
1173 /* Codec operation mode control */
1174 SOC_ENUM_EXT("Codec Operation Mode", twl4030_op_modes_enum,
1175 snd_soc_get_enum_double,
1176 snd_soc_put_twl4030_opmode_enum_double),
1177
1178 /* Common playback gain controls */
1179 SOC_DOUBLE_R_TLV("DAC1 Digital Fine Playback Volume",
1180 TWL4030_REG_ARXL1PGA, TWL4030_REG_ARXR1PGA,
1181 0, 0x3f, 0, digital_fine_tlv),
1182 SOC_DOUBLE_R_TLV("DAC2 Digital Fine Playback Volume",
1183 TWL4030_REG_ARXL2PGA, TWL4030_REG_ARXR2PGA,
1184 0, 0x3f, 0, digital_fine_tlv),
1185
1186 SOC_DOUBLE_R_TLV("DAC1 Digital Coarse Playback Volume",
1187 TWL4030_REG_ARXL1PGA, TWL4030_REG_ARXR1PGA,
1188 6, 0x2, 0, digital_coarse_tlv),
1189 SOC_DOUBLE_R_TLV("DAC2 Digital Coarse Playback Volume",
1190 TWL4030_REG_ARXL2PGA, TWL4030_REG_ARXR2PGA,
1191 6, 0x2, 0, digital_coarse_tlv),
1192
1193 SOC_DOUBLE_R_TLV("DAC1 Analog Playback Volume",
1194 TWL4030_REG_ARXL1_APGA_CTL, TWL4030_REG_ARXR1_APGA_CTL,
1195 3, 0x12, 1, analog_tlv),
1196 SOC_DOUBLE_R_TLV("DAC2 Analog Playback Volume",
1197 TWL4030_REG_ARXL2_APGA_CTL, TWL4030_REG_ARXR2_APGA_CTL,
1198 3, 0x12, 1, analog_tlv),
1199 SOC_DOUBLE_R("DAC1 Analog Playback Switch",
1200 TWL4030_REG_ARXL1_APGA_CTL, TWL4030_REG_ARXR1_APGA_CTL,
1201 1, 1, 0),
1202 SOC_DOUBLE_R("DAC2 Analog Playback Switch",
1203 TWL4030_REG_ARXL2_APGA_CTL, TWL4030_REG_ARXR2_APGA_CTL,
1204 1, 1, 0),
1205
1206 /* Common voice downlink gain controls */
1207 SOC_SINGLE_TLV("DAC Voice Digital Downlink Volume",
1208 TWL4030_REG_VRXPGA, 0, 0x31, 0, digital_voice_downlink_tlv),
1209
1210 SOC_SINGLE_TLV("DAC Voice Analog Downlink Volume",
1211 TWL4030_REG_VDL_APGA_CTL, 3, 0x12, 1, analog_tlv),
1212
1213 SOC_SINGLE("DAC Voice Analog Downlink Switch",
1214 TWL4030_REG_VDL_APGA_CTL, 1, 1, 0),
1215
1216 /* Separate output gain controls */
1217 SOC_DOUBLE_R_TLV_TWL4030("PreDriv Playback Volume",
1218 TWL4030_REG_PREDL_CTL, TWL4030_REG_PREDR_CTL,
1219 4, 3, 0, output_tvl),
1220
1221 SOC_DOUBLE_TLV_TWL4030("Headset Playback Volume",
1222 TWL4030_REG_HS_GAIN_SET, 0, 2, 3, 0, output_tvl),
1223
1224 SOC_DOUBLE_R_TLV_TWL4030("Carkit Playback Volume",
1225 TWL4030_REG_PRECKL_CTL, TWL4030_REG_PRECKR_CTL,
1226 4, 3, 0, output_tvl),
1227
1228 SOC_SINGLE_TLV_TWL4030("Earpiece Playback Volume",
1229 TWL4030_REG_EAR_CTL, 4, 3, 0, output_ear_tvl),
1230
1231 /* Common capture gain controls */
1232 SOC_DOUBLE_R_TLV("TX1 Digital Capture Volume",
1233 TWL4030_REG_ATXL1PGA, TWL4030_REG_ATXR1PGA,
1234 0, 0x1f, 0, digital_capture_tlv),
1235 SOC_DOUBLE_R_TLV("TX2 Digital Capture Volume",
1236 TWL4030_REG_AVTXL2PGA, TWL4030_REG_AVTXR2PGA,
1237 0, 0x1f, 0, digital_capture_tlv),
1238
1239 SOC_DOUBLE_TLV("Analog Capture Volume", TWL4030_REG_ANAMIC_GAIN,
1240 0, 3, 5, 0, input_gain_tlv),
1241
1242 SOC_ENUM("AVADC Clock Priority", twl4030_avadc_clk_priority_enum),
1243
1244 SOC_ENUM("HS ramp delay", twl4030_rampdelay_enum),
1245
1246 SOC_ENUM("Vibra H-bridge mode", twl4030_vibradirmode_enum),
1247 SOC_ENUM("Vibra H-bridge direction", twl4030_vibradir_enum),
1248
1249 SOC_ENUM("Digimic LR Swap", twl4030_digimicswap_enum),
1250 };
1251
1252 static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = {
1253 /* Left channel inputs */
1254 SND_SOC_DAPM_INPUT("MAINMIC"),
1255 SND_SOC_DAPM_INPUT("HSMIC"),
1256 SND_SOC_DAPM_INPUT("AUXL"),
1257 SND_SOC_DAPM_INPUT("CARKITMIC"),
1258 /* Right channel inputs */
1259 SND_SOC_DAPM_INPUT("SUBMIC"),
1260 SND_SOC_DAPM_INPUT("AUXR"),
1261 /* Digital microphones (Stereo) */
1262 SND_SOC_DAPM_INPUT("DIGIMIC0"),
1263 SND_SOC_DAPM_INPUT("DIGIMIC1"),
1264
1265 /* Outputs */
1266 SND_SOC_DAPM_OUTPUT("EARPIECE"),
1267 SND_SOC_DAPM_OUTPUT("PREDRIVEL"),
1268 SND_SOC_DAPM_OUTPUT("PREDRIVER"),
1269 SND_SOC_DAPM_OUTPUT("HSOL"),
1270 SND_SOC_DAPM_OUTPUT("HSOR"),
1271 SND_SOC_DAPM_OUTPUT("CARKITL"),
1272 SND_SOC_DAPM_OUTPUT("CARKITR"),
1273 SND_SOC_DAPM_OUTPUT("HFL"),
1274 SND_SOC_DAPM_OUTPUT("HFR"),
1275 SND_SOC_DAPM_OUTPUT("VIBRA"),
1276
1277 /* AIF and APLL clocks for running DAIs (including loopback) */
1278 SND_SOC_DAPM_OUTPUT("Virtual HiFi OUT"),
1279 SND_SOC_DAPM_INPUT("Virtual HiFi IN"),
1280 SND_SOC_DAPM_OUTPUT("Virtual Voice OUT"),
1281
1282 /* DACs */
1283 SND_SOC_DAPM_DAC("DAC Right1", "Right Front HiFi Playback",
1284 SND_SOC_NOPM, 0, 0),
1285 SND_SOC_DAPM_DAC("DAC Left1", "Left Front HiFi Playback",
1286 SND_SOC_NOPM, 0, 0),
1287 SND_SOC_DAPM_DAC("DAC Right2", "Right Rear HiFi Playback",
1288 SND_SOC_NOPM, 0, 0),
1289 SND_SOC_DAPM_DAC("DAC Left2", "Left Rear HiFi Playback",
1290 SND_SOC_NOPM, 0, 0),
1291 SND_SOC_DAPM_DAC("DAC Voice", "Voice Playback",
1292 SND_SOC_NOPM, 0, 0),
1293
1294 /* Analog bypasses */
1295 SND_SOC_DAPM_SWITCH("Right1 Analog Loopback", SND_SOC_NOPM, 0, 0,
1296 &twl4030_dapm_abypassr1_control),
1297 SND_SOC_DAPM_SWITCH("Left1 Analog Loopback", SND_SOC_NOPM, 0, 0,
1298 &twl4030_dapm_abypassl1_control),
1299 SND_SOC_DAPM_SWITCH("Right2 Analog Loopback", SND_SOC_NOPM, 0, 0,
1300 &twl4030_dapm_abypassr2_control),
1301 SND_SOC_DAPM_SWITCH("Left2 Analog Loopback", SND_SOC_NOPM, 0, 0,
1302 &twl4030_dapm_abypassl2_control),
1303 SND_SOC_DAPM_SWITCH("Voice Analog Loopback", SND_SOC_NOPM, 0, 0,
1304 &twl4030_dapm_abypassv_control),
1305
1306 /* Master analog loopback switch */
1307 SND_SOC_DAPM_SUPPLY("FM Loop Enable", TWL4030_REG_MISC_SET_1, 5, 0,
1308 NULL, 0),
1309
1310 /* Digital bypasses */
1311 SND_SOC_DAPM_SWITCH("Left Digital Loopback", SND_SOC_NOPM, 0, 0,
1312 &twl4030_dapm_dbypassl_control),
1313 SND_SOC_DAPM_SWITCH("Right Digital Loopback", SND_SOC_NOPM, 0, 0,
1314 &twl4030_dapm_dbypassr_control),
1315 SND_SOC_DAPM_SWITCH("Voice Digital Loopback", SND_SOC_NOPM, 0, 0,
1316 &twl4030_dapm_dbypassv_control),
1317
1318 /* Digital mixers, power control for the physical DACs */
1319 SND_SOC_DAPM_MIXER("Digital R1 Playback Mixer",
1320 TWL4030_REG_AVDAC_CTL, 0, 0, NULL, 0),
1321 SND_SOC_DAPM_MIXER("Digital L1 Playback Mixer",
1322 TWL4030_REG_AVDAC_CTL, 1, 0, NULL, 0),
1323 SND_SOC_DAPM_MIXER("Digital R2 Playback Mixer",
1324 TWL4030_REG_AVDAC_CTL, 2, 0, NULL, 0),
1325 SND_SOC_DAPM_MIXER("Digital L2 Playback Mixer",
1326 TWL4030_REG_AVDAC_CTL, 3, 0, NULL, 0),
1327 SND_SOC_DAPM_MIXER("Digital Voice Playback Mixer",
1328 TWL4030_REG_AVDAC_CTL, 4, 0, NULL, 0),
1329
1330 /* Analog mixers, power control for the physical PGAs */
1331 SND_SOC_DAPM_MIXER("Analog R1 Playback Mixer",
1332 TWL4030_REG_ARXR1_APGA_CTL, 0, 0, NULL, 0),
1333 SND_SOC_DAPM_MIXER("Analog L1 Playback Mixer",
1334 TWL4030_REG_ARXL1_APGA_CTL, 0, 0, NULL, 0),
1335 SND_SOC_DAPM_MIXER("Analog R2 Playback Mixer",
1336 TWL4030_REG_ARXR2_APGA_CTL, 0, 0, NULL, 0),
1337 SND_SOC_DAPM_MIXER("Analog L2 Playback Mixer",
1338 TWL4030_REG_ARXL2_APGA_CTL, 0, 0, NULL, 0),
1339 SND_SOC_DAPM_MIXER("Analog Voice Playback Mixer",
1340 TWL4030_REG_VDL_APGA_CTL, 0, 0, NULL, 0),
1341
1342 SND_SOC_DAPM_SUPPLY("APLL Enable", SND_SOC_NOPM, 0, 0, apll_event,
1343 SND_SOC_DAPM_PRE_PMU|SND_SOC_DAPM_POST_PMD),
1344
1345 SND_SOC_DAPM_SUPPLY("AIF Enable", SND_SOC_NOPM, 0, 0, aif_event,
1346 SND_SOC_DAPM_PRE_PMU|SND_SOC_DAPM_POST_PMD),
1347
1348 /* Output MIXER controls */
1349 /* Earpiece */
1350 SND_SOC_DAPM_MIXER("Earpiece Mixer", SND_SOC_NOPM, 0, 0,
1351 &twl4030_dapm_earpiece_controls[0],
1352 ARRAY_SIZE(twl4030_dapm_earpiece_controls)),
1353 SND_SOC_DAPM_PGA_E("Earpiece PGA", SND_SOC_NOPM,
1354 0, 0, NULL, 0, earpiecepga_event,
1355 SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
1356 /* PreDrivL/R */
1357 SND_SOC_DAPM_MIXER("PredriveL Mixer", SND_SOC_NOPM, 0, 0,
1358 &twl4030_dapm_predrivel_controls[0],
1359 ARRAY_SIZE(twl4030_dapm_predrivel_controls)),
1360 SND_SOC_DAPM_PGA_E("PredriveL PGA", SND_SOC_NOPM,
1361 0, 0, NULL, 0, predrivelpga_event,
1362 SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
1363 SND_SOC_DAPM_MIXER("PredriveR Mixer", SND_SOC_NOPM, 0, 0,
1364 &twl4030_dapm_predriver_controls[0],
1365 ARRAY_SIZE(twl4030_dapm_predriver_controls)),
1366 SND_SOC_DAPM_PGA_E("PredriveR PGA", SND_SOC_NOPM,
1367 0, 0, NULL, 0, predriverpga_event,
1368 SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
1369 /* HeadsetL/R */
1370 SND_SOC_DAPM_MIXER("HeadsetL Mixer", SND_SOC_NOPM, 0, 0,
1371 &twl4030_dapm_hsol_controls[0],
1372 ARRAY_SIZE(twl4030_dapm_hsol_controls)),
1373 SND_SOC_DAPM_PGA_E("HeadsetL PGA", SND_SOC_NOPM,
1374 0, 0, NULL, 0, headsetlpga_event,
1375 SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
1376 SND_SOC_DAPM_MIXER("HeadsetR Mixer", SND_SOC_NOPM, 0, 0,
1377 &twl4030_dapm_hsor_controls[0],
1378 ARRAY_SIZE(twl4030_dapm_hsor_controls)),
1379 SND_SOC_DAPM_PGA_E("HeadsetR PGA", SND_SOC_NOPM,
1380 0, 0, NULL, 0, headsetrpga_event,
1381 SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
1382 /* CarkitL/R */
1383 SND_SOC_DAPM_MIXER("CarkitL Mixer", SND_SOC_NOPM, 0, 0,
1384 &twl4030_dapm_carkitl_controls[0],
1385 ARRAY_SIZE(twl4030_dapm_carkitl_controls)),
1386 SND_SOC_DAPM_PGA_E("CarkitL PGA", SND_SOC_NOPM,
1387 0, 0, NULL, 0, carkitlpga_event,
1388 SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
1389 SND_SOC_DAPM_MIXER("CarkitR Mixer", SND_SOC_NOPM, 0, 0,
1390 &twl4030_dapm_carkitr_controls[0],
1391 ARRAY_SIZE(twl4030_dapm_carkitr_controls)),
1392 SND_SOC_DAPM_PGA_E("CarkitR PGA", SND_SOC_NOPM,
1393 0, 0, NULL, 0, carkitrpga_event,
1394 SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
1395
1396 /* Output MUX controls */
1397 /* HandsfreeL/R */
1398 SND_SOC_DAPM_MUX("HandsfreeL Mux", SND_SOC_NOPM, 0, 0,
1399 &twl4030_dapm_handsfreel_control),
1400 SND_SOC_DAPM_SWITCH("HandsfreeL", SND_SOC_NOPM, 0, 0,
1401 &twl4030_dapm_handsfreelmute_control),
1402 SND_SOC_DAPM_PGA_E("HandsfreeL PGA", SND_SOC_NOPM,
1403 0, 0, NULL, 0, handsfreelpga_event,
1404 SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
1405 SND_SOC_DAPM_MUX("HandsfreeR Mux", SND_SOC_NOPM, 5, 0,
1406 &twl4030_dapm_handsfreer_control),
1407 SND_SOC_DAPM_SWITCH("HandsfreeR", SND_SOC_NOPM, 0, 0,
1408 &twl4030_dapm_handsfreermute_control),
1409 SND_SOC_DAPM_PGA_E("HandsfreeR PGA", SND_SOC_NOPM,
1410 0, 0, NULL, 0, handsfreerpga_event,
1411 SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD),
1412 /* Vibra */
1413 SND_SOC_DAPM_MUX_E("Vibra Mux", TWL4030_REG_VIBRA_CTL, 0, 0,
1414 &twl4030_dapm_vibra_control, vibramux_event,
1415 SND_SOC_DAPM_PRE_PMU),
1416 SND_SOC_DAPM_MUX("Vibra Route", SND_SOC_NOPM, 0, 0,
1417 &twl4030_dapm_vibrapath_control),
1418
1419 /* Introducing four virtual ADC, since TWL4030 have four channel for
1420 capture */
1421 SND_SOC_DAPM_ADC("ADC Virtual Left1", "Left Front Capture",
1422 SND_SOC_NOPM, 0, 0),
1423 SND_SOC_DAPM_ADC("ADC Virtual Right1", "Right Front Capture",
1424 SND_SOC_NOPM, 0, 0),
1425 SND_SOC_DAPM_ADC("ADC Virtual Left2", "Left Rear Capture",
1426 SND_SOC_NOPM, 0, 0),
1427 SND_SOC_DAPM_ADC("ADC Virtual Right2", "Right Rear Capture",
1428 SND_SOC_NOPM, 0, 0),
1429
1430 /* Analog/Digital mic path selection.
1431 TX1 Left/Right: either analog Left/Right or Digimic0
1432 TX2 Left/Right: either analog Left/Right or Digimic1 */
1433 SND_SOC_DAPM_MUX_E("TX1 Capture Route", SND_SOC_NOPM, 0, 0,
1434 &twl4030_dapm_micpathtx1_control, micpath_event,
1435 SND_SOC_DAPM_POST_REG),
1436 SND_SOC_DAPM_MUX_E("TX2 Capture Route", SND_SOC_NOPM, 0, 0,
1437 &twl4030_dapm_micpathtx2_control, micpath_event,
1438 SND_SOC_DAPM_POST_REG),
1439
1440 /* Analog input mixers for the capture amplifiers */
1441 SND_SOC_DAPM_MIXER("Analog Left",
1442 TWL4030_REG_ANAMICL, 4, 0,
1443 &twl4030_dapm_analoglmic_controls[0],
1444 ARRAY_SIZE(twl4030_dapm_analoglmic_controls)),
1445 SND_SOC_DAPM_MIXER("Analog Right",
1446 TWL4030_REG_ANAMICR, 4, 0,
1447 &twl4030_dapm_analogrmic_controls[0],
1448 ARRAY_SIZE(twl4030_dapm_analogrmic_controls)),
1449
1450 SND_SOC_DAPM_PGA("ADC Physical Left",
1451 TWL4030_REG_AVADC_CTL, 3, 0, NULL, 0),
1452 SND_SOC_DAPM_PGA("ADC Physical Right",
1453 TWL4030_REG_AVADC_CTL, 1, 0, NULL, 0),
1454
1455 SND_SOC_DAPM_PGA_E("Digimic0 Enable",
1456 TWL4030_REG_ADCMICSEL, 1, 0, NULL, 0,
1457 digimic_event, SND_SOC_DAPM_POST_PMU),
1458 SND_SOC_DAPM_PGA_E("Digimic1 Enable",
1459 TWL4030_REG_ADCMICSEL, 3, 0, NULL, 0,
1460 digimic_event, SND_SOC_DAPM_POST_PMU),
1461
1462 SND_SOC_DAPM_MICBIAS("Mic Bias 1", TWL4030_REG_MICBIAS_CTL, 0, 0),
1463 SND_SOC_DAPM_MICBIAS("Mic Bias 2", TWL4030_REG_MICBIAS_CTL, 1, 0),
1464 SND_SOC_DAPM_MICBIAS("Headset Mic Bias", TWL4030_REG_MICBIAS_CTL, 2, 0),
1465
1466 };
1467
1468 static const struct snd_soc_dapm_route intercon[] = {
1469 {"Digital L1 Playback Mixer", NULL, "DAC Left1"},
1470 {"Digital R1 Playback Mixer", NULL, "DAC Right1"},
1471 {"Digital L2 Playback Mixer", NULL, "DAC Left2"},
1472 {"Digital R2 Playback Mixer", NULL, "DAC Right2"},
1473 {"Digital Voice Playback Mixer", NULL, "DAC Voice"},
1474
1475 /* Supply for the digital part (APLL) */
1476 {"Digital Voice Playback Mixer", NULL, "APLL Enable"},
1477
1478 {"DAC Left1", NULL, "AIF Enable"},
1479 {"DAC Right1", NULL, "AIF Enable"},
1480 {"DAC Left2", NULL, "AIF Enable"},
1481 {"DAC Right1", NULL, "AIF Enable"},
1482
1483 {"Digital R2 Playback Mixer", NULL, "AIF Enable"},
1484 {"Digital L2 Playback Mixer", NULL, "AIF Enable"},
1485
1486 {"Analog L1 Playback Mixer", NULL, "Digital L1 Playback Mixer"},
1487 {"Analog R1 Playback Mixer", NULL, "Digital R1 Playback Mixer"},
1488 {"Analog L2 Playback Mixer", NULL, "Digital L2 Playback Mixer"},
1489 {"Analog R2 Playback Mixer", NULL, "Digital R2 Playback Mixer"},
1490 {"Analog Voice Playback Mixer", NULL, "Digital Voice Playback Mixer"},
1491
1492 /* Internal playback routings */
1493 /* Earpiece */
1494 {"Earpiece Mixer", "Voice", "Analog Voice Playback Mixer"},
1495 {"Earpiece Mixer", "AudioL1", "Analog L1 Playback Mixer"},
1496 {"Earpiece Mixer", "AudioL2", "Analog L2 Playback Mixer"},
1497 {"Earpiece Mixer", "AudioR1", "Analog R1 Playback Mixer"},
1498 {"Earpiece PGA", NULL, "Earpiece Mixer"},
1499 /* PreDrivL */
1500 {"PredriveL Mixer", "Voice", "Analog Voice Playback Mixer"},
1501 {"PredriveL Mixer", "AudioL1", "Analog L1 Playback Mixer"},
1502 {"PredriveL Mixer", "AudioL2", "Analog L2 Playback Mixer"},
1503 {"PredriveL Mixer", "AudioR2", "Analog R2 Playback Mixer"},
1504 {"PredriveL PGA", NULL, "PredriveL Mixer"},
1505 /* PreDrivR */
1506 {"PredriveR Mixer", "Voice", "Analog Voice Playback Mixer"},
1507 {"PredriveR Mixer", "AudioR1", "Analog R1 Playback Mixer"},
1508 {"PredriveR Mixer", "AudioR2", "Analog R2 Playback Mixer"},
1509 {"PredriveR Mixer", "AudioL2", "Analog L2 Playback Mixer"},
1510 {"PredriveR PGA", NULL, "PredriveR Mixer"},
1511 /* HeadsetL */
1512 {"HeadsetL Mixer", "Voice", "Analog Voice Playback Mixer"},
1513 {"HeadsetL Mixer", "AudioL1", "Analog L1 Playback Mixer"},
1514 {"HeadsetL Mixer", "AudioL2", "Analog L2 Playback Mixer"},
1515 {"HeadsetL PGA", NULL, "HeadsetL Mixer"},
1516 /* HeadsetR */
1517 {"HeadsetR Mixer", "Voice", "Analog Voice Playback Mixer"},
1518 {"HeadsetR Mixer", "AudioR1", "Analog R1 Playback Mixer"},
1519 {"HeadsetR Mixer", "AudioR2", "Analog R2 Playback Mixer"},
1520 {"HeadsetR PGA", NULL, "HeadsetR Mixer"},
1521 /* CarkitL */
1522 {"CarkitL Mixer", "Voice", "Analog Voice Playback Mixer"},
1523 {"CarkitL Mixer", "AudioL1", "Analog L1 Playback Mixer"},
1524 {"CarkitL Mixer", "AudioL2", "Analog L2 Playback Mixer"},
1525 {"CarkitL PGA", NULL, "CarkitL Mixer"},
1526 /* CarkitR */
1527 {"CarkitR Mixer", "Voice", "Analog Voice Playback Mixer"},
1528 {"CarkitR Mixer", "AudioR1", "Analog R1 Playback Mixer"},
1529 {"CarkitR Mixer", "AudioR2", "Analog R2 Playback Mixer"},
1530 {"CarkitR PGA", NULL, "CarkitR Mixer"},
1531 /* HandsfreeL */
1532 {"HandsfreeL Mux", "Voice", "Analog Voice Playback Mixer"},
1533 {"HandsfreeL Mux", "AudioL1", "Analog L1 Playback Mixer"},
1534 {"HandsfreeL Mux", "AudioL2", "Analog L2 Playback Mixer"},
1535 {"HandsfreeL Mux", "AudioR2", "Analog R2 Playback Mixer"},
1536 {"HandsfreeL", "Switch", "HandsfreeL Mux"},
1537 {"HandsfreeL PGA", NULL, "HandsfreeL"},
1538 /* HandsfreeR */
1539 {"HandsfreeR Mux", "Voice", "Analog Voice Playback Mixer"},
1540 {"HandsfreeR Mux", "AudioR1", "Analog R1 Playback Mixer"},
1541 {"HandsfreeR Mux", "AudioR2", "Analog R2 Playback Mixer"},
1542 {"HandsfreeR Mux", "AudioL2", "Analog L2 Playback Mixer"},
1543 {"HandsfreeR", "Switch", "HandsfreeR Mux"},
1544 {"HandsfreeR PGA", NULL, "HandsfreeR"},
1545 /* Vibra */
1546 {"Vibra Mux", "AudioL1", "DAC Left1"},
1547 {"Vibra Mux", "AudioR1", "DAC Right1"},
1548 {"Vibra Mux", "AudioL2", "DAC Left2"},
1549 {"Vibra Mux", "AudioR2", "DAC Right2"},
1550
1551 /* outputs */
1552 /* Must be always connected (for AIF and APLL) */
1553 {"Virtual HiFi OUT", NULL, "DAC Left1"},
1554 {"Virtual HiFi OUT", NULL, "DAC Right1"},
1555 {"Virtual HiFi OUT", NULL, "DAC Left2"},
1556 {"Virtual HiFi OUT", NULL, "DAC Right2"},
1557 /* Must be always connected (for APLL) */
1558 {"Virtual Voice OUT", NULL, "Digital Voice Playback Mixer"},
1559 /* Physical outputs */
1560 {"EARPIECE", NULL, "Earpiece PGA"},
1561 {"PREDRIVEL", NULL, "PredriveL PGA"},
1562 {"PREDRIVER", NULL, "PredriveR PGA"},
1563 {"HSOL", NULL, "HeadsetL PGA"},
1564 {"HSOR", NULL, "HeadsetR PGA"},
1565 {"CARKITL", NULL, "CarkitL PGA"},
1566 {"CARKITR", NULL, "CarkitR PGA"},
1567 {"HFL", NULL, "HandsfreeL PGA"},
1568 {"HFR", NULL, "HandsfreeR PGA"},
1569 {"Vibra Route", "Audio", "Vibra Mux"},
1570 {"VIBRA", NULL, "Vibra Route"},
1571
1572 /* Capture path */
1573 /* Must be always connected (for AIF and APLL) */
1574 {"ADC Virtual Left1", NULL, "Virtual HiFi IN"},
1575 {"ADC Virtual Right1", NULL, "Virtual HiFi IN"},
1576 {"ADC Virtual Left2", NULL, "Virtual HiFi IN"},
1577 {"ADC Virtual Right2", NULL, "Virtual HiFi IN"},
1578 /* Physical inputs */
1579 {"Analog Left", "Main Mic Capture Switch", "MAINMIC"},
1580 {"Analog Left", "Headset Mic Capture Switch", "HSMIC"},
1581 {"Analog Left", "AUXL Capture Switch", "AUXL"},
1582 {"Analog Left", "Carkit Mic Capture Switch", "CARKITMIC"},
1583
1584 {"Analog Right", "Sub Mic Capture Switch", "SUBMIC"},
1585 {"Analog Right", "AUXR Capture Switch", "AUXR"},
1586
1587 {"ADC Physical Left", NULL, "Analog Left"},
1588 {"ADC Physical Right", NULL, "Analog Right"},
1589
1590 {"Digimic0 Enable", NULL, "DIGIMIC0"},
1591 {"Digimic1 Enable", NULL, "DIGIMIC1"},
1592
1593 /* TX1 Left capture path */
1594 {"TX1 Capture Route", "Analog", "ADC Physical Left"},
1595 {"TX1 Capture Route", "Digimic0", "Digimic0 Enable"},
1596 /* TX1 Right capture path */
1597 {"TX1 Capture Route", "Analog", "ADC Physical Right"},
1598 {"TX1 Capture Route", "Digimic0", "Digimic0 Enable"},
1599 /* TX2 Left capture path */
1600 {"TX2 Capture Route", "Analog", "ADC Physical Left"},
1601 {"TX2 Capture Route", "Digimic1", "Digimic1 Enable"},
1602 /* TX2 Right capture path */
1603 {"TX2 Capture Route", "Analog", "ADC Physical Right"},
1604 {"TX2 Capture Route", "Digimic1", "Digimic1 Enable"},
1605
1606 {"ADC Virtual Left1", NULL, "TX1 Capture Route"},
1607 {"ADC Virtual Right1", NULL, "TX1 Capture Route"},
1608 {"ADC Virtual Left2", NULL, "TX2 Capture Route"},
1609 {"ADC Virtual Right2", NULL, "TX2 Capture Route"},
1610
1611 {"ADC Virtual Left1", NULL, "AIF Enable"},
1612 {"ADC Virtual Right1", NULL, "AIF Enable"},
1613 {"ADC Virtual Left2", NULL, "AIF Enable"},
1614 {"ADC Virtual Right2", NULL, "AIF Enable"},
1615
1616 /* Analog bypass routes */
1617 {"Right1 Analog Loopback", "Switch", "Analog Right"},
1618 {"Left1 Analog Loopback", "Switch", "Analog Left"},
1619 {"Right2 Analog Loopback", "Switch", "Analog Right"},
1620 {"Left2 Analog Loopback", "Switch", "Analog Left"},
1621 {"Voice Analog Loopback", "Switch", "Analog Left"},
1622
1623 /* Supply for the Analog loopbacks */
1624 {"Right1 Analog Loopback", NULL, "FM Loop Enable"},
1625 {"Left1 Analog Loopback", NULL, "FM Loop Enable"},
1626 {"Right2 Analog Loopback", NULL, "FM Loop Enable"},
1627 {"Left2 Analog Loopback", NULL, "FM Loop Enable"},
1628 {"Voice Analog Loopback", NULL, "FM Loop Enable"},
1629
1630 {"Analog R1 Playback Mixer", NULL, "Right1 Analog Loopback"},
1631 {"Analog L1 Playback Mixer", NULL, "Left1 Analog Loopback"},
1632 {"Analog R2 Playback Mixer", NULL, "Right2 Analog Loopback"},
1633 {"Analog L2 Playback Mixer", NULL, "Left2 Analog Loopback"},
1634 {"Analog Voice Playback Mixer", NULL, "Voice Analog Loopback"},
1635
1636 /* Digital bypass routes */
1637 {"Right Digital Loopback", "Volume", "TX1 Capture Route"},
1638 {"Left Digital Loopback", "Volume", "TX1 Capture Route"},
1639 {"Voice Digital Loopback", "Volume", "TX2 Capture Route"},
1640
1641 {"Digital R2 Playback Mixer", NULL, "Right Digital Loopback"},
1642 {"Digital L2 Playback Mixer", NULL, "Left Digital Loopback"},
1643 {"Digital Voice Playback Mixer", NULL, "Voice Digital Loopback"},
1644
1645 };
1646
1647 static int twl4030_add_widgets(struct snd_soc_codec *codec)
1648 {
1649 snd_soc_dapm_new_controls(codec, twl4030_dapm_widgets,
1650 ARRAY_SIZE(twl4030_dapm_widgets));
1651
1652 snd_soc_dapm_add_routes(codec, intercon, ARRAY_SIZE(intercon));
1653
1654 return 0;
1655 }
1656
1657 static int twl4030_set_bias_level(struct snd_soc_codec *codec,
1658 enum snd_soc_bias_level level)
1659 {
1660 switch (level) {
1661 case SND_SOC_BIAS_ON:
1662 break;
1663 case SND_SOC_BIAS_PREPARE:
1664 break;
1665 case SND_SOC_BIAS_STANDBY:
1666 if (codec->bias_level == SND_SOC_BIAS_OFF)
1667 twl4030_codec_enable(codec, 1);
1668 break;
1669 case SND_SOC_BIAS_OFF:
1670 twl4030_codec_enable(codec, 0);
1671 break;
1672 }
1673 codec->bias_level = level;
1674
1675 return 0;
1676 }
1677
1678 static void twl4030_constraints(struct twl4030_priv *twl4030,
1679 struct snd_pcm_substream *mst_substream)
1680 {
1681 struct snd_pcm_substream *slv_substream;
1682
1683 /* Pick the stream, which need to be constrained */
1684 if (mst_substream == twl4030->master_substream)
1685 slv_substream = twl4030->slave_substream;
1686 else if (mst_substream == twl4030->slave_substream)
1687 slv_substream = twl4030->master_substream;
1688 else /* This should not happen.. */
1689 return;
1690
1691 /* Set the constraints according to the already configured stream */
1692 snd_pcm_hw_constraint_minmax(slv_substream->runtime,
1693 SNDRV_PCM_HW_PARAM_RATE,
1694 twl4030->rate,
1695 twl4030->rate);
1696
1697 snd_pcm_hw_constraint_minmax(slv_substream->runtime,
1698 SNDRV_PCM_HW_PARAM_SAMPLE_BITS,
1699 twl4030->sample_bits,
1700 twl4030->sample_bits);
1701
1702 snd_pcm_hw_constraint_minmax(slv_substream->runtime,
1703 SNDRV_PCM_HW_PARAM_CHANNELS,
1704 twl4030->channels,
1705 twl4030->channels);
1706 }
1707
1708 /* In case of 4 channel mode, the RX1 L/R for playback and the TX2 L/R for
1709 * capture has to be enabled/disabled. */
1710 static void twl4030_tdm_enable(struct snd_soc_codec *codec, int direction,
1711 int enable)
1712 {
1713 u8 reg, mask;
1714
1715 reg = twl4030_read_reg_cache(codec, TWL4030_REG_OPTION);
1716
1717 if (direction == SNDRV_PCM_STREAM_PLAYBACK)
1718 mask = TWL4030_ARXL1_VRX_EN | TWL4030_ARXR1_EN;
1719 else
1720 mask = TWL4030_ATXL2_VTXL_EN | TWL4030_ATXR2_VTXR_EN;
1721
1722 if (enable)
1723 reg |= mask;
1724 else
1725 reg &= ~mask;
1726
1727 twl4030_write(codec, TWL4030_REG_OPTION, reg);
1728 }
1729
1730 static int twl4030_startup(struct snd_pcm_substream *substream,
1731 struct snd_soc_dai *dai)
1732 {
1733 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1734 struct snd_soc_device *socdev = rtd->socdev;
1735 struct snd_soc_codec *codec = socdev->card->codec;
1736 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
1737
1738 if (twl4030->master_substream) {
1739 twl4030->slave_substream = substream;
1740 /* The DAI has one configuration for playback and capture, so
1741 * if the DAI has been already configured then constrain this
1742 * substream to match it. */
1743 if (twl4030->configured)
1744 twl4030_constraints(twl4030, twl4030->master_substream);
1745 } else {
1746 if (!(twl4030_read_reg_cache(codec, TWL4030_REG_CODEC_MODE) &
1747 TWL4030_OPTION_1)) {
1748 /* In option2 4 channel is not supported, set the
1749 * constraint for the first stream for channels, the
1750 * second stream will 'inherit' this cosntraint */
1751 snd_pcm_hw_constraint_minmax(substream->runtime,
1752 SNDRV_PCM_HW_PARAM_CHANNELS,
1753 2, 2);
1754 }
1755 twl4030->master_substream = substream;
1756 }
1757
1758 return 0;
1759 }
1760
1761 static void twl4030_shutdown(struct snd_pcm_substream *substream,
1762 struct snd_soc_dai *dai)
1763 {
1764 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1765 struct snd_soc_device *socdev = rtd->socdev;
1766 struct snd_soc_codec *codec = socdev->card->codec;
1767 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
1768
1769 if (twl4030->master_substream == substream)
1770 twl4030->master_substream = twl4030->slave_substream;
1771
1772 twl4030->slave_substream = NULL;
1773
1774 /* If all streams are closed, or the remaining stream has not yet
1775 * been configured than set the DAI as not configured. */
1776 if (!twl4030->master_substream)
1777 twl4030->configured = 0;
1778 else if (!twl4030->master_substream->runtime->channels)
1779 twl4030->configured = 0;
1780
1781 /* If the closing substream had 4 channel, do the necessary cleanup */
1782 if (substream->runtime->channels == 4)
1783 twl4030_tdm_enable(codec, substream->stream, 0);
1784 }
1785
1786 static int twl4030_hw_params(struct snd_pcm_substream *substream,
1787 struct snd_pcm_hw_params *params,
1788 struct snd_soc_dai *dai)
1789 {
1790 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1791 struct snd_soc_device *socdev = rtd->socdev;
1792 struct snd_soc_codec *codec = socdev->card->codec;
1793 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
1794 u8 mode, old_mode, format, old_format;
1795
1796 /* If the substream has 4 channel, do the necessary setup */
1797 if (params_channels(params) == 4) {
1798 format = twl4030_read_reg_cache(codec, TWL4030_REG_AUDIO_IF);
1799 mode = twl4030_read_reg_cache(codec, TWL4030_REG_CODEC_MODE);
1800
1801 /* Safety check: are we in the correct operating mode and
1802 * the interface is in TDM mode? */
1803 if ((mode & TWL4030_OPTION_1) &&
1804 ((format & TWL4030_AIF_FORMAT) == TWL4030_AIF_FORMAT_TDM))
1805 twl4030_tdm_enable(codec, substream->stream, 1);
1806 else
1807 return -EINVAL;
1808 }
1809
1810 if (twl4030->configured)
1811 /* Ignoring hw_params for already configured DAI */
1812 return 0;
1813
1814 /* bit rate */
1815 old_mode = twl4030_read_reg_cache(codec,
1816 TWL4030_REG_CODEC_MODE) & ~TWL4030_CODECPDZ;
1817 mode = old_mode & ~TWL4030_APLL_RATE;
1818
1819 switch (params_rate(params)) {
1820 case 8000:
1821 mode |= TWL4030_APLL_RATE_8000;
1822 break;
1823 case 11025:
1824 mode |= TWL4030_APLL_RATE_11025;
1825 break;
1826 case 12000:
1827 mode |= TWL4030_APLL_RATE_12000;
1828 break;
1829 case 16000:
1830 mode |= TWL4030_APLL_RATE_16000;
1831 break;
1832 case 22050:
1833 mode |= TWL4030_APLL_RATE_22050;
1834 break;
1835 case 24000:
1836 mode |= TWL4030_APLL_RATE_24000;
1837 break;
1838 case 32000:
1839 mode |= TWL4030_APLL_RATE_32000;
1840 break;
1841 case 44100:
1842 mode |= TWL4030_APLL_RATE_44100;
1843 break;
1844 case 48000:
1845 mode |= TWL4030_APLL_RATE_48000;
1846 break;
1847 case 96000:
1848 mode |= TWL4030_APLL_RATE_96000;
1849 break;
1850 default:
1851 printk(KERN_ERR "TWL4030 hw params: unknown rate %d\n",
1852 params_rate(params));
1853 return -EINVAL;
1854 }
1855
1856 /* sample size */
1857 old_format = twl4030_read_reg_cache(codec, TWL4030_REG_AUDIO_IF);
1858 format = old_format;
1859 format &= ~TWL4030_DATA_WIDTH;
1860 switch (params_format(params)) {
1861 case SNDRV_PCM_FORMAT_S16_LE:
1862 format |= TWL4030_DATA_WIDTH_16S_16W;
1863 break;
1864 case SNDRV_PCM_FORMAT_S24_LE:
1865 format |= TWL4030_DATA_WIDTH_32S_24W;
1866 break;
1867 default:
1868 printk(KERN_ERR "TWL4030 hw params: unknown format %d\n",
1869 params_format(params));
1870 return -EINVAL;
1871 }
1872
1873 if (format != old_format || mode != old_mode) {
1874 if (twl4030->codec_powered) {
1875 /*
1876 * If the codec is powered, than we need to toggle the
1877 * codec power.
1878 */
1879 twl4030_codec_enable(codec, 0);
1880 twl4030_write(codec, TWL4030_REG_CODEC_MODE, mode);
1881 twl4030_write(codec, TWL4030_REG_AUDIO_IF, format);
1882 twl4030_codec_enable(codec, 1);
1883 } else {
1884 twl4030_write(codec, TWL4030_REG_CODEC_MODE, mode);
1885 twl4030_write(codec, TWL4030_REG_AUDIO_IF, format);
1886 }
1887 }
1888
1889 /* Store the important parameters for the DAI configuration and set
1890 * the DAI as configured */
1891 twl4030->configured = 1;
1892 twl4030->rate = params_rate(params);
1893 twl4030->sample_bits = hw_param_interval(params,
1894 SNDRV_PCM_HW_PARAM_SAMPLE_BITS)->min;
1895 twl4030->channels = params_channels(params);
1896
1897 /* If both playback and capture streams are open, and one of them
1898 * is setting the hw parameters right now (since we are here), set
1899 * constraints to the other stream to match the current one. */
1900 if (twl4030->slave_substream)
1901 twl4030_constraints(twl4030, substream);
1902
1903 return 0;
1904 }
1905
1906 static int twl4030_set_dai_sysclk(struct snd_soc_dai *codec_dai,
1907 int clk_id, unsigned int freq, int dir)
1908 {
1909 struct snd_soc_codec *codec = codec_dai->codec;
1910 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
1911
1912 switch (freq) {
1913 case 19200000:
1914 case 26000000:
1915 case 38400000:
1916 break;
1917 default:
1918 dev_err(codec->dev, "Unsupported APLL mclk: %u\n", freq);
1919 return -EINVAL;
1920 }
1921
1922 if ((freq / 1000) != twl4030->sysclk) {
1923 dev_err(codec->dev,
1924 "Mismatch in APLL mclk: %u (configured: %u)\n",
1925 freq, twl4030->sysclk * 1000);
1926 return -EINVAL;
1927 }
1928
1929 return 0;
1930 }
1931
1932 static int twl4030_set_dai_fmt(struct snd_soc_dai *codec_dai,
1933 unsigned int fmt)
1934 {
1935 struct snd_soc_codec *codec = codec_dai->codec;
1936 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
1937 u8 old_format, format;
1938
1939 /* get format */
1940 old_format = twl4030_read_reg_cache(codec, TWL4030_REG_AUDIO_IF);
1941 format = old_format;
1942
1943 /* set master/slave audio interface */
1944 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1945 case SND_SOC_DAIFMT_CBM_CFM:
1946 format &= ~(TWL4030_AIF_SLAVE_EN);
1947 format &= ~(TWL4030_CLK256FS_EN);
1948 break;
1949 case SND_SOC_DAIFMT_CBS_CFS:
1950 format |= TWL4030_AIF_SLAVE_EN;
1951 format |= TWL4030_CLK256FS_EN;
1952 break;
1953 default:
1954 return -EINVAL;
1955 }
1956
1957 /* interface format */
1958 format &= ~TWL4030_AIF_FORMAT;
1959 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
1960 case SND_SOC_DAIFMT_I2S:
1961 format |= TWL4030_AIF_FORMAT_CODEC;
1962 break;
1963 case SND_SOC_DAIFMT_DSP_A:
1964 format |= TWL4030_AIF_FORMAT_TDM;
1965 break;
1966 default:
1967 return -EINVAL;
1968 }
1969
1970 if (format != old_format) {
1971 if (twl4030->codec_powered) {
1972 /*
1973 * If the codec is powered, than we need to toggle the
1974 * codec power.
1975 */
1976 twl4030_codec_enable(codec, 0);
1977 twl4030_write(codec, TWL4030_REG_AUDIO_IF, format);
1978 twl4030_codec_enable(codec, 1);
1979 } else {
1980 twl4030_write(codec, TWL4030_REG_AUDIO_IF, format);
1981 }
1982 }
1983
1984 return 0;
1985 }
1986
1987 static int twl4030_set_tristate(struct snd_soc_dai *dai, int tristate)
1988 {
1989 struct snd_soc_codec *codec = dai->codec;
1990 u8 reg = twl4030_read_reg_cache(codec, TWL4030_REG_AUDIO_IF);
1991
1992 if (tristate)
1993 reg |= TWL4030_AIF_TRI_EN;
1994 else
1995 reg &= ~TWL4030_AIF_TRI_EN;
1996
1997 return twl4030_write(codec, TWL4030_REG_AUDIO_IF, reg);
1998 }
1999
2000 /* In case of voice mode, the RX1 L(VRX) for downlink and the TX2 L/R
2001 * (VTXL, VTXR) for uplink has to be enabled/disabled. */
2002 static void twl4030_voice_enable(struct snd_soc_codec *codec, int direction,
2003 int enable)
2004 {
2005 u8 reg, mask;
2006
2007 reg = twl4030_read_reg_cache(codec, TWL4030_REG_OPTION);
2008
2009 if (direction == SNDRV_PCM_STREAM_PLAYBACK)
2010 mask = TWL4030_ARXL1_VRX_EN;
2011 else
2012 mask = TWL4030_ATXL2_VTXL_EN | TWL4030_ATXR2_VTXR_EN;
2013
2014 if (enable)
2015 reg |= mask;
2016 else
2017 reg &= ~mask;
2018
2019 twl4030_write(codec, TWL4030_REG_OPTION, reg);
2020 }
2021
2022 static int twl4030_voice_startup(struct snd_pcm_substream *substream,
2023 struct snd_soc_dai *dai)
2024 {
2025 struct snd_soc_pcm_runtime *rtd = substream->private_data;
2026 struct snd_soc_device *socdev = rtd->socdev;
2027 struct snd_soc_codec *codec = socdev->card->codec;
2028 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
2029 u8 mode;
2030
2031 /* If the system master clock is not 26MHz, the voice PCM interface is
2032 * not avilable.
2033 */
2034 if (twl4030->sysclk != 26000) {
2035 dev_err(codec->dev, "The board is configured for %u Hz, while"
2036 "the Voice interface needs 26MHz APLL mclk\n",
2037 twl4030->sysclk * 1000);
2038 return -EINVAL;
2039 }
2040
2041 /* If the codec mode is not option2, the voice PCM interface is not
2042 * avilable.
2043 */
2044 mode = twl4030_read_reg_cache(codec, TWL4030_REG_CODEC_MODE)
2045 & TWL4030_OPT_MODE;
2046
2047 if (mode != TWL4030_OPTION_2) {
2048 printk(KERN_ERR "TWL4030 voice startup: "
2049 "the codec mode is not option2\n");
2050 return -EINVAL;
2051 }
2052
2053 return 0;
2054 }
2055
2056 static void twl4030_voice_shutdown(struct snd_pcm_substream *substream,
2057 struct snd_soc_dai *dai)
2058 {
2059 struct snd_soc_pcm_runtime *rtd = substream->private_data;
2060 struct snd_soc_device *socdev = rtd->socdev;
2061 struct snd_soc_codec *codec = socdev->card->codec;
2062
2063 /* Enable voice digital filters */
2064 twl4030_voice_enable(codec, substream->stream, 0);
2065 }
2066
2067 static int twl4030_voice_hw_params(struct snd_pcm_substream *substream,
2068 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
2069 {
2070 struct snd_soc_pcm_runtime *rtd = substream->private_data;
2071 struct snd_soc_device *socdev = rtd->socdev;
2072 struct snd_soc_codec *codec = socdev->card->codec;
2073 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
2074 u8 old_mode, mode;
2075
2076 /* Enable voice digital filters */
2077 twl4030_voice_enable(codec, substream->stream, 1);
2078
2079 /* bit rate */
2080 old_mode = twl4030_read_reg_cache(codec, TWL4030_REG_CODEC_MODE)
2081 & ~(TWL4030_CODECPDZ);
2082 mode = old_mode;
2083
2084 switch (params_rate(params)) {
2085 case 8000:
2086 mode &= ~(TWL4030_SEL_16K);
2087 break;
2088 case 16000:
2089 mode |= TWL4030_SEL_16K;
2090 break;
2091 default:
2092 printk(KERN_ERR "TWL4030 voice hw params: unknown rate %d\n",
2093 params_rate(params));
2094 return -EINVAL;
2095 }
2096
2097 if (mode != old_mode) {
2098 if (twl4030->codec_powered) {
2099 /*
2100 * If the codec is powered, than we need to toggle the
2101 * codec power.
2102 */
2103 twl4030_codec_enable(codec, 0);
2104 twl4030_write(codec, TWL4030_REG_CODEC_MODE, mode);
2105 twl4030_codec_enable(codec, 1);
2106 } else {
2107 twl4030_write(codec, TWL4030_REG_CODEC_MODE, mode);
2108 }
2109 }
2110
2111 return 0;
2112 }
2113
2114 static int twl4030_voice_set_dai_sysclk(struct snd_soc_dai *codec_dai,
2115 int clk_id, unsigned int freq, int dir)
2116 {
2117 struct snd_soc_codec *codec = codec_dai->codec;
2118 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
2119
2120 if (freq != 26000000) {
2121 dev_err(codec->dev, "Unsupported APLL mclk: %u, the Voice"
2122 "interface needs 26MHz APLL mclk\n", freq);
2123 return -EINVAL;
2124 }
2125 if ((freq / 1000) != twl4030->sysclk) {
2126 dev_err(codec->dev,
2127 "Mismatch in APLL mclk: %u (configured: %u)\n",
2128 freq, twl4030->sysclk * 1000);
2129 return -EINVAL;
2130 }
2131 return 0;
2132 }
2133
2134 static int twl4030_voice_set_dai_fmt(struct snd_soc_dai *codec_dai,
2135 unsigned int fmt)
2136 {
2137 struct snd_soc_codec *codec = codec_dai->codec;
2138 struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);
2139 u8 old_format, format;
2140
2141 /* get format */
2142 old_format = twl4030_read_reg_cache(codec, TWL4030_REG_VOICE_IF);
2143 format = old_format;
2144
2145 /* set master/slave audio interface */
2146 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
2147 case SND_SOC_DAIFMT_CBM_CFM:
2148 format &= ~(TWL4030_VIF_SLAVE_EN);
2149 break;
2150 case SND_SOC_DAIFMT_CBS_CFS:
2151 format |= TWL4030_VIF_SLAVE_EN;
2152 break;
2153 default:
2154 return -EINVAL;
2155 }
2156
2157 /* clock inversion */
2158 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
2159 case SND_SOC_DAIFMT_IB_NF:
2160 format &= ~(TWL4030_VIF_FORMAT);
2161 break;
2162 case SND_SOC_DAIFMT_NB_IF:
2163 format |= TWL4030_VIF_FORMAT;
2164 break;
2165 default:
2166 return -EINVAL;
2167 }
2168
2169 if (format != old_format) {
2170 if (twl4030->codec_powered) {
2171 /*
2172 * If the codec is powered, than we need to toggle the
2173 * codec power.
2174 */
2175 twl4030_codec_enable(codec, 0);
2176 twl4030_write(codec, TWL4030_REG_VOICE_IF, format);
2177 twl4030_codec_enable(codec, 1);
2178 } else {
2179 twl4030_write(codec, TWL4030_REG_VOICE_IF, format);
2180 }
2181 }
2182
2183 return 0;
2184 }
2185
2186 static int twl4030_voice_set_tristate(struct snd_soc_dai *dai, int tristate)
2187 {
2188 struct snd_soc_codec *codec = dai->codec;
2189 u8 reg = twl4030_read_reg_cache(codec, TWL4030_REG_VOICE_IF);
2190
2191 if (tristate)
2192 reg |= TWL4030_VIF_TRI_EN;
2193 else
2194 reg &= ~TWL4030_VIF_TRI_EN;
2195
2196 return twl4030_write(codec, TWL4030_REG_VOICE_IF, reg);
2197 }
2198
2199 #define TWL4030_RATES (SNDRV_PCM_RATE_8000_48000)
2200 #define TWL4030_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FORMAT_S24_LE)
2201
2202 static struct snd_soc_dai_ops twl4030_dai_ops = {
2203 .startup = twl4030_startup,
2204 .shutdown = twl4030_shutdown,
2205 .hw_params = twl4030_hw_params,
2206 .set_sysclk = twl4030_set_dai_sysclk,
2207 .set_fmt = twl4030_set_dai_fmt,
2208 .set_tristate = twl4030_set_tristate,
2209 };
2210
2211 static struct snd_soc_dai_ops twl4030_dai_voice_ops = {
2212 .startup = twl4030_voice_startup,
2213 .shutdown = twl4030_voice_shutdown,
2214 .hw_params = twl4030_voice_hw_params,
2215 .set_sysclk = twl4030_voice_set_dai_sysclk,
2216 .set_fmt = twl4030_voice_set_dai_fmt,
2217 .set_tristate = twl4030_voice_set_tristate,
2218 };
2219
2220 struct snd_soc_dai twl4030_dai[] = {
2221 {
2222 .name = "twl4030",
2223 .playback = {
2224 .stream_name = "HiFi Playback",
2225 .channels_min = 2,
2226 .channels_max = 4,
2227 .rates = TWL4030_RATES | SNDRV_PCM_RATE_96000,
2228 .formats = TWL4030_FORMATS,},
2229 .capture = {
2230 .stream_name = "Capture",
2231 .channels_min = 2,
2232 .channels_max = 4,
2233 .rates = TWL4030_RATES,
2234 .formats = TWL4030_FORMATS,},
2235 .ops = &twl4030_dai_ops,
2236 },
2237 {
2238 .name = "twl4030 Voice",
2239 .playback = {
2240 .stream_name = "Voice Playback",
2241 .channels_min = 1,
2242 .channels_max = 1,
2243 .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000,
2244 .formats = SNDRV_PCM_FMTBIT_S16_LE,},
2245 .capture = {
2246 .stream_name = "Capture",
2247 .channels_min = 1,
2248 .channels_max = 2,
2249 .rates = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000,
2250 .formats = SNDRV_PCM_FMTBIT_S16_LE,},
2251 .ops = &twl4030_dai_voice_ops,
2252 },
2253 };
2254 EXPORT_SYMBOL_GPL(twl4030_dai);
2255
2256 static int twl4030_soc_suspend(struct platform_device *pdev, pm_message_t state)
2257 {
2258 struct snd_soc_device *socdev = platform_get_drvdata(pdev);
2259 struct snd_soc_codec *codec = socdev->card->codec;
2260
2261 twl4030_set_bias_level(codec, SND_SOC_BIAS_OFF);
2262
2263 return 0;
2264 }
2265
2266 static int twl4030_soc_resume(struct platform_device *pdev)
2267 {
2268 struct snd_soc_device *socdev = platform_get_drvdata(pdev);
2269 struct snd_soc_codec *codec = socdev->card->codec;
2270
2271 twl4030_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
2272 return 0;
2273 }
2274
2275 static struct snd_soc_codec *twl4030_codec;
2276
2277 static int twl4030_soc_probe(struct platform_device *pdev)
2278 {
2279 struct snd_soc_device *socdev = platform_get_drvdata(pdev);
2280 struct snd_soc_codec *codec;
2281 int ret;
2282
2283 BUG_ON(!twl4030_codec);
2284
2285 codec = twl4030_codec;
2286 socdev->card->codec = codec;
2287
2288 twl4030_init_chip(pdev);
2289
2290 /* register pcms */
2291 ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
2292 if (ret < 0) {
2293 dev_err(&pdev->dev, "failed to create pcms\n");
2294 return ret;
2295 }
2296
2297 snd_soc_add_controls(codec, twl4030_snd_controls,
2298 ARRAY_SIZE(twl4030_snd_controls));
2299 twl4030_add_widgets(codec);
2300
2301 return 0;
2302 }
2303
2304 static int twl4030_soc_remove(struct platform_device *pdev)
2305 {
2306 struct snd_soc_device *socdev = platform_get_drvdata(pdev);
2307 struct snd_soc_codec *codec = socdev->card->codec;
2308
2309 /* Reset registers to their chip default before leaving */
2310 twl4030_reset_registers(codec);
2311 twl4030_set_bias_level(codec, SND_SOC_BIAS_OFF);
2312 snd_soc_free_pcms(socdev);
2313 snd_soc_dapm_free(socdev);
2314
2315 return 0;
2316 }
2317
2318 static int __devinit twl4030_codec_probe(struct platform_device *pdev)
2319 {
2320 struct twl4030_codec_audio_data *pdata = pdev->dev.platform_data;
2321 struct snd_soc_codec *codec;
2322 struct twl4030_priv *twl4030;
2323 int ret;
2324
2325 if (!pdata) {
2326 dev_err(&pdev->dev, "platform_data is missing\n");
2327 return -EINVAL;
2328 }
2329
2330 twl4030 = kzalloc(sizeof(struct twl4030_priv), GFP_KERNEL);
2331 if (twl4030 == NULL) {
2332 dev_err(&pdev->dev, "Can not allocate memroy\n");
2333 return -ENOMEM;
2334 }
2335
2336 codec = &twl4030->codec;
2337 snd_soc_codec_set_drvdata(codec, twl4030);
2338 codec->dev = &pdev->dev;
2339 twl4030_dai[0].dev = &pdev->dev;
2340 twl4030_dai[1].dev = &pdev->dev;
2341
2342 mutex_init(&codec->mutex);
2343 INIT_LIST_HEAD(&codec->dapm_widgets);
2344 INIT_LIST_HEAD(&codec->dapm_paths);
2345
2346 codec->name = "twl4030";
2347 codec->owner = THIS_MODULE;
2348 codec->read = twl4030_read_reg_cache;
2349 codec->write = twl4030_write;
2350 codec->set_bias_level = twl4030_set_bias_level;
2351 codec->idle_bias_off = 1;
2352 codec->dai = twl4030_dai;
2353 codec->num_dai = ARRAY_SIZE(twl4030_dai);
2354 codec->reg_cache_size = sizeof(twl4030_reg);
2355 codec->reg_cache = kmemdup(twl4030_reg, sizeof(twl4030_reg),
2356 GFP_KERNEL);
2357 if (codec->reg_cache == NULL) {
2358 ret = -ENOMEM;
2359 goto error_cache;
2360 }
2361
2362 platform_set_drvdata(pdev, twl4030);
2363 twl4030_codec = codec;
2364
2365 /* Set the defaults, and power up the codec */
2366 twl4030->sysclk = twl4030_codec_get_mclk() / 1000;
2367 codec->bias_level = SND_SOC_BIAS_OFF;
2368
2369 ret = snd_soc_register_codec(codec);
2370 if (ret != 0) {
2371 dev_err(codec->dev, "Failed to register codec: %d\n", ret);
2372 goto error_codec;
2373 }
2374
2375 ret = snd_soc_register_dais(&twl4030_dai[0], ARRAY_SIZE(twl4030_dai));
2376 if (ret != 0) {
2377 dev_err(codec->dev, "Failed to register DAIs: %d\n", ret);
2378 snd_soc_unregister_codec(codec);
2379 goto error_codec;
2380 }
2381
2382 return 0;
2383
2384 error_codec:
2385 twl4030_codec_enable(codec, 0);
2386 kfree(codec->reg_cache);
2387 error_cache:
2388 kfree(twl4030);
2389 return ret;
2390 }
2391
2392 static int __devexit twl4030_codec_remove(struct platform_device *pdev)
2393 {
2394 struct twl4030_priv *twl4030 = platform_get_drvdata(pdev);
2395
2396 snd_soc_unregister_dais(&twl4030_dai[0], ARRAY_SIZE(twl4030_dai));
2397 snd_soc_unregister_codec(&twl4030->codec);
2398 kfree(twl4030->codec.reg_cache);
2399 kfree(twl4030);
2400
2401 twl4030_codec = NULL;
2402 return 0;
2403 }
2404
2405 MODULE_ALIAS("platform:twl4030_codec_audio");
2406
2407 static struct platform_driver twl4030_codec_driver = {
2408 .probe = twl4030_codec_probe,
2409 .remove = __devexit_p(twl4030_codec_remove),
2410 .driver = {
2411 .name = "twl4030_codec_audio",
2412 .owner = THIS_MODULE,
2413 },
2414 };
2415
2416 static int __init twl4030_modinit(void)
2417 {
2418 return platform_driver_register(&twl4030_codec_driver);
2419 }
2420 module_init(twl4030_modinit);
2421
2422 static void __exit twl4030_exit(void)
2423 {
2424 platform_driver_unregister(&twl4030_codec_driver);
2425 }
2426 module_exit(twl4030_exit);
2427
2428 struct snd_soc_codec_device soc_codec_dev_twl4030 = {
2429 .probe = twl4030_soc_probe,
2430 .remove = twl4030_soc_remove,
2431 .suspend = twl4030_soc_suspend,
2432 .resume = twl4030_soc_resume,
2433 };
2434 EXPORT_SYMBOL_GPL(soc_codec_dev_twl4030);
2435
2436 MODULE_DESCRIPTION("ASoC TWL4030 codec driver");
2437 MODULE_AUTHOR("Steve Sakoman");
2438 MODULE_LICENSE("GPL");
This page took 0.135851 seconds and 6 git commands to generate.