2 * intelmid_vm_control.c - Intel Sound card driver for MID
4 * Copyright (C) 2010 Intel Corp
5 * Authors: Vinod Koul <vinod.koul@intel.com>
7 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; version 2 of the License.
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
22 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
24 * This file contains the control operations of msic vendors
27 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
29 #include <linux/pci.h>
30 #include <linux/file.h>
31 #include <linux/delay.h>
32 #include <sound/control.h>
33 #include "intel_sst.h"
34 #include <linux/input.h>
35 #include "intelmid_snd_control.h"
38 #define AUDIOMUX12 0x24c
39 #define AUDIOMUX34 0x24d
41 static int msic_init_card(void)
43 struct sc_reg_access sc_access
[] = {
44 /* dmic configuration */
47 /* audio paths config */
50 /* PCM2 interface slots */
51 /* preconfigured slots for 0-5 both tx, rx */
60 /*TI vibra w/a settings*/
65 /* pcm port setting */
69 /* Set vol HSLRVOLCTRL, IHFVOL */
74 /* HSEPRXCTRL Enable the headset left and right FIR filters */
78 /* amic configuration */
81 /* unmask ocaudio/accdet interrupts */
85 snd_msic_ops
.card_status
= SND_CARD_INIT_DONE
;
86 sst_sc_reg_access(sc_access
, PMIC_WRITE
, 28);
87 snd_msic_ops
.pb_on
= 0;
88 snd_msic_ops
.pbhs_on
= 0;
89 snd_msic_ops
.cap_on
= 0;
90 snd_msic_ops
.input_dev_id
= DMIC
; /*def dev*/
91 snd_msic_ops
.output_dev_id
= STEREO_HEADPHONE
;
92 snd_msic_ops
.jack_interrupt_status
= false;
93 pr_debug("msic init complete!!\n");
96 static int msic_line_out_restore(u8 value
)
98 struct sc_reg_access hs_drv_en
[] = {
101 struct sc_reg_access ep_drv_en
[] = {
104 struct sc_reg_access ihf_drv_en
[] = {
107 struct sc_reg_access vib1_drv_en
[] = {
110 struct sc_reg_access vib2_drv_en
[] = {
113 struct sc_reg_access pmode_enable
[] = {
118 pr_debug("msic_lineout_restore_lineout_dev:%d\n", value
);
122 pr_debug("Selecting Lineout-HEADSET-restore\n");
123 if (snd_msic_ops
.output_dev_id
== STEREO_HEADPHONE
)
124 retval
= sst_sc_reg_access(hs_drv_en
,
125 PMIC_READ_MODIFY
, 1);
127 retval
= sst_sc_reg_access(ep_drv_en
,
128 PMIC_READ_MODIFY
, 1);
131 pr_debug("Selecting Lineout-IHF-restore\n");
132 retval
= sst_sc_reg_access(ihf_drv_en
, PMIC_READ_MODIFY
, 1);
135 retval
= sst_sc_reg_access(pmode_enable
, PMIC_READ_MODIFY
, 1);
138 pr_debug("Selecting Lineout-Vibra1-restore\n");
139 retval
= sst_sc_reg_access(vib1_drv_en
, PMIC_READ_MODIFY
, 1);
142 pr_debug("Selecting Lineout-VIBRA2-restore\n");
143 retval
= sst_sc_reg_access(vib2_drv_en
, PMIC_READ_MODIFY
, 1);
146 pr_debug("Selecting Lineout-NONE-restore\n");
153 static int msic_get_lineout_prvstate(void)
155 struct sc_reg_access hs_ihf_drv
[2] = {
159 struct sc_reg_access vib1drv
[2] = {
163 struct sc_reg_access vib2drv
[2] = {
167 int retval
= 0, drv_en
, dac_en
, dev_id
, mask
;
168 for (dev_id
= 0; dev_id
< snd_msic_ops
.line_out_names_cnt
; dev_id
++) {
171 pr_debug("msic_get_lineout_prvs_state: HEADSET\n");
172 sst_sc_reg_access(hs_ihf_drv
, PMIC_READ
, 2);
174 mask
= (MASK0
|MASK1
);
175 dac_en
= (hs_ihf_drv
[0].value
) & mask
;
177 mask
= ((MASK0
|MASK1
)|MASK6
);
178 drv_en
= (hs_ihf_drv
[1].value
) & mask
;
180 if (dac_en
&& (!drv_en
)) {
181 snd_msic_ops
.prev_lineout_dev_id
= HEADSET
;
186 pr_debug("msic_get_lineout_prvstate: IHF\n");
187 sst_sc_reg_access(hs_ihf_drv
, PMIC_READ
, 2);
189 mask
= (MASK2
| MASK3
);
190 dac_en
= (hs_ihf_drv
[0].value
) & mask
;
192 mask
= (MASK2
| MASK3
);
193 drv_en
= (hs_ihf_drv
[1].value
) & mask
;
195 if (dac_en
&& (!drv_en
)) {
196 snd_msic_ops
.prev_lineout_dev_id
= IHF
;
201 pr_debug("msic_get_lineout_prvstate: vibra1\n");
202 sst_sc_reg_access(vib1drv
, PMIC_READ
, 2);
205 dac_en
= (vib1drv
[0].value
) & mask
;
208 drv_en
= (vib1drv
[1].value
) & mask
;
210 if (dac_en
&& (!drv_en
)) {
211 snd_msic_ops
.prev_lineout_dev_id
= VIBRA1
;
216 pr_debug("msic_get_lineout_prvstate: vibra2\n");
217 sst_sc_reg_access(vib2drv
, PMIC_READ
, 2);
220 dac_en
= (vib2drv
[0].value
) & mask
;
223 drv_en
= ((vib2drv
[1].value
) & mask
);
225 if (dac_en
&& (!drv_en
)) {
226 snd_msic_ops
.prev_lineout_dev_id
= VIBRA2
;
231 pr_debug("msic_get_lineout_prvstate: NONE\n");
232 snd_msic_ops
.prev_lineout_dev_id
= NONE
;
235 pr_debug("Invalid device id\n");
236 snd_msic_ops
.prev_lineout_dev_id
= NONE
;
242 static int msic_set_selected_lineout_dev(u8 value
)
244 struct sc_reg_access lout_hs
[] = {
248 struct sc_reg_access lout_ihf
[] = {
252 struct sc_reg_access lout_vibra1
[] = {
257 struct sc_reg_access lout_vibra2
[] = {
262 struct sc_reg_access lout_def
[] = {
265 struct sc_reg_access pmode_disable
[] = {
268 struct sc_reg_access pmode_enable
[] = {
273 pr_debug("msic_set_selected_lineout_dev:%d\n", value
);
274 msic_get_lineout_prvstate();
275 msic_line_out_restore(snd_msic_ops
.prev_lineout_dev_id
);
276 snd_msic_ops
.lineout_dev_id
= value
;
280 pr_debug("Selecting Lineout-HEADSET\n");
281 if (snd_msic_ops
.pb_on
)
282 retval
= sst_sc_reg_access(lout_hs
,
283 PMIC_READ_MODIFY
, 2);
286 retval
= sst_sc_reg_access(pmode_disable
,
287 PMIC_READ_MODIFY
, 1);
290 pr_debug("Selecting Lineout-IHF\n");
291 if (snd_msic_ops
.pb_on
)
292 retval
= sst_sc_reg_access(lout_ihf
,
293 PMIC_READ_MODIFY
, 2);
296 retval
= sst_sc_reg_access(pmode_enable
,
297 PMIC_READ_MODIFY
, 1);
300 pr_debug("Selecting Lineout-Vibra1\n");
301 if (snd_msic_ops
.pb_on
)
302 retval
= sst_sc_reg_access(lout_vibra1
,
303 PMIC_READ_MODIFY
, 2);
306 retval
= sst_sc_reg_access(pmode_disable
,
307 PMIC_READ_MODIFY
, 1);
310 pr_debug("Selecting Lineout-VIBRA2\n");
311 if (snd_msic_ops
.pb_on
)
312 retval
= sst_sc_reg_access(lout_vibra2
,
313 PMIC_READ_MODIFY
, 2);
316 retval
= sst_sc_reg_access(pmode_disable
,
317 PMIC_READ_MODIFY
, 1);
320 pr_debug("Selecting Lineout-NONE\n");
321 retval
= sst_sc_reg_access(lout_def
,
325 retval
= sst_sc_reg_access(pmode_disable
,
326 PMIC_READ_MODIFY
, 1);
335 static int msic_power_up_pb(unsigned int device
)
337 struct sc_reg_access vaud
[] = {
338 /* turn on the audio power supplies */
341 struct sc_reg_access pll
[] = {
345 struct sc_reg_access vhs
[] = {
351 struct sc_reg_access hsdac
[] = {
355 /* DAC CONFIG ; both HP, LP on */
358 struct sc_reg_access hs_filter
[] = {
359 /* HSEPRXCTRL Enable the headset left and right FIR filters */
364 struct sc_reg_access hs_enable
[] = {
368 /* unmute the headset */
369 { 0x259, 0x80, 0x80},
370 { 0x25A, 0x80, 0x80},
372 struct sc_reg_access vihf
[] = {
376 struct sc_reg_access ihf_filter
[] = {
383 struct sc_reg_access ihf_en
[] = {
387 struct sc_reg_access ihf_unmute
[] = {
392 struct sc_reg_access epdac
[] = {
395 /* DAC CONFIG ; both HP, LP on */
398 struct sc_reg_access ep_enable
[] = {
401 /* unmute the headset */
402 { 0x259, 0x80, 0x80},
403 { 0x25A, 0x80, 0x80},
405 struct sc_reg_access vib1_en
[] = {
406 /* enable driver, ADC */
410 struct sc_reg_access vib2_en
[] = {
411 /* enable driver, ADC */
415 struct sc_reg_access pcm2_en
[] = {
421 if (snd_msic_ops
.card_status
== SND_CARD_UN_INIT
) {
422 retval
= msic_init_card();
427 pr_debug("powering up pb.... Device %d\n", device
);
428 sst_sc_reg_access(vaud
, PMIC_WRITE
, 1);
430 sst_sc_reg_access(pll
, PMIC_WRITE
, 1);
433 case SND_SST_DEVICE_HEADSET
:
434 snd_msic_ops
.pb_on
= 1;
435 snd_msic_ops
.pbhs_on
= 1;
436 if (snd_msic_ops
.output_dev_id
== STEREO_HEADPHONE
) {
437 sst_sc_reg_access(vhs
, PMIC_WRITE
, 2);
438 sst_sc_reg_access(hsdac
, PMIC_READ_MODIFY
, 3);
439 sst_sc_reg_access(hs_filter
, PMIC_WRITE
, 2);
440 sst_sc_reg_access(hs_enable
, PMIC_READ_MODIFY
, 4);
442 sst_sc_reg_access(epdac
, PMIC_READ_MODIFY
, 2);
443 sst_sc_reg_access(hs_filter
, PMIC_WRITE
, 2);
444 sst_sc_reg_access(ep_enable
, PMIC_READ_MODIFY
, 3);
446 if (snd_msic_ops
.lineout_dev_id
== HEADSET
)
447 msic_set_selected_lineout_dev(HEADSET
);
449 case SND_SST_DEVICE_IHF
:
450 snd_msic_ops
.pb_on
= 1;
451 sst_sc_reg_access(vihf
, PMIC_WRITE
, 1);
452 sst_sc_reg_access(ihf_filter
, PMIC_READ_MODIFY
, 3);
453 sst_sc_reg_access(ihf_en
, PMIC_READ_MODIFY
, 1);
454 sst_sc_reg_access(ihf_unmute
, PMIC_READ_MODIFY
, 2);
455 if (snd_msic_ops
.lineout_dev_id
== IHF
)
456 msic_set_selected_lineout_dev(IHF
);
459 case SND_SST_DEVICE_VIBRA
:
460 snd_msic_ops
.pb_on
= 1;
461 sst_sc_reg_access(vib1_en
, PMIC_READ_MODIFY
, 2);
462 if (snd_msic_ops
.lineout_dev_id
== VIBRA1
)
463 msic_set_selected_lineout_dev(VIBRA1
);
466 case SND_SST_DEVICE_HAPTIC
:
467 snd_msic_ops
.pb_on
= 1;
468 sst_sc_reg_access(vib2_en
, PMIC_READ_MODIFY
, 2);
469 if (snd_msic_ops
.lineout_dev_id
== VIBRA2
)
470 msic_set_selected_lineout_dev(VIBRA2
);
474 pr_warn("Wrong Device %d, selected %d\n",
475 device
, snd_msic_ops
.output_dev_id
);
477 return sst_sc_reg_access(pcm2_en
, PMIC_READ_MODIFY
, 1);
480 static int msic_power_up_cp(unsigned int device
)
482 struct sc_reg_access vaud
[] = {
483 /* turn on the audio power supplies */
486 struct sc_reg_access pll
[] = {
490 struct sc_reg_access dmic_bias
[] = {
491 /* Turn on AMIC supply */
494 struct sc_reg_access dmic
[] = {
495 /* mic demux enable */
500 struct sc_reg_access amic_bias
[] = {
501 /* Turn on AMIC supply */
504 struct sc_reg_access amic
[] = {
512 struct sc_reg_access pcm2
[] = {
516 struct sc_reg_access tx_on
[] = {
517 /*wait for mic to stabalize before turning on audio channels*/
522 if (snd_msic_ops
.card_status
== SND_CARD_UN_INIT
) {
523 retval
= msic_init_card();
528 pr_debug("powering up cp....%d\n", snd_msic_ops
.input_dev_id
);
529 sst_sc_reg_access(vaud
, PMIC_WRITE
, 1);
530 msleep(500);/*FIXME need optimzed value here*/
531 sst_sc_reg_access(pll
, PMIC_WRITE
, 1);
533 snd_msic_ops
.cap_on
= 1;
534 if (snd_msic_ops
.input_dev_id
== AMIC
) {
535 sst_sc_reg_access(amic_bias
, PMIC_READ_MODIFY
, 1);
537 sst_sc_reg_access(amic
, PMIC_READ_MODIFY
, 3);
539 sst_sc_reg_access(dmic_bias
, PMIC_READ_MODIFY
, 1);
541 sst_sc_reg_access(dmic
, PMIC_READ_MODIFY
, 2);
544 sst_sc_reg_access(tx_on
, PMIC_WRITE
, 1);
545 return sst_sc_reg_access(pcm2
, PMIC_READ_MODIFY
, 1);
548 static int msic_power_down(void)
550 struct sc_reg_access power_dn
[] = {
558 struct sc_reg_access pll
[] = {
562 struct sc_reg_access vaud
[] = {
567 pr_debug("powering dn msic\n");
568 snd_msic_ops
.pbhs_on
= 0;
569 snd_msic_ops
.pb_on
= 0;
570 snd_msic_ops
.cap_on
= 0;
571 sst_sc_reg_access(power_dn
, PMIC_WRITE
, 3);
573 sst_sc_reg_access(pll
, PMIC_WRITE
, 1);
575 sst_sc_reg_access(vaud
, PMIC_WRITE
, 1);
579 static int msic_power_down_pb(unsigned int device
)
581 struct sc_reg_access drv_enable
[] = {
584 struct sc_reg_access hs_mute
[] = {
589 struct sc_reg_access hs_off
[] = {
594 struct sc_reg_access ihf_mute
[] = {
598 struct sc_reg_access ihf_off
[] = {
602 struct sc_reg_access vib1_off
[] = {
605 struct sc_reg_access vib2_off
[] = {
608 struct sc_reg_access lout_off
[] = {
611 struct sc_reg_access pmode_disable
[] = {
617 pr_debug("powering dn pb for device %d\n", device
);
619 case SND_SST_DEVICE_HEADSET
:
620 snd_msic_ops
.pbhs_on
= 0;
621 sst_sc_reg_access(hs_mute
, PMIC_READ_MODIFY
, 3);
622 drv_enable
[0].mask
= 0x43;
623 sst_sc_reg_access(drv_enable
, PMIC_READ_MODIFY
, 1);
624 sst_sc_reg_access(hs_off
, PMIC_READ_MODIFY
, 3);
625 if (snd_msic_ops
.lineout_dev_id
== HEADSET
)
626 sst_sc_reg_access(lout_off
, PMIC_WRITE
, 1);
629 case SND_SST_DEVICE_IHF
:
630 sst_sc_reg_access(ihf_mute
, PMIC_READ_MODIFY
, 2);
631 drv_enable
[0].mask
= 0x0C;
632 sst_sc_reg_access(drv_enable
, PMIC_READ_MODIFY
, 1);
633 sst_sc_reg_access(ihf_off
, PMIC_READ_MODIFY
, 2);
634 if (snd_msic_ops
.lineout_dev_id
== IHF
) {
635 sst_sc_reg_access(lout_off
, PMIC_WRITE
, 1);
636 sst_sc_reg_access(pmode_disable
, PMIC_READ_MODIFY
, 1);
640 case SND_SST_DEVICE_VIBRA
:
641 sst_sc_reg_access(vib1_off
, PMIC_READ_MODIFY
, 1);
642 drv_enable
[0].mask
= 0x10;
643 sst_sc_reg_access(drv_enable
, PMIC_READ_MODIFY
, 1);
644 if (snd_msic_ops
.lineout_dev_id
== VIBRA1
)
645 sst_sc_reg_access(lout_off
, PMIC_WRITE
, 1);
648 case SND_SST_DEVICE_HAPTIC
:
649 sst_sc_reg_access(vib2_off
, PMIC_READ_MODIFY
, 1);
650 drv_enable
[0].mask
= 0x20;
651 sst_sc_reg_access(drv_enable
, PMIC_READ_MODIFY
, 1);
652 if (snd_msic_ops
.lineout_dev_id
== VIBRA2
)
653 sst_sc_reg_access(lout_off
, PMIC_WRITE
, 1);
659 static int msic_power_down_cp(unsigned int device
)
661 struct sc_reg_access dmic
[] = {
666 struct sc_reg_access amic
[] = {
672 struct sc_reg_access tx_off
[] = {
676 pr_debug("powering dn cp....\n");
677 snd_msic_ops
.cap_on
= 0;
678 sst_sc_reg_access(tx_off
, PMIC_READ_MODIFY
, 1);
679 if (snd_msic_ops
.input_dev_id
== DMIC
)
680 sst_sc_reg_access(dmic
, PMIC_READ_MODIFY
, 3);
682 sst_sc_reg_access(amic
, PMIC_READ_MODIFY
, 4);
686 static int msic_set_selected_output_dev(u8 value
)
690 pr_debug("msic set selected output:%d\n", value
);
691 snd_msic_ops
.output_dev_id
= value
;
692 if (snd_msic_ops
.pbhs_on
)
693 msic_power_up_pb(SND_SST_DEVICE_HEADSET
);
697 static int msic_set_selected_input_dev(u8 value
)
700 struct sc_reg_access sc_access_dmic
[] = {
703 struct sc_reg_access sc_access_amic
[] = {
709 pr_debug("msic_set_selected_input_dev:%d\n", value
);
710 snd_msic_ops
.input_dev_id
= value
;
713 pr_debug("Selecting AMIC1\n");
714 retval
= sst_sc_reg_access(sc_access_amic
, PMIC_WRITE
, 1);
717 pr_debug("Selecting DMIC1\n");
718 retval
= sst_sc_reg_access(sc_access_dmic
, PMIC_WRITE
, 1);
724 if (snd_msic_ops
.cap_on
)
725 retval
= msic_power_up_cp(SND_SST_DEVICE_CAPTURE
);
729 static int msic_set_hw_dmic_route(u8 hw_ch_index
)
731 struct sc_reg_access sc_access_router
;
732 int retval
= -EINVAL
;
734 switch (hw_ch_index
) {
736 sc_access_router
.reg_addr
= AUDIOMUX12
;
737 sc_access_router
.value
= snd_msic_ops
.hw_dmic_map
[0];
738 sc_access_router
.mask
= (MASK2
| MASK1
| MASK0
);
739 pr_debug("hw_ch0. value = 0x%x\n",
740 sc_access_router
.value
);
741 retval
= sst_sc_reg_access(&sc_access_router
,
742 PMIC_READ_MODIFY
, 1);
746 sc_access_router
.reg_addr
= AUDIOMUX12
;
747 sc_access_router
.value
= (snd_msic_ops
.hw_dmic_map
[1]) << 4;
748 sc_access_router
.mask
= (MASK6
| MASK5
| MASK4
);
749 pr_debug("### hw_ch1. value = 0x%x\n",
750 sc_access_router
.value
);
751 retval
= sst_sc_reg_access(&sc_access_router
,
752 PMIC_READ_MODIFY
, 1);
756 sc_access_router
.reg_addr
= AUDIOMUX34
;
757 sc_access_router
.value
= snd_msic_ops
.hw_dmic_map
[2];
758 sc_access_router
.mask
= (MASK2
| MASK1
| MASK0
);
759 pr_debug("hw_ch2. value = 0x%x\n",
760 sc_access_router
.value
);
761 retval
= sst_sc_reg_access(&sc_access_router
,
762 PMIC_READ_MODIFY
, 1);
766 sc_access_router
.reg_addr
= AUDIOMUX34
;
767 sc_access_router
.value
= (snd_msic_ops
.hw_dmic_map
[3]) << 4;
768 sc_access_router
.mask
= (MASK6
| MASK5
| MASK4
);
769 pr_debug("hw_ch3. value = 0x%x\n",
770 sc_access_router
.value
);
771 retval
= sst_sc_reg_access(&sc_access_router
,
772 PMIC_READ_MODIFY
, 1);
780 static int msic_set_pcm_voice_params(void)
785 static int msic_set_pcm_audio_params(int sfreq
, int word_size
, int num_channel
)
790 static int msic_set_audio_port(int status
)
795 static int msic_set_voice_port(int status
)
800 static int msic_set_mute(int dev_id
, u8 value
)
805 static int msic_set_vol(int dev_id
, int value
)
810 static int msic_get_mute(int dev_id
, u8
*value
)
815 static int msic_get_vol(int dev_id
, int *value
)
820 static int msic_set_headset_state(int state
)
822 struct sc_reg_access hs_enable
[] = {
828 sst_sc_reg_access(hs_enable
, PMIC_READ_MODIFY
, 1);
830 hs_enable
[0].value
= 0;
831 sst_sc_reg_access(hs_enable
, PMIC_READ_MODIFY
, 1);
836 static int msic_enable_mic_bias(void)
838 struct sc_reg_access jack_interrupt_reg
[] = {
842 struct sc_reg_access jack_bias_reg
[] = {
846 sst_sc_reg_access(jack_interrupt_reg
, PMIC_WRITE
, 1);
847 sst_sc_reg_access(jack_bias_reg
, PMIC_READ_MODIFY
, 1);
851 static int msic_disable_mic_bias(void)
853 if (snd_msic_ops
.jack_interrupt_status
== true)
855 if (!(snd_msic_ops
.pb_on
|| snd_msic_ops
.cap_on
))
860 static int msic_disable_jack_btn(void)
862 struct sc_reg_access btn_disable
[] = {
866 if (!(snd_msic_ops
.pb_on
|| snd_msic_ops
.cap_on
))
868 snd_msic_ops
.jack_interrupt_status
= false;
869 return sst_sc_reg_access(btn_disable
, PMIC_READ_MODIFY
, 1);
872 static int msic_enable_jack_btn(void)
874 struct sc_reg_access btn_enable
[] = {
878 return sst_sc_reg_access(btn_enable
, PMIC_WRITE
, 2);
880 static int msic_convert_adc_to_mvolt(unsigned int mic_bias
)
882 return (ADC_ONE_LSB_MULTIPLIER
* mic_bias
) / 1000;
884 int msic_get_headset_state(int mic_bias
)
886 struct sc_reg_access msic_hs_toggle
[] = {
889 if (mic_bias
>= 0 && mic_bias
< 400) {
891 pr_debug("Detected Headphone!!!\n");
892 sst_sc_reg_access(msic_hs_toggle
, PMIC_READ_MODIFY
, 1);
894 } else if (mic_bias
> 400 && mic_bias
< 650) {
896 pr_debug("Detected American headset\n");
897 msic_hs_toggle
[0].value
= 0x01;
898 sst_sc_reg_access(msic_hs_toggle
, PMIC_READ_MODIFY
, 1);
900 } else if (mic_bias
>= 650 && mic_bias
< 2000) {
902 pr_debug("Detected Headset!!!\n");
903 sst_sc_reg_access(msic_hs_toggle
, PMIC_READ_MODIFY
, 1);
904 /*power on jack and btn*/
905 snd_msic_ops
.jack_interrupt_status
= true;
906 msic_enable_jack_btn();
907 msic_enable_mic_bias();
908 return SND_JACK_HEADSET
;
911 pr_debug("Detected Open Cable!!!\n");
913 return SND_JACK_HEADPHONE
;
916 static int msic_get_mic_bias(void *arg
)
918 struct snd_intelmad
*intelmad_drv
= (struct snd_intelmad
*)arg
;
919 u16 adc_adr
= intelmad_drv
->adc_address
;
922 struct sc_reg_access adc_ctrl3
[2] = {
926 struct sc_reg_access audio_adc_reg1
= {0,};
927 struct sc_reg_access audio_adc_reg2
= {0,};
929 msic_enable_mic_bias();
930 /* Enable the msic for conversion before reading */
931 ret
= sst_sc_reg_access(adc_ctrl3
, PMIC_WRITE
, 1);
934 adc_ctrl3
[0].value
= 0x04;
935 /* Re-toggle the RRDATARD bit */
936 ret
= sst_sc_reg_access(adc_ctrl3
, PMIC_WRITE
, 1);
940 audio_adc_reg1
.reg_addr
= adc_adr
;
941 /* Read the higher bits of data */
943 ret
= sst_sc_reg_access(&audio_adc_reg1
, PMIC_READ
, 1);
946 pr_debug("adc read value %x", audio_adc_reg1
.value
);
948 /* Shift bits to accomodate the lower two data bits */
949 adc_val
= (audio_adc_reg1
.value
<< 2);
951 audio_adc_reg2
. reg_addr
= adc_adr
;
952 ret
= sst_sc_reg_access(&audio_adc_reg2
, PMIC_READ
, 1);
955 pr_debug("adc read value %x", audio_adc_reg2
.value
);
957 /* Adding lower two bits to the higher bits */
958 audio_adc_reg2
.value
&= 03;
959 adc_val
+= audio_adc_reg2
.value
;
961 pr_debug("ADC value 0x%x", adc_val
);
962 msic_disable_mic_bias();
966 static void msic_pmic_irq_cb(void *cb_data
, u8 intsts
)
968 struct mad_jack
*mjack
= NULL
;
969 unsigned int present
= 0, jack_event_flag
= 0, buttonpressflag
= 0;
970 struct snd_intelmad
*intelmaddata
= cb_data
;
973 pr_debug("value returned = 0x%x\n", intsts
);
975 if (snd_msic_ops
.card_status
== SND_CARD_UN_INIT
) {
976 retval
= msic_init_card();
981 mjack
= &intelmaddata
->jack
[0];
983 pr_debug("MAD short_push detected\n");
984 present
= SND_JACK_BTN_0
;
985 jack_event_flag
= buttonpressflag
= 1;
986 mjack
->jack
.type
= SND_JACK_BTN_0
;
987 mjack
->jack
.key
[0] = BTN_0
;
991 pr_debug(":MAD long_push detected\n");
992 jack_event_flag
= buttonpressflag
= 1;
993 mjack
->jack
.type
= present
= SND_JACK_BTN_1
;
994 mjack
->jack
.key
[1] = BTN_1
;
998 unsigned int mic_bias
;
1000 buttonpressflag
= 0;
1001 mic_bias
= msic_get_mic_bias(intelmaddata
);
1002 pr_debug("mic_bias = %d\n", mic_bias
);
1003 mic_bias
= msic_convert_adc_to_mvolt(mic_bias
);
1004 pr_debug("mic_bias after conversion = %d mV\n", mic_bias
);
1005 mjack
->jack_dev_state
= msic_get_headset_state(mic_bias
);
1006 mjack
->jack
.type
= present
= mjack
->jack_dev_state
;
1010 mjack
->jack
.type
= mjack
->jack_dev_state
;
1012 jack_event_flag
= 1;
1013 buttonpressflag
= 0;
1014 msic_disable_jack_btn();
1015 msic_disable_mic_bias();
1017 if (jack_event_flag
)
1018 sst_mad_send_jack_report(&mjack
->jack
,
1019 buttonpressflag
, present
);
1024 struct snd_pmic_ops snd_msic_ops
= {
1025 .set_input_dev
= msic_set_selected_input_dev
,
1026 .set_output_dev
= msic_set_selected_output_dev
,
1027 .set_lineout_dev
= msic_set_selected_lineout_dev
,
1028 .set_hw_dmic_route
= msic_set_hw_dmic_route
,
1029 .set_mute
= msic_set_mute
,
1030 .get_mute
= msic_get_mute
,
1031 .set_vol
= msic_set_vol
,
1032 .get_vol
= msic_get_vol
,
1033 .init_card
= msic_init_card
,
1034 .set_pcm_audio_params
= msic_set_pcm_audio_params
,
1035 .set_pcm_voice_params
= msic_set_pcm_voice_params
,
1036 .set_voice_port
= msic_set_voice_port
,
1037 .set_audio_port
= msic_set_audio_port
,
1038 .power_up_pmic_pb
= msic_power_up_pb
,
1039 .power_up_pmic_cp
= msic_power_up_cp
,
1040 .power_down_pmic_pb
= msic_power_down_pb
,
1041 .power_down_pmic_cp
= msic_power_down_cp
,
1042 .power_down_pmic
= msic_power_down
,
1043 .pmic_irq_cb
= msic_pmic_irq_cb
,
1044 .pmic_jack_enable
= msic_enable_mic_bias
,
1045 .pmic_get_mic_bias
= msic_get_mic_bias
,
1046 .pmic_set_headset_state
= msic_set_headset_state
,