2 * Copyright (C) 2007 - 2009 Motorola, Inc.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20 #include <linux/kernel.h>
21 #include <linux/proc_fs.h>
22 #include <linux/smp_lock.h>
23 #include <linux/module.h>
24 #include <linux/uaccess.h>
25 #include <linux/spinlock.h>
26 #include <linux/dma-mapping.h>
27 #include <linux/delay.h>
28 #include <linux/poll.h>
29 #include <linux/spi/cpcap.h>
30 #include <linux/regulator/consumer.h>
32 #include <mach/cpcap_audio.h>
34 #define MICBIAS_WARMUP_TIME_MS 39
35 #define SLEEP_ACTIVATE_POWER_DELAY_MS 2
36 #define STM_STDAC_ACTIVATE_RAMP_TIME 1
37 #define CLOCK_TREE_RESET_DELAY_MS 1
39 #define CPCAP_AUDIO_SPI_READBACK 1
41 #define STM_STDAC_EN_TEST_PRE 0x090C
42 #define STM_STDAC_EN_TEST_POST 0x0000
43 #define STM_STDAC_EN_ST_TEST1_PRE 0x2400
44 #define STM_STDAC_EN_ST_TEST1_POST 0x0400
46 #define E(args...) pr_err("cpcap-audio: " args)
48 static struct cpcap_audio_state current_state = {
50 .mode = CPCAP_AUDIO_MODE_NORMAL,
52 .codec_mode = CPCAP_AUDIO_CODEC_OFF,
53 .codec_rate = CPCAP_AUDIO_CODEC_RATE_8000_HZ,
54 .codec_mute = CPCAP_AUDIO_CODEC_MUTE,
56 .stdac_mode = CPCAP_AUDIO_STDAC_OFF,
57 .stdac_rate = CPCAP_AUDIO_STDAC_RATE_8000_HZ,
58 .stdac_mute = CPCAP_AUDIO_STDAC_MUTE,
60 .analog_source = CPCAP_AUDIO_ANALOG_SOURCE_OFF,
62 .codec_primary_speaker = CPCAP_AUDIO_OUT_NONE,
63 .codec_secondary_speaker = CPCAP_AUDIO_OUT_NONE,
65 .stdac_primary_speaker = CPCAP_AUDIO_OUT_NONE,
66 .stdac_secondary_speaker = CPCAP_AUDIO_OUT_NONE,
68 .ext_primary_speaker = CPCAP_AUDIO_OUT_NONE,
69 .ext_secondary_speaker = CPCAP_AUDIO_OUT_NONE,
71 .codec_primary_balance = CPCAP_AUDIO_BALANCE_NEUTRAL,
72 .stdac_primary_balance = CPCAP_AUDIO_BALANCE_NEUTRAL,
73 .ext_primary_balance = CPCAP_AUDIO_BALANCE_NEUTRAL,
76 .microphone = CPCAP_AUDIO_IN_NONE,
78 .rat_type = CPCAP_AUDIO_RAT_NONE
81 /* Define regulator to turn on the audio portion of cpcap */
82 struct regulator *audio_reg;
84 static inline bool is_mic_stereo(int microphone)
86 return microphone == CPCAP_AUDIO_IN_DUAL_INTERNAL ||
87 microphone == CPCAP_AUDIO_IN_DUAL_EXTERNAL;
90 static inline bool is_codec_changed(struct cpcap_audio_state *state,
91 struct cpcap_audio_state *prev)
93 return state->codec_mode != prev->codec_mode ||
94 state->codec_rate != prev->codec_rate ||
95 state->rat_type != prev->rat_type ||
96 state->microphone != prev->microphone;
99 static inline bool is_stdac_changed(struct cpcap_audio_state *state,
100 struct cpcap_audio_state *prev)
102 return state->stdac_mode != prev->stdac_mode ||
103 state->rat_type != prev->rat_type ||
104 state->stdac_rate != prev->stdac_rate;
107 static inline bool is_output_bt_only(struct cpcap_audio_state *state)
109 if (state->codec_primary_speaker == CPCAP_AUDIO_OUT_BT_MONO &&
110 state->codec_secondary_speaker == CPCAP_AUDIO_OUT_NONE)
113 if (state->stdac_primary_speaker == CPCAP_AUDIO_OUT_BT_MONO &&
114 state->stdac_secondary_speaker == CPCAP_AUDIO_OUT_NONE)
117 if (state->ext_primary_speaker == CPCAP_AUDIO_OUT_BT_MONO &&
118 state->ext_secondary_speaker == CPCAP_AUDIO_OUT_NONE)
124 static inline bool is_output_headset(struct cpcap_audio_state *state)
126 if (state->codec_primary_speaker == CPCAP_AUDIO_OUT_STEREO_HEADSET ||
127 state->codec_primary_speaker ==
128 CPCAP_AUDIO_OUT_MONO_HEADSET ||
129 state->codec_secondary_speaker ==
130 CPCAP_AUDIO_OUT_STEREO_HEADSET ||
131 state->codec_secondary_speaker ==
132 CPCAP_AUDIO_OUT_MONO_HEADSET)
135 if (state->stdac_primary_speaker == CPCAP_AUDIO_OUT_STEREO_HEADSET ||
136 state->stdac_primary_speaker ==
137 CPCAP_AUDIO_OUT_MONO_HEADSET ||
138 state->stdac_secondary_speaker ==
139 CPCAP_AUDIO_OUT_STEREO_HEADSET ||
140 state->stdac_secondary_speaker ==
141 CPCAP_AUDIO_OUT_MONO_HEADSET)
144 if (state->ext_primary_speaker == CPCAP_AUDIO_OUT_STEREO_HEADSET ||
145 state->ext_primary_speaker ==
146 CPCAP_AUDIO_OUT_MONO_HEADSET ||
147 state->ext_secondary_speaker ==
148 CPCAP_AUDIO_OUT_STEREO_HEADSET ||
149 state->ext_secondary_speaker ==
150 CPCAP_AUDIO_OUT_MONO_HEADSET)
156 static inline int is_output_whisper_emu(struct cpcap_audio_state *state)
158 if (state->codec_primary_speaker == CPCAP_AUDIO_OUT_EMU_STEREO
159 || state->codec_secondary_speaker == CPCAP_AUDIO_OUT_EMU_STEREO
160 || state->stdac_primary_speaker == CPCAP_AUDIO_OUT_EMU_STEREO
161 || state->stdac_secondary_speaker == CPCAP_AUDIO_OUT_EMU_STEREO
162 || state->ext_primary_speaker == CPCAP_AUDIO_OUT_EMU_STEREO
163 || state->ext_secondary_speaker == CPCAP_AUDIO_OUT_EMU_STEREO) {
164 pr_debug("%s() returning TRUE\n", __func__);
168 pr_debug("%s() returning FALSE\n", __func__);
172 static inline bool is_speaker_turning_off(struct cpcap_audio_state *state,
173 struct cpcap_audio_state *prev)
175 return (prev->codec_primary_speaker != CPCAP_AUDIO_OUT_NONE &&
176 state->codec_primary_speaker ==
177 CPCAP_AUDIO_OUT_NONE) ||
178 (prev->codec_secondary_speaker != CPCAP_AUDIO_OUT_NONE &&
179 state->codec_secondary_speaker ==
180 CPCAP_AUDIO_OUT_NONE) ||
181 (prev->stdac_primary_speaker != CPCAP_AUDIO_OUT_NONE &&
182 state->stdac_primary_speaker ==
183 CPCAP_AUDIO_OUT_NONE) ||
184 (prev->stdac_secondary_speaker != CPCAP_AUDIO_OUT_NONE &&
185 state->stdac_secondary_speaker ==
186 CPCAP_AUDIO_OUT_NONE) ||
187 (prev->ext_primary_speaker != CPCAP_AUDIO_OUT_NONE &&
188 state->ext_primary_speaker ==
189 CPCAP_AUDIO_OUT_NONE) ||
190 (prev->ext_secondary_speaker != CPCAP_AUDIO_OUT_NONE &&
191 state->ext_secondary_speaker ==
192 CPCAP_AUDIO_OUT_NONE);
195 static inline bool is_output_changed(struct cpcap_audio_state *state,
196 struct cpcap_audio_state *prev)
198 if (state->codec_primary_speaker != prev->codec_primary_speaker ||
199 state->codec_primary_balance !=
200 prev->codec_primary_balance ||
201 state->codec_secondary_speaker !=
202 prev->codec_secondary_speaker)
205 if (state->stdac_primary_speaker != prev->stdac_primary_speaker ||
206 state->stdac_primary_balance !=
207 prev->stdac_primary_balance ||
208 state->stdac_secondary_speaker !=
209 prev->stdac_secondary_speaker)
212 if (state->ext_primary_speaker != prev->ext_primary_speaker ||
213 state->ext_primary_balance !=
214 prev->ext_primary_balance ||
215 state->ext_secondary_speaker !=
216 prev->ext_secondary_speaker)
222 /* this is only true for audio registers, but those are the only ones we use */
223 #define CPCAP_REG_FOR_POWERIC_REG(a) ((a) + (0x200 - CPCAP_REG_VAUDIOC))
225 static void logged_cpcap_write(struct cpcap_device *cpcap, unsigned int reg,
226 unsigned short int value, unsigned short int mask)
230 pr_debug("%s: audio: reg %u, value 0x%x,mask 0x%x\n", __func__,
231 CPCAP_REG_FOR_POWERIC_REG(reg), value, mask);
232 ret_val = cpcap_regacc_write(cpcap, reg, value, mask);
234 E("%s: w %04x m %04x -> r %u failed: %d\n", __func__,
235 value, mask, reg, ret_val);
236 #if CPCAP_AUDIO_SPI_READBACK
237 ret_val = cpcap_regacc_read(cpcap, reg, &value);
239 pr_debug("%s: audio verify: reg %u: value 0x%x\n",
241 CPCAP_REG_FOR_POWERIC_REG(reg), value);
243 E("%s: audio verify: reg %u FAILED\n", __func__,
244 CPCAP_REG_FOR_POWERIC_REG(reg));
249 static unsigned short int cpcap_audio_get_codec_output_amp_switches(
250 int speaker, int balance)
252 unsigned short int value = CPCAP_BIT_PGA_CDC_EN;
254 pr_debug("%s() called with speaker = %d\n", __func__,
258 case CPCAP_AUDIO_OUT_HANDSET:
259 value |= CPCAP_BIT_A1_EAR_CDC_SW;
262 case CPCAP_AUDIO_OUT_LOUDSPEAKER:
263 value |= CPCAP_BIT_A2_LDSP_L_CDC_SW;
266 case CPCAP_AUDIO_OUT_MONO_HEADSET:
267 case CPCAP_AUDIO_OUT_STEREO_HEADSET:
268 if (balance != CPCAP_AUDIO_BALANCE_L_ONLY)
269 value |= CPCAP_BIT_ARIGHT_HS_CDC_SW;
270 if (balance != CPCAP_AUDIO_BALANCE_R_ONLY)
271 value |= CPCAP_BIT_ALEFT_HS_CDC_SW;
274 case CPCAP_AUDIO_OUT_EMU_STEREO:
275 if (balance != CPCAP_AUDIO_BALANCE_R_ONLY)
276 value |= CPCAP_BIT_PGA_OUTR_USBDP_CDC_SW;
277 if (balance != CPCAP_AUDIO_BALANCE_L_ONLY)
278 value |= CPCAP_BIT_PGA_OUTL_USBDN_CDC_SW;
281 case CPCAP_AUDIO_OUT_LINEOUT:
282 value |= CPCAP_BIT_A4_LINEOUT_R_CDC_SW |
283 CPCAP_BIT_A4_LINEOUT_L_CDC_SW;
286 case CPCAP_AUDIO_OUT_BT_MONO:
292 pr_debug("Exiting %s() with return value = %d\n", __func__,
297 static unsigned short int cpcap_audio_get_stdac_output_amp_switches(
298 int speaker, int balance)
300 unsigned short int value = CPCAP_BIT_PGA_DAC_EN;
302 pr_debug("%s() called with speaker = %d\n", __func__,
306 case CPCAP_AUDIO_OUT_HANDSET:
307 value |= CPCAP_BIT_A1_EAR_DAC_SW;
310 case CPCAP_AUDIO_OUT_MONO_HEADSET:
311 case CPCAP_AUDIO_OUT_STEREO_HEADSET:
312 if (balance != CPCAP_AUDIO_BALANCE_R_ONLY)
313 value |= CPCAP_BIT_ALEFT_HS_DAC_SW;
314 if (balance != CPCAP_AUDIO_BALANCE_L_ONLY)
315 value |= CPCAP_BIT_ARIGHT_HS_DAC_SW;
318 case CPCAP_AUDIO_OUT_EMU_STEREO:
319 if (balance != CPCAP_AUDIO_BALANCE_R_ONLY)
320 value |= CPCAP_BIT_PGA_OUTR_USBDP_DAC_SW;
321 if (balance != CPCAP_AUDIO_BALANCE_L_ONLY)
322 value |= CPCAP_BIT_PGA_OUTL_USBDN_DAC_SW;
325 case CPCAP_AUDIO_OUT_LOUDSPEAKER:
326 value |= CPCAP_BIT_A2_LDSP_L_DAC_SW | CPCAP_BIT_MONO_DAC0 |
330 case CPCAP_AUDIO_OUT_LINEOUT:
331 value |= CPCAP_BIT_A4_LINEOUT_R_DAC_SW |
332 CPCAP_BIT_A4_LINEOUT_L_DAC_SW;
335 case CPCAP_AUDIO_OUT_BT_MONO:
341 pr_debug("Exiting %s() with return value = %d\n", __func__,
346 static unsigned short int cpcap_audio_get_ext_output_amp_switches(
347 int speaker, int balance)
349 unsigned short int value = 0;
350 pr_debug("%s() called with speaker %d\n", __func__,
353 case CPCAP_AUDIO_OUT_HANDSET:
354 value = CPCAP_BIT_A1_EAR_EXT_SW | CPCAP_BIT_PGA_EXT_R_EN;
357 case CPCAP_AUDIO_OUT_MONO_HEADSET:
358 case CPCAP_AUDIO_OUT_STEREO_HEADSET:
359 if (balance != CPCAP_AUDIO_BALANCE_L_ONLY)
360 value = CPCAP_BIT_ARIGHT_HS_EXT_SW |
361 CPCAP_BIT_PGA_EXT_R_EN;
362 if (balance != CPCAP_AUDIO_BALANCE_R_ONLY)
363 value |= CPCAP_BIT_ALEFT_HS_EXT_SW |
364 CPCAP_BIT_PGA_EXT_L_EN;
367 case CPCAP_AUDIO_OUT_EMU_STEREO:
368 if (balance != CPCAP_AUDIO_BALANCE_R_ONLY)
369 value |= CPCAP_BIT_PGA_OUTR_USBDP_EXT_SW;
370 if (balance != CPCAP_AUDIO_BALANCE_L_ONLY)
371 value |= CPCAP_BIT_PGA_OUTL_USBDN_EXT_SW;
374 case CPCAP_AUDIO_OUT_LOUDSPEAKER:
375 value = CPCAP_BIT_A2_LDSP_L_EXT_SW | CPCAP_BIT_PGA_EXT_L_EN;
378 case CPCAP_AUDIO_OUT_LINEOUT:
379 value = CPCAP_BIT_A4_LINEOUT_R_EXT_SW |
380 CPCAP_BIT_A4_LINEOUT_L_EXT_SW |
381 CPCAP_BIT_PGA_EXT_L_EN | CPCAP_BIT_PGA_EXT_R_EN;
384 case CPCAP_AUDIO_OUT_BT_MONO:
390 pr_debug("Exiting %s() with return value = %d\n", __func__,
395 static void cpcap_audio_set_output_amp_switches(struct cpcap_audio_state *state)
397 static unsigned int codec_prev_settings;
398 static unsigned int stdac_prev_settings;
399 static unsigned int ext_prev_settings;
401 struct cpcap_regacc reg_changes;
402 unsigned short int value1 = 0, value2 = 0;
404 /* First set codec output amp switches */
405 value1 = cpcap_audio_get_codec_output_amp_switches(state->
406 codec_primary_speaker, state->codec_primary_balance);
407 value2 = cpcap_audio_get_codec_output_amp_switches(state->
408 codec_secondary_speaker, state->codec_primary_balance);
410 reg_changes.mask = value1 | value2 | codec_prev_settings;
411 reg_changes.value = value1 | value2;
412 codec_prev_settings = reg_changes.value;
414 logged_cpcap_write(state->cpcap, CPCAP_REG_RXCOA, reg_changes.value,
417 /* Second Stdac switches */
418 value1 = cpcap_audio_get_stdac_output_amp_switches(state->
419 stdac_primary_speaker, state->stdac_primary_balance);
420 value2 = cpcap_audio_get_stdac_output_amp_switches(state->
421 stdac_secondary_speaker, state->stdac_primary_balance);
423 reg_changes.mask = value1 | value2 | stdac_prev_settings;
424 reg_changes.value = value1 | value2;
426 if ((state->stdac_primary_speaker == CPCAP_AUDIO_OUT_STEREO_HEADSET &&
427 state->stdac_secondary_speaker == CPCAP_AUDIO_OUT_LOUDSPEAKER)
428 || (state->stdac_primary_speaker == CPCAP_AUDIO_OUT_LOUDSPEAKER
429 && state->stdac_secondary_speaker ==
430 CPCAP_AUDIO_OUT_STEREO_HEADSET))
431 reg_changes.value &= ~(CPCAP_BIT_MONO_DAC0 |
432 CPCAP_BIT_MONO_DAC1);
434 stdac_prev_settings = reg_changes.value;
436 logged_cpcap_write(state->cpcap, CPCAP_REG_RXSDOA, reg_changes.value,
439 /* Last External source switches */
441 cpcap_audio_get_ext_output_amp_switches(state->
443 state->ext_primary_balance);
445 cpcap_audio_get_ext_output_amp_switches(state->
446 ext_secondary_speaker,
447 state->ext_primary_balance);
449 reg_changes.mask = value1 | value2 | ext_prev_settings;
450 reg_changes.value = value1 | value2;
451 ext_prev_settings = reg_changes.value;
453 logged_cpcap_write(state->cpcap, CPCAP_REG_RXEPOA,
454 reg_changes.value, reg_changes.mask);
457 static bool cpcap_audio_set_bits_for_speaker(int speaker, int balance,
458 unsigned short int *message)
460 /* Get the data required to enable each possible path */
462 case CPCAP_AUDIO_OUT_HANDSET:
463 (*message) |= CPCAP_BIT_A1_EAR_EN;
466 case CPCAP_AUDIO_OUT_MONO_HEADSET:
467 case CPCAP_AUDIO_OUT_STEREO_HEADSET:
468 if (balance != CPCAP_AUDIO_BALANCE_R_ONLY)
469 (*message) |= CPCAP_BIT_HS_L_EN;
470 if (balance != CPCAP_AUDIO_BALANCE_L_ONLY)
471 (*message) |= CPCAP_BIT_HS_R_EN;
474 case CPCAP_AUDIO_OUT_EMU_STEREO:
475 if (balance != CPCAP_AUDIO_BALANCE_R_ONLY)
476 (*message) |= CPCAP_BIT_EMU_SPKR_R_EN;
477 if (balance != CPCAP_AUDIO_BALANCE_L_ONLY)
478 (*message) |= CPCAP_BIT_EMU_SPKR_L_EN;
481 case CPCAP_AUDIO_OUT_LOUDSPEAKER:
482 (*message) |= CPCAP_BIT_A2_LDSP_L_EN;
485 case CPCAP_AUDIO_OUT_LINEOUT:
486 (*message) |= CPCAP_BIT_A4_LINEOUT_R_EN |
487 CPCAP_BIT_A4_LINEOUT_L_EN;
490 case CPCAP_AUDIO_OUT_BT_MONO:
496 return false; /* There is no external loudspeaker on this product */
499 static void cpcap_audio_configure_aud_mute(struct cpcap_audio_state *state,
500 struct cpcap_audio_state *prev)
502 struct cpcap_regacc reg_changes = { 0 };
503 unsigned short int value1 = 0, value2 = 0;
505 if (state->codec_mute != prev->codec_mute) {
506 value1 = cpcap_audio_get_codec_output_amp_switches(
507 prev->codec_primary_speaker,
508 prev->codec_primary_balance);
510 value2 = cpcap_audio_get_codec_output_amp_switches(
511 prev->codec_secondary_speaker,
512 prev->codec_primary_balance);
514 reg_changes.mask = value1 | value2 | CPCAP_BIT_CDC_SW;
516 if (state->codec_mute == CPCAP_AUDIO_CODEC_UNMUTE)
517 reg_changes.value = reg_changes.mask;
519 logged_cpcap_write(state->cpcap, CPCAP_REG_RXCOA,
520 reg_changes.value, reg_changes.mask);
523 if (state->stdac_mute != prev->stdac_mute) {
524 value1 = cpcap_audio_get_stdac_output_amp_switches(
525 prev->stdac_primary_speaker,
526 prev->stdac_primary_balance);
528 value2 = cpcap_audio_get_stdac_output_amp_switches(
529 prev->stdac_secondary_speaker,
530 prev->stdac_primary_balance);
532 reg_changes.mask = value1 | value2 | CPCAP_BIT_ST_DAC_SW;
534 if (state->stdac_mute == CPCAP_AUDIO_STDAC_UNMUTE)
535 reg_changes.value = reg_changes.mask;
537 logged_cpcap_write(state->cpcap, CPCAP_REG_RXSDOA,
538 reg_changes.value, reg_changes.mask);
542 static void cpcap_audio_configure_codec(struct cpcap_audio_state *state,
543 struct cpcap_audio_state *prev)
545 unsigned int temp_codec_rate = state->codec_rate;
546 struct cpcap_regacc cdai_changes = { 0 };
547 struct cpcap_regacc codec_changes = { 0 };
548 int codec_freq_config = 0;
550 const unsigned int CODEC_FREQ_MASK = CPCAP_BIT_CDC_CLK0
551 | CPCAP_BIT_CDC_CLK1 | CPCAP_BIT_CDC_CLK2;
552 const unsigned int CODEC_RESET_FREQ_MASK = CODEC_FREQ_MASK
553 | CPCAP_BIT_CDC_CLOCK_TREE_RESET;
555 static unsigned int prev_codec_data = 0x0, prev_cdai_data = 0x0;
557 if (!is_codec_changed(state, prev))
560 if (state->rat_type == CPCAP_AUDIO_RAT_CDMA)
561 codec_freq_config = (CPCAP_BIT_CDC_CLK0
562 | CPCAP_BIT_CDC_CLK1) ; /* 19.2Mhz */
564 codec_freq_config = CPCAP_BIT_CDC_CLK2 ; /* 26Mhz */
566 /* If a codec is already in use, reset codec to initial state */
567 if (prev->codec_mode != CPCAP_AUDIO_CODEC_OFF) {
568 codec_changes.mask = prev_codec_data
570 | CPCAP_BIT_CDC_CLOCK_TREE_RESET;
572 logged_cpcap_write(state->cpcap, CPCAP_REG_CC,
573 codec_changes.value, codec_changes.mask);
576 prev->codec_mode = CPCAP_AUDIO_CODEC_OFF;
579 temp_codec_rate &= 0x0000000F;
580 temp_codec_rate = temp_codec_rate << 9;
582 switch (state->codec_mode) {
583 case CPCAP_AUDIO_CODEC_LOOPBACK:
584 case CPCAP_AUDIO_CODEC_ON:
585 if (state->codec_primary_speaker !=
586 CPCAP_AUDIO_OUT_NONE) {
587 codec_changes.value |= CPCAP_BIT_CDC_EN_RX;
590 /* Turning on the input HPF */
591 if (state->microphone != CPCAP_AUDIO_IN_NONE)
592 codec_changes.value |= CPCAP_BIT_AUDIHPF_0 |
596 if (state->microphone != CPCAP_AUDIO_IN_NONE) {
597 codec_changes.value |= CPCAP_BIT_MIC1_CDC_EN;
598 codec_changes.value |= CPCAP_BIT_MIC2_CDC_EN;
601 if (state->microphone != CPCAP_AUDIO_IN_AUX_INTERNAL &&
602 state->microphone != CPCAP_AUDIO_IN_NONE)
603 codec_changes.value |= CPCAP_BIT_MIC1_CDC_EN |
604 CPCAP_BIT_MIC2_CDC_EN;
606 if (state->microphone == CPCAP_AUDIO_IN_AUX_INTERNAL ||
607 is_mic_stereo(state->microphone))
608 codec_changes.value |= CPCAP_BIT_MIC2_CDC_EN;
611 /* falling through intentionally */
612 case CPCAP_AUDIO_CODEC_CLOCK_ONLY:
613 codec_changes.value |=
614 (codec_freq_config | temp_codec_rate |
616 cdai_changes.value |= CPCAP_BIT_CDC_CLK_EN;
619 case CPCAP_AUDIO_CODEC_OFF:
620 cdai_changes.value |= CPCAP_BIT_SMB_CDC;
627 /* Multimedia uses CLK_IN0, incall uses CLK_IN1 */
628 if (state->rat_type != CPCAP_AUDIO_RAT_NONE)
629 cdai_changes.value |= CPCAP_BIT_CLK_IN_SEL;
631 cdai_changes.value |= CPCAP_BIT_CDC_PLL_SEL;
633 cdai_changes.value |= CPCAP_BIT_DIG_AUD_IN;
636 #ifdef CODEC_IS_I2S_MODE
637 cdai_changes.value |= CPCAP_BIT_CLK_INV;
638 /* Setting I2S mode */
639 cdai_changes.value |= CPCAP_BIT_CDC_DIG_AUD_FS0 |
640 CPCAP_BIT_CDC_DIG_AUD_FS1 |
641 CPCAP_BIT_MIC2_TIMESLOT0;
643 /* Setting CODEC mode */
646 * TS2/TS1/TS0 not set, using timeslot 0 for mic1.
648 cdai_changes.value |= CPCAP_BIT_CDC_DIG_AUD_FS0;
651 /* OK, now start paranoid codec sequence */
652 /* FIRST, make sure the frequency config is right... */
653 logged_cpcap_write(state->cpcap, CPCAP_REG_CC,
654 codec_freq_config, CODEC_FREQ_MASK);
656 /* Next, write the CDAI if it's changed */
657 if (prev_cdai_data != cdai_changes.value) {
658 cdai_changes.mask = cdai_changes.value
660 prev_cdai_data = cdai_changes.value;
662 logged_cpcap_write(state->cpcap, CPCAP_REG_CDI,
663 cdai_changes.value, cdai_changes.mask);
665 /* Clock tree change -- reset and wait */
666 codec_freq_config |= CPCAP_BIT_CDC_CLOCK_TREE_RESET;
668 logged_cpcap_write(state->cpcap, CPCAP_REG_CC,
669 codec_freq_config, CODEC_RESET_FREQ_MASK);
671 /* Wait for clock tree reset to complete */
672 mdelay(CLOCK_TREE_RESET_DELAY_MS);
675 /* Clear old settings */
676 codec_changes.mask = codec_changes.value | prev_codec_data;
677 prev_codec_data = codec_changes.value;
679 logged_cpcap_write(state->cpcap, CPCAP_REG_CC,
680 codec_changes.value, codec_changes.mask);
683 static void cpcap_audio_configure_stdac(struct cpcap_audio_state *state,
684 struct cpcap_audio_state *prev)
686 const unsigned int SDAC_FREQ_MASK = CPCAP_BIT_ST_DAC_CLK0
687 | CPCAP_BIT_ST_DAC_CLK1 | CPCAP_BIT_ST_DAC_CLK2;
688 const unsigned int SDAC_RESET_FREQ_MASK = SDAC_FREQ_MASK
689 | CPCAP_BIT_ST_CLOCK_TREE_RESET;
690 static unsigned int prev_stdac_data, prev_sdai_data;
692 if (is_stdac_changed(state, prev)) {
693 unsigned int temp_stdac_rate = state->stdac_rate;
694 struct cpcap_regacc sdai_changes = { 0 };
695 struct cpcap_regacc stdac_changes = { 0 };
697 int stdac_freq_config = 0;
698 if (state->rat_type == CPCAP_AUDIO_RAT_CDMA)
699 stdac_freq_config = (CPCAP_BIT_ST_DAC_CLK0
700 | CPCAP_BIT_ST_DAC_CLK1) ; /*19.2Mhz*/
702 stdac_freq_config = CPCAP_BIT_ST_DAC_CLK2 ; /* 26Mhz */
704 /* We need to turn off stdac before changing its settings */
705 if (prev->stdac_mode != CPCAP_AUDIO_STDAC_OFF) {
706 stdac_changes.mask = prev_stdac_data |
707 CPCAP_BIT_DF_RESET_ST_DAC |
708 CPCAP_BIT_ST_CLOCK_TREE_RESET;
710 logged_cpcap_write(state->cpcap, CPCAP_REG_SDAC,
711 stdac_changes.value, stdac_changes.mask);
714 prev->stdac_mode = CPCAP_AUDIO_STDAC_OFF;
717 temp_stdac_rate &= 0x0000000F;
718 temp_stdac_rate = temp_stdac_rate << 4;
720 switch (state->stdac_mode) {
721 case CPCAP_AUDIO_STDAC_ON:
722 stdac_changes.value |= CPCAP_BIT_ST_DAC_EN;
723 /* falling through intentionally */
724 case CPCAP_AUDIO_STDAC_CLOCK_ONLY:
725 stdac_changes.value |= temp_stdac_rate |
726 CPCAP_BIT_DF_RESET_ST_DAC | stdac_freq_config;
727 sdai_changes.value |= CPCAP_BIT_ST_CLK_EN;
730 case CPCAP_AUDIO_STDAC_OFF:
735 if (state->rat_type != CPCAP_AUDIO_RAT_NONE)
736 sdai_changes.value |= CPCAP_BIT_ST_DAC_CLK_IN_SEL;
737 /* begin everest change */
739 sdai_changes.value |= CPCAP_BIT_ST_DIG_AUD_FS0 |
740 CPCAP_BIT_DIG_AUD_IN_ST_DAC | CPCAP_BIT_ST_L_TIMESLOT0;
742 /* I2S Mode, ignore timeslots, invert bit clock */
743 sdai_changes.value |= CPCAP_BIT_ST_DIG_AUD_FS0 |
744 CPCAP_BIT_DIG_AUD_IN_ST_DAC |
745 CPCAP_BIT_ST_DIG_AUD_FS1 | CPCAP_BIT_ST_CLK_INV;
746 /* end everest change */
748 logged_cpcap_write(state->cpcap, CPCAP_REG_SDAC,
749 stdac_freq_config, SDAC_FREQ_MASK);
751 /* Next, write the SDACDI if it's changed */
752 if (prev_sdai_data != sdai_changes.value) {
753 sdai_changes.mask = sdai_changes.value
755 prev_sdai_data = sdai_changes.value;
757 logged_cpcap_write(state->cpcap, CPCAP_REG_SDACDI,
758 sdai_changes.value, sdai_changes.mask);
760 /* Clock tree change -- reset and wait */
761 stdac_freq_config |= CPCAP_BIT_ST_CLOCK_TREE_RESET;
763 logged_cpcap_write(state->cpcap, CPCAP_REG_SDAC,
764 stdac_freq_config, SDAC_RESET_FREQ_MASK);
766 /* Wait for clock tree reset to complete */
767 mdelay(CLOCK_TREE_RESET_DELAY_MS);
770 /* Clear old settings */
771 stdac_changes.mask = stdac_changes.value | prev_stdac_data;
772 prev_stdac_data = stdac_changes.value;
774 if ((stdac_changes.value | CPCAP_BIT_ST_DAC_EN) &&
775 (state->cpcap->vendor == CPCAP_VENDOR_ST)) {
776 logged_cpcap_write(state->cpcap, CPCAP_REG_TEST,
777 STM_STDAC_EN_TEST_PRE, 0xFFFF);
778 logged_cpcap_write(state->cpcap, CPCAP_REG_ST_TEST1,
779 STM_STDAC_EN_ST_TEST1_PRE, 0xFFFF);
782 logged_cpcap_write(state->cpcap, CPCAP_REG_SDAC,
783 stdac_changes.value, stdac_changes.mask);
785 if ((stdac_changes.value | CPCAP_BIT_ST_DAC_EN) &&
786 (state->cpcap->vendor == CPCAP_VENDOR_ST)) {
787 msleep(STM_STDAC_ACTIVATE_RAMP_TIME);
788 logged_cpcap_write(state->cpcap, CPCAP_REG_ST_TEST1,
789 STM_STDAC_EN_ST_TEST1_POST, 0xFFFF);
790 logged_cpcap_write(state->cpcap, CPCAP_REG_TEST,
791 STM_STDAC_EN_TEST_POST, 0xFFFF);
796 static void cpcap_audio_configure_analog_source(
797 struct cpcap_audio_state *state,
798 struct cpcap_audio_state *prev)
800 if (state->analog_source != prev->analog_source) {
801 struct cpcap_regacc ext_changes = { 0 };
802 static unsigned int prev_ext_data;
803 switch (state->analog_source) {
804 case CPCAP_AUDIO_ANALOG_SOURCE_STEREO:
805 ext_changes.value |= CPCAP_BIT_MONO_EXT0 |
806 CPCAP_BIT_PGA_IN_R_SW | CPCAP_BIT_PGA_IN_L_SW;
808 case CPCAP_AUDIO_ANALOG_SOURCE_L:
809 ext_changes.value |= CPCAP_BIT_MONO_EXT1 |
810 CPCAP_BIT_PGA_IN_L_SW;
812 case CPCAP_AUDIO_ANALOG_SOURCE_R:
813 ext_changes.value |= CPCAP_BIT_MONO_EXT1 |
814 CPCAP_BIT_PGA_IN_R_SW;
820 ext_changes.mask = ext_changes.value | prev_ext_data;
822 prev_ext_data = ext_changes.value;
824 logged_cpcap_write(state->cpcap, CPCAP_REG_RXEPOA,
825 ext_changes.value, ext_changes.mask);
829 static void cpcap_audio_configure_input_gains(
830 struct cpcap_audio_state *state,
831 struct cpcap_audio_state *prev)
833 if (state->input_gain != prev->input_gain) {
834 struct cpcap_regacc reg_changes = { 0 };
835 unsigned int temp_input_gain = state->input_gain & 0x0000001F;
837 reg_changes.value |= ((temp_input_gain << 5) | temp_input_gain);
839 reg_changes.mask = 0x3FF;
841 logged_cpcap_write(state->cpcap, CPCAP_REG_TXMP,
842 reg_changes.value, reg_changes.mask);
846 static void cpcap_audio_configure_output_gains(
847 struct cpcap_audio_state *state,
848 struct cpcap_audio_state *prev)
850 if (state->output_gain != prev->output_gain) {
851 struct cpcap_regacc reg_changes = { 0 };
852 unsigned int temp_output_gain = state->output_gain & 0x0000000F;
855 ((temp_output_gain << 2) | (temp_output_gain << 8));
856 /* VOL_EXTx is disabled, it's not connected, disable to reduce
857 * noise. If you need it, add | (temp_output_gain << 12)
859 reg_changes.mask = 0xFF3C;
861 logged_cpcap_write(state->cpcap, CPCAP_REG_RXVC,
862 reg_changes.value, reg_changes.mask);
866 static void cpcap_audio_configure_output(
867 struct cpcap_audio_state *state,
868 struct cpcap_audio_state *prev)
870 static unsigned int prev_aud_out_data;
872 bool activate_ext_loudspeaker = false;
873 struct cpcap_regacc reg_changes = { 0 };
875 if (!is_output_changed(prev, state) &&
876 !is_codec_changed(prev, state) &&
877 !is_stdac_changed(prev, state))
880 cpcap_audio_set_output_amp_switches(state);
882 activate_ext_loudspeaker = cpcap_audio_set_bits_for_speaker(
883 state->codec_primary_speaker,
884 state->codec_primary_balance,
885 &(reg_changes.value));
887 activate_ext_loudspeaker = activate_ext_loudspeaker ||
888 cpcap_audio_set_bits_for_speaker(
889 state->codec_secondary_speaker,
890 CPCAP_AUDIO_BALANCE_NEUTRAL,
891 &(reg_changes.value));
893 activate_ext_loudspeaker = activate_ext_loudspeaker ||
894 cpcap_audio_set_bits_for_speaker(
895 state->stdac_primary_speaker,
896 state->stdac_primary_balance,
897 &(reg_changes.value));
899 activate_ext_loudspeaker = activate_ext_loudspeaker ||
900 cpcap_audio_set_bits_for_speaker(
901 state->stdac_secondary_speaker,
902 CPCAP_AUDIO_BALANCE_NEUTRAL,
903 &(reg_changes.value));
905 activate_ext_loudspeaker = activate_ext_loudspeaker ||
906 cpcap_audio_set_bits_for_speaker(
907 state->ext_primary_speaker,
908 state->ext_primary_balance,
909 &(reg_changes.value));
911 activate_ext_loudspeaker = activate_ext_loudspeaker ||
912 cpcap_audio_set_bits_for_speaker(
913 state->ext_secondary_speaker,
914 CPCAP_AUDIO_BALANCE_NEUTRAL,
915 &(reg_changes.value));
917 reg_changes.mask = reg_changes.value | prev_aud_out_data;
919 prev_aud_out_data = reg_changes.value;
921 /* Sleep for 300ms if we are getting into a call to allow the switch to
922 * settle. If we don't do this, it causes a loud pop at the beginning
925 if (state->rat_type == CPCAP_AUDIO_RAT_CDMA &&
926 state->ext_primary_speaker != CPCAP_AUDIO_OUT_NONE &&
927 prev->ext_primary_speaker == CPCAP_AUDIO_OUT_NONE)
930 logged_cpcap_write(state->cpcap, CPCAP_REG_RXOA,
931 reg_changes.value, reg_changes.mask);
934 static inline bool codec_loopback_changed(struct cpcap_audio_state *new,
935 struct cpcap_audio_state *old)
937 return (new->codec_mode != old->codec_mode) &&
938 (new->codec_mode == CPCAP_AUDIO_CODEC_LOOPBACK ||
939 old->codec_mode == CPCAP_AUDIO_CODEC_LOOPBACK);
942 static void cpcap_audio_configure_input(struct cpcap_audio_state *state,
943 struct cpcap_audio_state *prev)
945 static unsigned int prev_input_data = 0x0;
946 struct cpcap_regacc reg_changes = { 0 };
947 bool bias_settle = false;
949 if (state->microphone == prev->microphone &&
950 !codec_loopback_changed(state, prev))
953 if (state->codec_mode == CPCAP_AUDIO_CODEC_LOOPBACK)
954 reg_changes.value |= CPCAP_BIT_DLM;
956 if (prev->microphone == CPCAP_AUDIO_IN_HEADSET)
957 logged_cpcap_write(state->cpcap, CPCAP_REG_GPIO4,
958 0, CPCAP_BIT_GPIO4DRV);
960 switch (state->microphone) {
961 case CPCAP_AUDIO_IN_HANDSET:
962 pr_debug("%s: handset\n", __func__);
963 reg_changes.value |= CPCAP_BIT_MB_ON1R
964 | CPCAP_BIT_MIC1_MUX | CPCAP_BIT_MIC1_PGA_EN;
968 case CPCAP_AUDIO_IN_HEADSET:
969 pr_debug("%s: headset\n", __func__);
970 reg_changes.value |= CPCAP_BIT_HS_MIC_MUX
971 | CPCAP_BIT_MIC1_PGA_EN;
972 if (state->rat_type == CPCAP_AUDIO_RAT_CDMA)
973 logged_cpcap_write(state->cpcap, CPCAP_REG_GPIO4,
974 CPCAP_BIT_GPIO4DRV, CPCAP_BIT_GPIO4DRV);
978 case CPCAP_AUDIO_IN_EXT_BUS:
979 reg_changes.value |= CPCAP_BIT_EMU_MIC_MUX
980 | CPCAP_BIT_MIC1_PGA_EN;
983 case CPCAP_AUDIO_IN_AUX_INTERNAL:
984 reg_changes.value |= CPCAP_BIT_MB_ON1L
985 | CPCAP_BIT_MIC2_MUX | CPCAP_BIT_MIC2_PGA_EN;
988 case CPCAP_AUDIO_IN_DUAL_INTERNAL:
989 reg_changes.value |= CPCAP_BIT_MB_ON1R
990 | CPCAP_BIT_MIC1_MUX | CPCAP_BIT_MIC1_PGA_EN
991 | CPCAP_BIT_MB_ON1L | CPCAP_BIT_MIC2_MUX
992 | CPCAP_BIT_MIC2_PGA_EN;
995 case CPCAP_AUDIO_IN_DUAL_EXTERNAL:
996 reg_changes.value |= CPCAP_BIT_RX_R_ENCODE
997 | CPCAP_BIT_RX_L_ENCODE;
1000 case CPCAP_AUDIO_IN_BT_MONO:
1002 reg_changes.value = 0;
1006 reg_changes.mask = reg_changes.value | prev_input_data;
1007 prev_input_data = reg_changes.value;
1009 logged_cpcap_write(state->cpcap, CPCAP_REG_TXI,
1010 reg_changes.value, reg_changes.mask);
1012 msleep(MICBIAS_WARMUP_TIME_MS);
1015 static void cpcap_audio_configure_power(int power)
1017 static int previous_power;
1019 pr_debug("%s() called with power= %d\n", __func__, power);
1021 if (power == previous_power)
1024 if (IS_ERR_OR_NULL(audio_reg)) {
1025 E("audio_reg not valid for regulator setup\n");
1030 pr_info("%s: regulator -> enable\n", __func__);
1031 regulator_enable(audio_reg);
1032 regulator_set_mode(audio_reg, REGULATOR_MODE_NORMAL);
1033 mdelay(SLEEP_ACTIVATE_POWER_DELAY_MS);
1035 pr_info("%s: regulator -> standby\n", __func__);
1036 regulator_set_mode(audio_reg, REGULATOR_MODE_STANDBY);
1037 regulator_disable(audio_reg);
1040 previous_power = power;
1043 static void cpcap_activate_whisper_emu_audio(struct cpcap_audio_state *state)
1045 struct cpcap_regacc reg_changes;
1047 pr_debug("%s() called\n", __func__);
1049 if (is_output_whisper_emu(state)) {
1050 reg_changes.mask |= CPCAP_BIT_DIG_AUD_IN;
1051 reg_changes.value = 0;
1052 logged_cpcap_write(state->cpcap, CPCAP_REG_CDI,
1053 reg_changes.value, reg_changes.mask);
1057 void cpcap_audio_state_dump(struct cpcap_audio_state *state)
1059 pr_info("mode = %d", state->mode);
1060 pr_info("codec_mode = %d", state->codec_mode);
1061 pr_info("codec_rate = %d", state->codec_rate);
1062 pr_info("codec_mute = %d", state->codec_mute);
1063 pr_info("stdac_mode = %d", state->stdac_mode);
1064 pr_info("stdac_rate = %d", state->stdac_rate);
1065 pr_info("stdac_mute = %d", state->stdac_mute);
1066 pr_info("analog_source = %d", state->analog_source);
1067 pr_info("codec_primary_speaker = %d", state->codec_primary_speaker);
1068 pr_info("codec_secondary_speaker = %d", state->codec_secondary_speaker);
1069 pr_info("stdac_primary_speaker = %d", state->stdac_primary_speaker);
1070 pr_info("stdac_secondary_speaker = %d", state->stdac_secondary_speaker);
1071 pr_info("ext_primary_speaker = %d", state->ext_primary_speaker);
1072 pr_info("ext_secondary_speaker = %d", state->ext_secondary_speaker);
1073 pr_info("codec_primary_balance = %d", state->codec_primary_balance);
1074 pr_info("stdac_primary_balance = %d", state->stdac_primary_balance);
1075 pr_info("ext_primary_balance = %d", state->ext_primary_balance);
1076 pr_info("output_gain = %d", state->output_gain);
1077 pr_info("microphone = %d", state->microphone);
1078 pr_info("input_gain = %d", state->input_gain);
1079 pr_info("rat_type = %d\n", state->rat_type);
1082 void cpcap_audio_register_dump(struct cpcap_audio_state *state)
1084 unsigned short reg_val = 0;
1086 cpcap_regacc_read(state->cpcap, CPCAP_REG_VAUDIOC, ®_val);
1087 printk(KERN_INFO "0x200[512] = %x\n", reg_val);
1088 cpcap_regacc_read(state->cpcap, CPCAP_REG_CC, ®_val);
1089 printk(KERN_INFO "0x201[513] = %x\n", reg_val);
1090 cpcap_regacc_read(state->cpcap, CPCAP_REG_CDI, ®_val);
1091 printk(KERN_INFO "0x202[514] = %x\n", reg_val);
1092 cpcap_regacc_read(state->cpcap, CPCAP_REG_SDAC, ®_val);
1093 printk(KERN_INFO "0x203[515] = %x\n", reg_val);
1094 cpcap_regacc_read(state->cpcap, CPCAP_REG_SDACDI, ®_val);
1095 printk(KERN_INFO "0x204[516] = %x\n", reg_val);
1096 cpcap_regacc_read(state->cpcap, CPCAP_REG_TXI, ®_val);
1097 printk(KERN_INFO "0x205[517] = %x\n", reg_val);
1098 cpcap_regacc_read(state->cpcap, CPCAP_REG_TXMP, ®_val);
1099 printk(KERN_INFO "0x206[518] = %x\n", reg_val);
1100 cpcap_regacc_read(state->cpcap, CPCAP_REG_RXOA, ®_val);
1101 printk(KERN_INFO "0x207[519] = %x\n", reg_val);
1102 cpcap_regacc_read(state->cpcap, CPCAP_REG_RXVC, ®_val);
1103 printk(KERN_INFO "0x208[520] = %x\n", reg_val);
1104 cpcap_regacc_read(state->cpcap, CPCAP_REG_RXCOA, ®_val);
1105 printk(KERN_INFO "0x209[521] = %x\n", reg_val);
1106 cpcap_regacc_read(state->cpcap, CPCAP_REG_RXSDOA, ®_val);
1107 printk(KERN_INFO "0x20A[522] = %x\n", reg_val);
1108 cpcap_regacc_read(state->cpcap, CPCAP_REG_RXEPOA, ®_val);
1109 printk(KERN_INFO "0x20B[523] = %x\n", reg_val);
1110 cpcap_regacc_read(state->cpcap, CPCAP_REG_RXLL, ®_val);
1111 printk(KERN_INFO "0x20C[524] = %x\n", reg_val);
1112 cpcap_regacc_read(state->cpcap, CPCAP_REG_A2LA, ®_val);
1113 printk(KERN_INFO "0x20D[525] = %x\n", reg_val);
1114 cpcap_regacc_read(state->cpcap, CPCAP_REG_USBC2, ®_val);
1115 printk(KERN_INFO "0x381[897] = %x\n", reg_val);
1118 static inline bool should_power_on(struct cpcap_audio_state *state)
1120 if (state->codec_mode != CPCAP_AUDIO_CODEC_OFF &&
1121 state->codec_mode != CPCAP_AUDIO_CODEC_CLOCK_ONLY)
1124 if (state->stdac_mode != CPCAP_AUDIO_STDAC_OFF)
1127 if (state->codec_primary_speaker != CPCAP_AUDIO_OUT_NONE &&
1128 state->codec_primary_speaker !=
1129 CPCAP_AUDIO_OUT_BT_MONO)
1132 if (state->stdac_primary_speaker != CPCAP_AUDIO_OUT_NONE)
1135 if (state->ext_primary_speaker != CPCAP_AUDIO_OUT_NONE)
1138 if (state->microphone != CPCAP_AUDIO_IN_NONE &&
1139 state->microphone != CPCAP_AUDIO_IN_BT_MONO)
1145 void cpcap_audio_set_audio_state(struct cpcap_audio_state *state)
1148 struct cpcap_audio_state *prev = ¤t_state;
1150 if (state->codec_mute == CPCAP_AUDIO_CODEC_BYPASS_LOOP)
1151 state->codec_mode = CPCAP_AUDIO_CODEC_ON;
1153 if (state->codec_mode == CPCAP_AUDIO_CODEC_OFF ||
1154 state->codec_mode == CPCAP_AUDIO_CODEC_CLOCK_ONLY ||
1155 state->rat_type == CPCAP_AUDIO_RAT_CDMA)
1156 state->codec_mute = CPCAP_AUDIO_CODEC_MUTE;
1158 state->codec_mute = CPCAP_AUDIO_CODEC_UNMUTE;
1160 if (state->stdac_mode != CPCAP_AUDIO_STDAC_ON)
1161 state->stdac_mute = CPCAP_AUDIO_STDAC_MUTE;
1163 state->stdac_mute = CPCAP_AUDIO_STDAC_UNMUTE;
1165 if (state->stdac_mode == CPCAP_AUDIO_STDAC_CLOCK_ONLY)
1166 state->stdac_mode = CPCAP_AUDIO_STDAC_ON;
1168 power_on = should_power_on(state);
1171 cpcap_audio_configure_power(1);
1173 if (is_speaker_turning_off(state, prev))
1174 cpcap_audio_configure_output(state, prev);
1176 cpcap_audio_configure_analog_source(state, prev);
1178 cpcap_audio_configure_input(state, prev);
1180 cpcap_audio_configure_input_gains(state, prev);
1182 if (is_codec_changed(state, prev) || is_stdac_changed(state, prev)) {
1183 int codec_mute = state->codec_mute;
1184 int stdac_mute = state->stdac_mute;
1186 if (is_codec_changed(state, prev))
1187 state->codec_mute = CPCAP_AUDIO_CODEC_MUTE;
1188 if (is_stdac_changed(state, prev))
1189 state->stdac_mute = CPCAP_AUDIO_STDAC_MUTE;
1191 cpcap_audio_configure_aud_mute(state, prev);
1193 prev->codec_mute = state->codec_mute;
1194 prev->stdac_mute = state->stdac_mute;
1196 state->codec_mute = codec_mute;
1197 state->stdac_mute = stdac_mute;
1199 cpcap_audio_configure_codec(state, prev);
1200 cpcap_audio_configure_stdac(state, prev);
1203 cpcap_audio_configure_output(state, prev);
1205 cpcap_audio_configure_output_gains(state, prev);
1207 cpcap_audio_configure_aud_mute(state, prev);
1209 cpcap_activate_whisper_emu_audio(state);
1212 cpcap_audio_configure_power(0);
1214 current_state = *state;
1217 int cpcap_audio_init(struct cpcap_audio_state *state, const char *regulator)
1219 logged_cpcap_write(state->cpcap, CPCAP_REG_CC, 0, 0xFFFF);
1220 logged_cpcap_write(state->cpcap, CPCAP_REG_CDI, 0, 0xBFFF);
1221 logged_cpcap_write(state->cpcap, CPCAP_REG_SDAC, 0, 0xFFF);
1222 logged_cpcap_write(state->cpcap, CPCAP_REG_SDACDI, 0, 0x3FFF);
1223 logged_cpcap_write(state->cpcap, CPCAP_REG_TXI, 0, 0xFDF);
1224 logged_cpcap_write(state->cpcap, CPCAP_REG_TXMP, 0, 0xFFF);
1225 logged_cpcap_write(state->cpcap, CPCAP_REG_RXOA, 0, 0x1FF);
1226 /* logged_cpcap_write(state->cpcap, CPCAP_REG_RXVC, 0, 0xFFF); */
1227 logged_cpcap_write(state->cpcap, CPCAP_REG_RXCOA, 0, 0x7FF);
1228 logged_cpcap_write(state->cpcap, CPCAP_REG_RXSDOA, 0, 0x1FFF);
1229 logged_cpcap_write(state->cpcap, CPCAP_REG_RXEPOA, 0, 0x7FFF);
1231 /* Use free running clock for amplifiers */
1232 logged_cpcap_write(state->cpcap, CPCAP_REG_A2LA,
1233 CPCAP_BIT_A2_FREE_RUN,
1234 CPCAP_BIT_A2_FREE_RUN);
1236 logged_cpcap_write(state->cpcap, CPCAP_REG_GPIO4,
1237 CPCAP_BIT_GPIO4DIR, CPCAP_BIT_GPIO4DIR);
1239 audio_reg = regulator_get(NULL, regulator);
1241 if (IS_ERR(audio_reg)) {
1242 E("could not get regulator for audio\n");
1243 return PTR_ERR(audio_reg);
1249 #ifdef CONFIG_DEBUG_FS
1251 #include <linux/debugfs.h>
1252 #include <linux/seq_file.h>
1255 DEBUG_CPCAP_AUDIO_MODE,
1256 DEBUG_CPCAP_AUDIO_CODEC_MODE,
1257 DEBUG_CPCAP_AUDIO_CODEC_RATE,
1258 DEBUG_CPCAP_AUDIO_CODEC_MUTE,
1259 DEBUG_CPCAP_AUDIO_STDAC_MODE,
1260 DEBUG_CPCAP_AUDIO_STDAC_RATE,
1261 DEBUG_CPCAP_AUDIO_STDAC_MUTE,
1262 DEBUG_CPCAP_AUDIO_ANALOG_SOURCE,
1263 DEBUG_CPCAP_AUDIO_CODEC_PRIMARY_SPEAKER,
1264 DEBUG_CPCAP_AUDIO_CODEC_SECONDARY_SPEAKER,
1265 DEBUG_CPCAP_AUDIO_STDAC_PRIMARY_SPEAKER,
1266 DEBUG_CPCAP_AUDIO_STDAC_SECONDARY_SPEAKER,
1267 DEBUG_CPCAP_AUDIO_EXT_PRIMARY_SPEAKER,
1268 DEBUG_CPCAP_AUDIO_EXT_SECONDARY_SPEAKER,
1269 DEBUG_CPCAP_AUDIO_CODEC_PRIMARY_BALANCE,
1270 DEBUG_CPCAP_AUDIO_STDAC_PRIMARY_BALANCE,
1271 DEBUG_CPCAP_AUDIO_EXT_PRIMARY_BALANCE,
1272 DEBUG_CPCAP_AUDIO_OUTPUT_GAIN,
1273 DEBUG_CPCAP_AUDIO_MICROPHONE,
1274 DEBUG_CPCAP_AUDIO_INPUT_GAIN,
1275 DEBUG_CPCAP_RAT_TYPE,
1276 DEBUG_CPCAP_NUM_FIELDS,
1278 static struct cpcap_audio_state debug_state;
1280 struct debug_audio_entry {
1289 #define DBG_ENTRY(_id, _min, _max, _fld) \
1295 .dbg_val = &debug_state._fld, \
1296 .cur_val = ¤t_state._fld, \
1299 static struct debug_audio_entry values[] = {
1300 DBG_ENTRY(DEBUG_CPCAP_AUDIO_MODE,
1301 CPCAP_AUDIO_MODE_NORMAL, CPCAP_AUDIO_MODE_TTY,
1304 DBG_ENTRY(DEBUG_CPCAP_AUDIO_CODEC_MODE,
1305 CPCAP_AUDIO_CODEC_OFF, CPCAP_AUDIO_CODEC_LOOPBACK,
1307 DBG_ENTRY(DEBUG_CPCAP_AUDIO_CODEC_RATE,
1308 CPCAP_AUDIO_CODEC_RATE_8000_HZ,
1309 CPCAP_AUDIO_CODEC_RATE_48000_HZ,
1311 DBG_ENTRY(DEBUG_CPCAP_AUDIO_CODEC_MUTE,
1312 CPCAP_AUDIO_CODEC_UNMUTE, CPCAP_AUDIO_CODEC_BYPASS_LOOP,
1315 DBG_ENTRY(DEBUG_CPCAP_AUDIO_STDAC_MODE,
1316 CPCAP_AUDIO_STDAC_OFF, CPCAP_AUDIO_STDAC_ON,
1318 DBG_ENTRY(DEBUG_CPCAP_AUDIO_STDAC_RATE,
1319 CPCAP_AUDIO_STDAC_RATE_8000_HZ,
1320 CPCAP_AUDIO_STDAC_RATE_48000_HZ,
1322 DBG_ENTRY(DEBUG_CPCAP_AUDIO_STDAC_MUTE,
1323 CPCAP_AUDIO_STDAC_UNMUTE, CPCAP_AUDIO_STDAC_MUTE,
1326 DBG_ENTRY(DEBUG_CPCAP_AUDIO_ANALOG_SOURCE,
1327 CPCAP_AUDIO_ANALOG_SOURCE_OFF,
1328 CPCAP_AUDIO_ANALOG_SOURCE_STEREO,
1331 DBG_ENTRY(DEBUG_CPCAP_AUDIO_CODEC_PRIMARY_SPEAKER,
1332 CPCAP_AUDIO_OUT_NONE,
1333 CPCAP_AUDIO_OUT_NUM_OF_PATHS - 1, codec_primary_speaker),
1334 DBG_ENTRY(DEBUG_CPCAP_AUDIO_CODEC_SECONDARY_SPEAKER,
1335 CPCAP_AUDIO_OUT_NONE,
1336 CPCAP_AUDIO_OUT_NUM_OF_PATHS - 1 , codec_secondary_speaker),
1337 DBG_ENTRY(DEBUG_CPCAP_AUDIO_STDAC_PRIMARY_SPEAKER,
1338 CPCAP_AUDIO_OUT_NONE,
1339 CPCAP_AUDIO_OUT_NUM_OF_PATHS - 1, stdac_primary_speaker),
1340 DBG_ENTRY(DEBUG_CPCAP_AUDIO_STDAC_SECONDARY_SPEAKER,
1341 CPCAP_AUDIO_OUT_NONE,
1342 CPCAP_AUDIO_OUT_NUM_OF_PATHS - 1, stdac_secondary_speaker),
1343 DBG_ENTRY(DEBUG_CPCAP_AUDIO_EXT_PRIMARY_SPEAKER,
1344 CPCAP_AUDIO_OUT_NONE,
1345 CPCAP_AUDIO_OUT_NUM_OF_PATHS - 1, ext_primary_speaker),
1346 DBG_ENTRY(DEBUG_CPCAP_AUDIO_EXT_SECONDARY_SPEAKER,
1347 CPCAP_AUDIO_OUT_NONE,
1348 CPCAP_AUDIO_OUT_NUM_OF_PATHS - 1, ext_secondary_speaker),
1349 DBG_ENTRY(DEBUG_CPCAP_AUDIO_CODEC_PRIMARY_BALANCE,
1350 CPCAP_AUDIO_BALANCE_NEUTRAL,
1351 CPCAP_AUDIO_BALANCE_L_ONLY, codec_primary_balance),
1352 DBG_ENTRY(DEBUG_CPCAP_AUDIO_STDAC_PRIMARY_BALANCE,
1353 CPCAP_AUDIO_BALANCE_NEUTRAL,
1354 CPCAP_AUDIO_BALANCE_L_ONLY, stdac_primary_balance),
1355 DBG_ENTRY(DEBUG_CPCAP_AUDIO_EXT_PRIMARY_BALANCE,
1356 CPCAP_AUDIO_BALANCE_NEUTRAL,
1357 CPCAP_AUDIO_BALANCE_L_ONLY, ext_primary_balance),
1358 DBG_ENTRY(DEBUG_CPCAP_AUDIO_OUTPUT_GAIN, 0, 50, output_gain),
1359 DBG_ENTRY(DEBUG_CPCAP_AUDIO_MICROPHONE, CPCAP_AUDIO_IN_NONE,
1360 CPCAP_AUDIO_IN_NUM_OF_PATHS - 1, microphone),
1361 DBG_ENTRY(DEBUG_CPCAP_AUDIO_INPUT_GAIN, 0, 50, input_gain),
1362 DBG_ENTRY(DEBUG_CPCAP_RAT_TYPE,
1363 CPCAP_AUDIO_RAT_NONE, CPCAP_AUDIO_RAT_CDMA,
1367 static int tegra_audio_debug_show(struct seq_file *s, void *data)
1369 int field = (int) s->private;
1371 if (field < DEBUG_CPCAP_NUM_FIELDS)
1372 seq_printf(s, "%d\n", *values[field].cur_val);
1377 static int tegra_audio_debug_open(struct inode *inode, struct file *file)
1379 return single_open(file, tegra_audio_debug_show, inode->i_private);
1382 static int tegra_audio_debug_write(struct file *file,
1383 const char __user *user_buf, size_t count, loff_t *ppos)
1388 struct seq_file *s = file->private_data;
1389 int field = (int) s->private;
1391 buf_sz = min(count, (sizeof(buf)-1));
1392 if (copy_from_user(buf, user_buf, buf_sz))
1396 debug_state = current_state;
1398 if (strict_strtol(buf, 0, &ival))
1400 if (ival < values[field].min || ival > values[field].max) {
1401 pr_err("%s: invalid value %ld\n", __func__, ival);
1405 *values[field].dbg_val = ival;
1407 pr_info("%s setting %s to %ld\n", __func__,
1408 values[field].name, ival);
1410 cpcap_audio_set_audio_state(&debug_state);
1414 static const struct file_operations tegra_audio_debug_fops = {
1415 .open = tegra_audio_debug_open,
1416 .write = tegra_audio_debug_write,
1418 .llseek = seq_lseek,
1419 .release = single_release,
1422 static int __init tegra_audio_debug_init(void)
1425 struct dentry *d, *f;
1427 d = debugfs_create_dir("cpcap_audio", NULL);
1429 for (i = 0; i < DEBUG_CPCAP_NUM_FIELDS; i++) {
1430 f = debugfs_create_file(values[i].name, 0755, d,
1431 (void *) values[i].id,
1432 &tegra_audio_debug_fops);
1438 late_initcall(tegra_audio_debug_init);
1439 #endif /* CONFIG_DEBUG_FS */