2 * intelmid_v2_control.c - Intel Sound card driver for MID
4 * Copyright (C) 2008-10 Intel Corp
5 * Authors: Vinod Koul <vinod.koul@intel.com>
6 * Harsha Priya <priya.harsha@intel.com>
7 * KP Jeeja <jeeja.kp@intel.com>
8 * Dharageswari R <dharageswari.r@intel.com>
9 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; version 2 of the License.
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details.
20 * You should have received a copy of the GNU General Public License along
21 * with this program; if not, write to the Free Software Foundation, Inc.,
22 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
24 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
26 * This file contains the control operations of vendor 3
29 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
31 #include <linux/pci.h>
32 #include <linux/file.h>
33 #include "intel_sst.h"
34 #include "intelmid_snd_control.h"
42 ADCSAMPLERATE
= 0x104,
76 LINEOUTMIXVOL
= 0x126,
87 * nc_init_card - initilize the sound card
89 * This initilizes the audio paths to know values in case of this sound card
91 static int nc_init_card(void)
93 struct sc_reg_access sc_access
[] = {
95 {VOICEPORT1
, 0x00, 0},
96 {VOICEPORT2
, 0x00, 0},
97 {AUDIOPORT1
, 0x98, 0},
98 {AUDIOPORT2
, 0x09, 0},
100 {AUDIORVOL
, 0x00, 0},
103 {POWERCTRL1
, 0x00, 0},
104 {POWERCTRL2
, 0x00, 0},
105 {DRVPOWERCTRL
, 0x00, 0},
107 {HPLMIXSEL
, 0xee, 0},
108 {HPRMIXSEL
, 0xf6, 0},
109 {PCMBUFCTRL
, 0x0, 0},
113 {MICCTRL
, 0x41, 0x00},
114 {ADCSAMPLERATE
, 0x8B, 0x00},
115 {MICSELVOL
, 0x5B, 0x00},
118 {LOANTIPOP
, 0x00, 0},
119 {DMICCTRL1
, 0x40, 0},
121 snd_pmic_ops_nc
.card_status
= SND_CARD_INIT_DONE
;
122 snd_pmic_ops_nc
.master_mute
= UNMUTE
;
123 snd_pmic_ops_nc
.mute_status
= UNMUTE
;
124 sst_sc_reg_access(sc_access
, PMIC_WRITE
, 26);
125 pr_debug("init complete!!\n");
129 static int nc_enable_audiodac(int value
)
131 struct sc_reg_access sc_access
[3];
134 if (snd_pmic_ops_nc
.mute_status
== MUTE
)
137 if (((snd_pmic_ops_nc
.output_dev_id
== MONO_EARPIECE
) ||
138 (snd_pmic_ops_nc
.output_dev_id
== INTERNAL_SPKR
)) &&
141 if (value
== UNMUTE
) {
142 /* unmute the system, set the 7th bit to zero */
145 /* MUTE:Set the seventh bit */
149 sc_access
[0].reg_addr
= LMUTE
;
150 sc_access
[1].reg_addr
= RMUTE
;
151 sc_access
[0].mask
= sc_access
[1].mask
= MASK2
;
152 sc_access
[0].value
= sc_access
[1].value
= mute_val
;
154 if (snd_pmic_ops_nc
.num_channel
== 1)
155 sc_access
[1].value
= 0x04;
156 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2);
160 static int nc_power_up_pb(unsigned int port
)
162 struct sc_reg_access sc_access
[7];
165 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
166 retval
= nc_init_card();
171 nc_enable_audiodac(MUTE
);
174 pr_debug("powering up pb....\n");
176 sc_access
[0].reg_addr
= VAUDIOCNT
;
177 sc_access
[0].value
= 0x27;
178 sc_access
[0].mask
= 0x27;
179 sc_access
[1].reg_addr
= VREFPLL
;
181 sc_access
[1].value
= 0x3A;
182 sc_access
[1].mask
= 0x3A;
183 } else if (port
== 1) {
184 sc_access
[1].value
= 0x35;
185 sc_access
[1].mask
= 0x35;
187 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2);
191 sc_access
[0].reg_addr
= POWERCTRL1
;
193 sc_access
[0].value
= 0x40;
194 sc_access
[0].mask
= 0x40;
195 } else if (port
== 1) {
196 sc_access
[0].value
= 0x01;
197 sc_access
[0].mask
= 0x01;
199 sc_access
[1].reg_addr
= POWERCTRL2
;
200 sc_access
[1].value
= 0x0C;
201 sc_access
[1].mask
= 0x0C;
203 sc_access
[2].reg_addr
= DRVPOWERCTRL
;
204 sc_access
[2].value
= 0x86;
205 sc_access
[2].mask
= 0x86;
207 sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 3);
211 return nc_enable_audiodac(UNMUTE
);
215 static int nc_power_up_cp(unsigned int port
)
217 struct sc_reg_access sc_access
[5];
221 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
222 retval
= nc_init_card();
227 pr_debug("powering up cp....\n");
231 sc_access
[0].reg_addr
= VAUDIOCNT
;
232 sc_access
[0].value
= 0x27;
233 sc_access
[0].mask
= 0x27;
234 sc_access
[1].reg_addr
= VREFPLL
;
236 sc_access
[1].value
= 0x3E;
237 sc_access
[1].mask
= 0x3E;
238 } else if (port
== 1) {
239 sc_access
[1].value
= 0x35;
240 sc_access
[1].mask
= 0x35;
243 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2);
246 sc_access
[0].reg_addr
= POWERCTRL1
;
248 sc_access
[0].value
= 0xB4;
249 sc_access
[0].mask
= 0xB4;
250 } else if (port
== 1) {
251 sc_access
[0].value
= 0xBF;
252 sc_access
[0].mask
= 0xBF;
254 sc_access
[1].reg_addr
= POWERCTRL2
;
256 sc_access
[1].value
= 0x0C;
257 sc_access
[1].mask
= 0x0C;
258 } else if (port
== 1) {
259 sc_access
[1].value
= 0x02;
260 sc_access
[1].mask
= 0x02;
263 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2);
267 static int nc_power_down(void)
270 struct sc_reg_access sc_access
[5];
273 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
274 retval
= nc_init_card();
277 nc_enable_audiodac(MUTE
);
280 pr_debug("powering dn nc_power_down ....\n");
284 sc_access
[0].reg_addr
= DRVPOWERCTRL
;
285 sc_access
[0].value
= 0x00;
286 sc_access
[0].mask
= 0x00;
288 sst_sc_reg_access(sc_access
, PMIC_WRITE
, 1);
290 sc_access
[0].reg_addr
= POWERCTRL1
;
291 sc_access
[0].value
= 0x00;
292 sc_access
[0].mask
= 0x00;
294 sc_access
[1].reg_addr
= POWERCTRL2
;
295 sc_access
[1].value
= 0x00;
296 sc_access
[1].mask
= 0x00;
300 sst_sc_reg_access(sc_access
, PMIC_WRITE
, 2);
303 sc_access
[0].reg_addr
= VREFPLL
;
304 sc_access
[0].value
= 0x10;
305 sc_access
[0].mask
= 0x10;
307 sc_access
[1].reg_addr
= VAUDIOCNT
;
308 sc_access
[1].value
= 0x25;
309 sc_access
[1].mask
= 0x25;
312 retval
= sst_sc_reg_access(sc_access
, PMIC_WRITE
, 2);
315 return nc_enable_audiodac(UNMUTE
);
318 static int nc_power_down_pb(void)
322 struct sc_reg_access sc_access
[5];
324 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
325 retval
= nc_init_card();
329 pr_debug("powering dn pb....\n");
331 nc_enable_audiodac(MUTE
);
337 sc_access
[0].reg_addr
= DRVPOWERCTRL
;
338 sc_access
[0].value
= 0x00;
339 sc_access
[0].mask
= 0x00;
341 sst_sc_reg_access(sc_access
, PMIC_WRITE
, 1);
345 sc_access
[0].reg_addr
= POWERCTRL1
;
346 sc_access
[0].value
= 0x00;
347 sc_access
[0].mask
= 0x41;
349 sc_access
[1].reg_addr
= POWERCTRL2
;
350 sc_access
[1].value
= 0x00;
351 sc_access
[1].mask
= 0x0C;
353 sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2);
357 return nc_enable_audiodac(UNMUTE
);
362 static int nc_power_down_cp(void)
364 struct sc_reg_access sc_access
[] = {
365 {POWERCTRL1
, 0x00, 0xBE},
366 {POWERCTRL2
, 0x00, 0x02},
370 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
371 retval
= nc_init_card();
375 pr_debug("powering dn cp....\n");
376 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
379 static int nc_set_pcm_voice_params(void)
381 struct sc_reg_access sc_access
[] = {
399 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
400 retval
= nc_init_card();
404 sst_sc_reg_access(sc_access
, PMIC_WRITE
, 14);
405 pr_debug("Voice parameters set successfully!!\n");
410 static int nc_set_pcm_audio_params(int sfreq
, int word_size
, int num_channel
)
413 struct sc_reg_access sc_access
;
416 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
417 retval
= nc_init_card();
451 snd_pmic_ops_nc
.num_channel
= num_channel
;
452 if (snd_pmic_ops_nc
.num_channel
== 1) {
454 sc_access
.value
= 0x07;
455 sc_access
.reg_addr
= RMUTE
;
456 pr_debug("RIGHT_HP_MUTE value%d\n", sc_access
.value
);
457 sc_access
.mask
= MASK2
;
458 sst_sc_reg_access(&sc_access
, PMIC_READ_MODIFY
, 1);
460 sc_access
.value
= 0x00;
461 sc_access
.reg_addr
= RMUTE
;
462 pr_debug("RIGHT_HP_MUTE value %d\n", sc_access
.value
);
463 sc_access
.mask
= MASK2
;
464 sst_sc_reg_access(&sc_access
, PMIC_READ_MODIFY
, 1);
469 pr_debug("word_size = %d\n", word_size
);
471 if (word_size
== 24) {
472 sc_access
.reg_addr
= AUDIOPORT2
;
473 sc_access
.value
= config2
| 0x10;
474 sc_access
.mask
= 0x1F;
476 sc_access
.value
= config2
;
477 sc_access
.mask
= 0x1F;
478 sc_access
.reg_addr
= AUDIOPORT2
;
480 sst_sc_reg_access(&sc_access
, PMIC_READ_MODIFY
, 1);
482 pr_debug("word_size = %d\n", word_size
);
483 sc_access
.reg_addr
= AUDIOPORT1
;
484 sc_access
.mask
= MASK5
|MASK4
|MASK1
|MASK0
;
486 sc_access
.value
= 0x98;
487 else if (word_size
== 24)
488 sc_access
.value
= 0xAB;
490 return sst_sc_reg_access(&sc_access
, PMIC_READ_MODIFY
, 1);
496 static int nc_set_selected_output_dev(u8 value
)
498 struct sc_reg_access sc_access_HP
[] = {
502 struct sc_reg_access sc_access_IS
[] = {
508 snd_pmic_ops_nc
.output_dev_id
= value
;
509 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
510 retval
= nc_init_card();
513 pr_debug("nc set selected output:%d\n", value
);
515 case STEREO_HEADPHONE
:
516 retval
= sst_sc_reg_access(sc_access_HP
, PMIC_WRITE
, 2);
519 retval
= sst_sc_reg_access(sc_access_IS
, PMIC_WRITE
, 2);
522 pr_err("rcvd illegal request: %d\n", value
);
528 static int nc_audio_init(void)
530 struct sc_reg_access sc_acces
, sc_access
[] = {
545 sst_sc_reg_access(sc_access
, PMIC_WRITE
, 12);
546 pr_debug("Audio Init successfully!!\n");
548 /*set output device */
549 nc_set_selected_output_dev(snd_pmic_ops_nc
.output_dev_id
);
551 if (snd_pmic_ops_nc
.num_channel
== 1) {
552 sc_acces
.value
= 0x07;
553 sc_acces
.reg_addr
= RMUTE
;
554 pr_debug("RIGHT_HP_MUTE value%d\n", sc_acces
.value
);
555 sc_acces
.mask
= MASK2
;
556 sst_sc_reg_access(&sc_acces
, PMIC_READ_MODIFY
, 1);
558 sc_acces
.value
= 0x00;
559 sc_acces
.reg_addr
= RMUTE
;
560 pr_debug("RIGHT_HP_MUTE value%d\n", sc_acces
.value
);
561 sc_acces
.mask
= MASK2
;
562 sst_sc_reg_access(&sc_acces
, PMIC_READ_MODIFY
, 1);
568 static int nc_set_audio_port(int status
)
570 struct sc_reg_access sc_access
[2] = {{0,},};
573 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
574 retval
= nc_init_card();
578 if (status
== DEACTIVATE
) {
579 /* Deactivate audio port-tristate and power */
580 sc_access
[0].value
= 0x00;
581 sc_access
[0].mask
= MASK4
|MASK5
;
582 sc_access
[0].reg_addr
= AUDIOPORT1
;
583 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
584 } else if (status
== ACTIVATE
) {
585 /* activate audio port */
587 sc_access
[0].value
= 0x10;
588 sc_access
[0].mask
= MASK4
|MASK5
;
589 sc_access
[0].reg_addr
= AUDIOPORT1
;
590 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
596 static int nc_set_voice_port(int status
)
598 struct sc_reg_access sc_access
[2] = {{0,},};
601 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
602 retval
= nc_init_card();
606 if (status
== DEACTIVATE
) {
607 /* Activate Voice port */
608 sc_access
[0].value
= 0x00;
609 sc_access
[0].mask
= MASK4
;
610 sc_access
[0].reg_addr
= VOICEPORT1
;
611 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
612 } else if (status
== ACTIVATE
) {
613 /* Deactivate voice port */
614 nc_set_pcm_voice_params();
615 sc_access
[0].value
= 0x10;
616 sc_access
[0].mask
= MASK4
;
617 sc_access
[0].reg_addr
= VOICEPORT1
;
618 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
623 static int nc_set_mute(int dev_id
, u8 value
)
625 struct sc_reg_access sc_access
[3];
626 u8 mute_val
, cap_mute
;
629 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
630 retval
= nc_init_card();
634 pr_debug("set device id::%d, value %d\n", dev_id
, value
);
637 case PMIC_SND_MUTE_ALL
:
638 pr_debug("PMIC_SND_MUTE_ALL value %d\n", value
);
639 snd_pmic_ops_nc
.mute_status
= value
;
640 snd_pmic_ops_nc
.master_mute
= value
;
641 if (value
== UNMUTE
) {
642 /* unmute the system, set the 7th bit to zero */
643 mute_val
= cap_mute
= 0x00;
645 /* MUTE:Set the seventh bit */
649 sc_access
[0].reg_addr
= AUDIOLVOL
;
650 sc_access
[1].reg_addr
= AUDIORVOL
;
651 sc_access
[0].mask
= sc_access
[1].mask
= MASK7
;
652 sc_access
[0].value
= sc_access
[1].value
= mute_val
;
653 if (snd_pmic_ops_nc
.num_channel
== 1)
654 sc_access
[1].value
= 0x80;
655 if (!sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2)) {
656 sc_access
[0].reg_addr
= 0x109;
657 sc_access
[1].reg_addr
= 0x10a;
658 sc_access
[2].reg_addr
= 0x105;
659 sc_access
[0].mask
= sc_access
[1].mask
=
660 sc_access
[2].mask
= MASK6
;
661 sc_access
[0].value
= sc_access
[1].value
=
662 sc_access
[2].value
= cap_mute
;
664 if ((snd_pmic_ops_nc
.input_dev_id
== AMIC
) ||
665 (snd_pmic_ops_nc
.input_dev_id
== DMIC
))
666 sc_access
[1].value
= 0x40;
667 if (snd_pmic_ops_nc
.input_dev_id
== HS_MIC
)
668 sc_access
[0].value
= 0x40;
669 retval
= sst_sc_reg_access(sc_access
,
670 PMIC_READ_MODIFY
, 3);
673 case PMIC_SND_HP_MIC_MUTE
:
674 pr_debug("PMIC_SND_HPMIC_MUTE value %d\n", value
);
675 if (value
== UNMUTE
) {
676 /* unmute the system, set the 6th bit to one */
677 sc_access
[0].value
= 0x00;
679 /* mute the system, reset the 6th bit to zero */
680 sc_access
[0].value
= 0x40;
682 sc_access
[0].reg_addr
= LIRSEL
;
683 sc_access
[0].mask
= MASK6
;
684 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
686 case PMIC_SND_AMIC_MUTE
:
687 pr_debug("PMIC_SND_AMIC_MUTE value %d\n", value
);
688 if (value
== UNMUTE
) {
689 /* unmute the system, set the 6th bit to one */
690 sc_access
[0].value
= 0x00;
692 /* mute the system, reset the 6th bit to zero */
693 sc_access
[0].value
= 0x40;
695 sc_access
[0].reg_addr
= LILSEL
;
696 sc_access
[0].mask
= MASK6
;
697 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
700 case PMIC_SND_DMIC_MUTE
:
701 pr_debug("INPUT_MUTE_DMIC value%d\n", value
);
702 if (value
== UNMUTE
) {
703 /* unmute the system, set the 6th bit to one */
704 sc_access
[1].value
= 0x00;
705 sc_access
[0].value
= 0x00;
707 /* mute the system, reset the 6th bit to zero */
708 sc_access
[1].value
= 0x40;
709 sc_access
[0].value
= 0x40;
711 sc_access
[0].reg_addr
= DMICCTRL1
;
712 sc_access
[0].mask
= MASK6
;
713 sc_access
[1].reg_addr
= LILSEL
;
714 sc_access
[1].mask
= MASK6
;
715 retval
= sst_sc_reg_access(sc_access
,
716 PMIC_READ_MODIFY
, 2);
719 case PMIC_SND_LEFT_HP_MUTE
:
720 case PMIC_SND_RIGHT_HP_MUTE
:
721 snd_pmic_ops_nc
.mute_status
= value
;
723 sc_access
[0].value
= 0x0;
725 sc_access
[0].value
= 0x04;
727 if (dev_id
== PMIC_SND_LEFT_HP_MUTE
) {
728 sc_access
[0].reg_addr
= LMUTE
;
729 pr_debug("LEFT_HP_MUTE value %d\n",
732 if (snd_pmic_ops_nc
.num_channel
== 1)
733 sc_access
[0].value
= 0x04;
734 sc_access
[0].reg_addr
= RMUTE
;
735 pr_debug("RIGHT_HP_MUTE value %d\n",
738 sc_access
[0].mask
= MASK2
;
739 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
741 case PMIC_SND_LEFT_SPEAKER_MUTE
:
742 case PMIC_SND_RIGHT_SPEAKER_MUTE
:
744 sc_access
[0].value
= 0x00;
746 sc_access
[0].value
= 0x03;
747 sc_access
[0].reg_addr
= LMUTE
;
748 pr_debug("SPEAKER_MUTE %d\n", sc_access
[0].value
);
749 sc_access
[0].mask
= MASK1
;
750 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
759 static int nc_set_vol(int dev_id
, int value
)
761 struct sc_reg_access sc_access
[3];
762 int retval
= 0, entries
= 0;
764 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
765 retval
= nc_init_card();
769 pr_debug("set volume:%d\n", dev_id
);
771 case PMIC_SND_CAPTURE_VOL
:
772 pr_debug("PMIC_SND_CAPTURE_VOL:value::%d\n", value
);
773 sc_access
[0].value
= sc_access
[1].value
=
774 sc_access
[2].value
= -value
;
775 sc_access
[0].mask
= sc_access
[1].mask
= sc_access
[2].mask
=
776 (MASK0
|MASK1
|MASK2
|MASK3
|MASK4
|MASK5
);
777 sc_access
[0].reg_addr
= 0x10a;
778 sc_access
[1].reg_addr
= 0x109;
779 sc_access
[2].reg_addr
= 0x105;
783 case PMIC_SND_LEFT_PB_VOL
:
784 pr_debug("PMIC_SND_LEFT_HP_VOL %d\n", value
);
785 sc_access
[0].value
= -value
;
786 sc_access
[0].reg_addr
= AUDIOLVOL
;
788 (MASK0
|MASK1
|MASK2
|MASK3
|MASK4
|MASK5
|MASK6
);
792 case PMIC_SND_RIGHT_PB_VOL
:
793 pr_debug("PMIC_SND_RIGHT_HP_VOL value %d\n", value
);
794 if (snd_pmic_ops_nc
.num_channel
== 1) {
795 sc_access
[0].value
= 0x04;
796 sc_access
[0].reg_addr
= RMUTE
;
797 sc_access
[0].mask
= MASK2
;
799 sc_access
[0].value
= -value
;
800 sc_access
[0].reg_addr
= AUDIORVOL
;
802 (MASK0
|MASK1
|MASK2
|MASK3
|MASK4
|MASK5
|MASK6
);
811 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, entries
);
814 static int nc_set_selected_input_dev(u8 value
)
816 struct sc_reg_access sc_access
[6];
820 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
821 retval
= nc_init_card();
824 snd_pmic_ops_nc
.input_dev_id
= value
;
826 pr_debug("nc set selected input:%d\n", value
);
830 pr_debug("Selecting AMIC\n");
831 sc_access
[0].reg_addr
= 0x107;
832 sc_access
[0].value
= 0x40;
833 sc_access
[0].mask
= MASK6
|MASK4
|MASK3
|MASK1
|MASK0
;
834 sc_access
[1].reg_addr
= 0x10a;
835 sc_access
[1].value
= 0x40;
836 sc_access
[1].mask
= MASK6
;
837 sc_access
[2].reg_addr
= 0x109;
838 sc_access
[2].value
= 0x00;
839 sc_access
[2].mask
= MASK6
;
840 sc_access
[3].reg_addr
= 0x105;
841 sc_access
[3].value
= 0x40;
842 sc_access
[3].mask
= MASK6
;
847 pr_debug("Selecting HS_MIC\n");
848 sc_access
[0].reg_addr
= 0x107;
849 sc_access
[0].mask
= MASK6
|MASK4
|MASK3
|MASK1
|MASK0
;
850 sc_access
[0].value
= 0x10;
851 sc_access
[1].reg_addr
= 0x109;
852 sc_access
[1].mask
= MASK6
;
853 sc_access
[1].value
= 0x40;
854 sc_access
[2].reg_addr
= 0x10a;
855 sc_access
[2].mask
= MASK6
;
856 sc_access
[2].value
= 0x00;
857 sc_access
[3].reg_addr
= 0x105;
858 sc_access
[3].value
= 0x40;
859 sc_access
[3].mask
= MASK6
;
865 sc_access
[0].reg_addr
= 0x107;
866 sc_access
[0].mask
= MASK6
|MASK4
|MASK3
|MASK1
|MASK0
;
867 sc_access
[0].value
= 0x0B;
868 sc_access
[1].reg_addr
= 0x105;
869 sc_access
[1].value
= 0x80;
870 sc_access
[1].mask
= MASK7
|MASK6
;
871 sc_access
[2].reg_addr
= 0x10a;
872 sc_access
[2].value
= 0x40;
873 sc_access
[2].mask
= MASK6
;
874 sc_access
[3].reg_addr
= 0x109;
875 sc_access
[3].mask
= MASK6
;
876 sc_access
[3].value
= 0x00;
882 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, num_val
);
885 static int nc_get_mute(int dev_id
, u8
*value
)
887 int retval
= 0, mask
= 0;
888 struct sc_reg_access sc_access
= {0,};
890 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
891 retval
= nc_init_card();
895 pr_debug("get mute::%d\n", dev_id
);
898 case PMIC_SND_AMIC_MUTE
:
899 pr_debug("PMIC_SND_INPUT_MUTE_MIC1\n");
900 sc_access
.reg_addr
= LILSEL
;
903 case PMIC_SND_HP_MIC_MUTE
:
904 pr_debug("PMIC_SND_INPUT_MUTE_MIC2\n");
905 sc_access
.reg_addr
= LIRSEL
;
908 case PMIC_SND_LEFT_HP_MUTE
:
909 case PMIC_SND_RIGHT_HP_MUTE
:
911 pr_debug("PMIC_SN_LEFT/RIGHT_HP_MUTE\n");
912 if (dev_id
== PMIC_SND_RIGHT_HP_MUTE
)
913 sc_access
.reg_addr
= RMUTE
;
915 sc_access
.reg_addr
= LMUTE
;
918 case PMIC_SND_LEFT_SPEAKER_MUTE
:
919 pr_debug("PMIC_MONO_EARPIECE_MUTE\n");
920 sc_access
.reg_addr
= RMUTE
;
923 case PMIC_SND_DMIC_MUTE
:
924 pr_debug("PMIC_SND_INPUT_MUTE_DMIC\n");
925 sc_access
.reg_addr
= 0x105;
932 retval
= sst_sc_reg_access(&sc_access
, PMIC_READ
, 1);
933 pr_debug("reg value = %d\n", sc_access
.value
);
936 *value
= (sc_access
.value
) & mask
;
937 pr_debug("masked value = %d\n", *value
);
942 pr_debug("value returned = 0x%x\n", *value
);
946 static int nc_get_vol(int dev_id
, int *value
)
948 int retval
= 0, mask
= 0;
949 struct sc_reg_access sc_access
= {0,};
951 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
952 retval
= nc_init_card();
957 case PMIC_SND_CAPTURE_VOL
:
958 pr_debug("PMIC_SND_INPUT_CAPTURE_VOL\n");
959 sc_access
.reg_addr
= LILSEL
;
960 mask
= (MASK0
|MASK1
|MASK2
|MASK3
|MASK4
|MASK5
);
963 case PMIC_SND_RIGHT_PB_VOL
:
964 pr_debug("GET_VOLUME_PMIC_LEFT_HP_VOL\n");
965 sc_access
.reg_addr
= AUDIOLVOL
;
966 mask
= (MASK0
|MASK1
|MASK2
|MASK3
|MASK4
|MASK5
|MASK6
);
969 case PMIC_SND_LEFT_PB_VOL
:
970 pr_debug("GET_VOLUME_PMIC_RIGHT_HP_VOL\n");
971 sc_access
.reg_addr
= AUDIORVOL
;
972 mask
= (MASK0
|MASK1
|MASK2
|MASK3
|MASK4
|MASK5
|MASK6
);
979 retval
= sst_sc_reg_access(&sc_access
, PMIC_READ
, 1);
980 pr_debug("value read = 0x%x\n", sc_access
.value
);
981 *value
= -((sc_access
.value
) & mask
);
982 pr_debug("get vol value returned = %d\n", *value
);
986 struct snd_pmic_ops snd_pmic_ops_nc
= {
987 .set_input_dev
= nc_set_selected_input_dev
,
988 .set_output_dev
= nc_set_selected_output_dev
,
989 .set_mute
= nc_set_mute
,
990 .get_mute
= nc_get_mute
,
991 .set_vol
= nc_set_vol
,
992 .get_vol
= nc_get_vol
,
993 .init_card
= nc_init_card
,
994 .set_pcm_audio_params
= nc_set_pcm_audio_params
,
995 .set_pcm_voice_params
= nc_set_pcm_voice_params
,
996 .set_voice_port
= nc_set_voice_port
,
997 .set_audio_port
= nc_set_audio_port
,
998 .power_up_pmic_pb
= nc_power_up_pb
,
999 .power_up_pmic_cp
= nc_power_up_cp
,
1000 .power_down_pmic_pb
= nc_power_down_pb
,
1001 .power_down_pmic_cp
= nc_power_down_cp
,
1002 .power_down_pmic
= nc_power_down
,