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 #include <linux/pci.h>
30 #include <linux/file.h>
31 #include "intel_sst.h"
32 #include "intelmid_snd_control.h"
40 ADCSAMPLERATE
= 0x104,
74 LINEOUTMIXVOL
= 0x126,
85 * nc_init_card - initilize the sound card
87 * This initilizes the audio paths to know values in case of this sound card
89 static int nc_init_card(void)
91 struct sc_reg_access sc_access
[] = {
93 {VOICEPORT1
, 0x00, 0},
94 {VOICEPORT2
, 0x00, 0},
95 {AUDIOPORT1
, 0x98, 0},
96 {AUDIOPORT2
, 0x09, 0},
101 {POWERCTRL1
, 0x00, 0},
102 {POWERCTRL2
, 0x00, 0},
103 {DRVPOWERCTRL
, 0x00, 0},
105 {HPLMIXSEL
, 0xee, 0},
106 {HPRMIXSEL
, 0xf6, 0},
107 {PCMBUFCTRL
, 0x0, 0},
111 {MICCTRL
, 0x41, 0x00},
112 {ADCSAMPLERATE
, 0x8B, 0x00},
113 {MICSELVOL
, 0x5B, 0x00},
116 {LOANTIPOP
, 0x00, 0},
117 {DMICCTRL1
, 0x40, 0},
119 snd_pmic_ops_nc
.card_status
= SND_CARD_INIT_DONE
;
120 snd_pmic_ops_nc
.master_mute
= UNMUTE
;
121 snd_pmic_ops_nc
.mute_status
= UNMUTE
;
122 sst_sc_reg_access(sc_access
, PMIC_WRITE
, 26);
123 pr_debug("sst: init complete!!\n");
127 static int nc_enable_audiodac(int value
)
129 struct sc_reg_access sc_access
[3];
132 if (snd_pmic_ops_nc
.mute_status
== MUTE
)
135 if (((snd_pmic_ops_nc
.output_dev_id
== MONO_EARPIECE
) ||
136 (snd_pmic_ops_nc
.output_dev_id
== INTERNAL_SPKR
)) &&
139 if (value
== UNMUTE
) {
140 /* unmute the system, set the 7th bit to zero */
143 /* MUTE:Set the seventh bit */
147 sc_access
[0].reg_addr
= LMUTE
;
148 sc_access
[1].reg_addr
= RMUTE
;
149 sc_access
[0].mask
= sc_access
[1].mask
= MASK2
;
150 sc_access
[0].value
= sc_access
[1].value
= mute_val
;
152 if (snd_pmic_ops_nc
.num_channel
== 1)
153 sc_access
[1].value
= 0x04;
154 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2);
158 static int nc_power_up_pb(unsigned int port
)
160 struct sc_reg_access sc_access
[7];
163 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
164 retval
= nc_init_card();
169 nc_enable_audiodac(MUTE
);
172 pr_debug("sst: powering up pb....\n");
174 sc_access
[0].reg_addr
= VAUDIOCNT
;
175 sc_access
[0].value
= 0x27;
176 sc_access
[0].mask
= 0x27;
177 sc_access
[1].reg_addr
= VREFPLL
;
179 sc_access
[1].value
= 0x3A;
180 sc_access
[1].mask
= 0x3A;
181 } else if (port
== 1) {
182 sc_access
[1].value
= 0x35;
183 sc_access
[1].mask
= 0x35;
185 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2);
189 sc_access
[0].reg_addr
= POWERCTRL1
;
191 sc_access
[0].value
= 0x40;
192 sc_access
[0].mask
= 0x40;
193 } else if (port
== 1) {
194 sc_access
[0].value
= 0x01;
195 sc_access
[0].mask
= 0x01;
197 sc_access
[1].reg_addr
= POWERCTRL2
;
198 sc_access
[1].value
= 0x0C;
199 sc_access
[1].mask
= 0x0C;
201 sc_access
[2].reg_addr
= DRVPOWERCTRL
;
202 sc_access
[2].value
= 0x86;
203 sc_access
[2].mask
= 0x86;
205 sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 3);
209 return nc_enable_audiodac(UNMUTE
);
213 static int nc_power_up_cp(unsigned int port
)
215 struct sc_reg_access sc_access
[5];
219 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
220 retval
= nc_init_card();
225 pr_debug("sst: powering up cp....\n");
229 sc_access
[0].reg_addr
= VAUDIOCNT
;
230 sc_access
[0].value
= 0x27;
231 sc_access
[0].mask
= 0x27;
232 sc_access
[1].reg_addr
= VREFPLL
;
234 sc_access
[1].value
= 0x3E;
235 sc_access
[1].mask
= 0x3E;
236 } else if (port
== 1) {
237 sc_access
[1].value
= 0x35;
238 sc_access
[1].mask
= 0x35;
241 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2);
244 sc_access
[0].reg_addr
= POWERCTRL1
;
246 sc_access
[0].value
= 0xB4;
247 sc_access
[0].mask
= 0xB4;
248 } else if (port
== 1) {
249 sc_access
[0].value
= 0xBF;
250 sc_access
[0].mask
= 0xBF;
252 sc_access
[1].reg_addr
= POWERCTRL2
;
254 sc_access
[1].value
= 0x0C;
255 sc_access
[1].mask
= 0x0C;
256 } else if (port
== 1) {
257 sc_access
[1].value
= 0x02;
258 sc_access
[1].mask
= 0x02;
261 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2);
265 static int nc_power_down(void)
268 struct sc_reg_access sc_access
[5];
271 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
272 retval
= nc_init_card();
275 nc_enable_audiodac(MUTE
);
278 pr_debug("sst: powering dn nc_power_down ....\n");
282 sc_access
[0].reg_addr
= DRVPOWERCTRL
;
283 sc_access
[0].value
= 0x00;
284 sc_access
[0].mask
= 0x00;
286 sst_sc_reg_access(sc_access
, PMIC_WRITE
, 1);
288 sc_access
[0].reg_addr
= POWERCTRL1
;
289 sc_access
[0].value
= 0x00;
290 sc_access
[0].mask
= 0x00;
292 sc_access
[1].reg_addr
= POWERCTRL2
;
293 sc_access
[1].value
= 0x00;
294 sc_access
[1].mask
= 0x00;
298 sst_sc_reg_access(sc_access
, PMIC_WRITE
, 2);
301 sc_access
[0].reg_addr
= VREFPLL
;
302 sc_access
[0].value
= 0x10;
303 sc_access
[0].mask
= 0x10;
305 sc_access
[1].reg_addr
= VAUDIOCNT
;
306 sc_access
[1].value
= 0x25;
307 sc_access
[1].mask
= 0x25;
310 retval
= sst_sc_reg_access(sc_access
, PMIC_WRITE
, 2);
313 return nc_enable_audiodac(UNMUTE
);
316 static int nc_power_down_pb(void)
320 struct sc_reg_access sc_access
[5];
322 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
323 retval
= nc_init_card();
327 pr_debug("sst: powering dn pb....\n");
329 nc_enable_audiodac(MUTE
);
335 sc_access
[0].reg_addr
= DRVPOWERCTRL
;
336 sc_access
[0].value
= 0x00;
337 sc_access
[0].mask
= 0x00;
339 sst_sc_reg_access(sc_access
, PMIC_WRITE
, 1);
343 sc_access
[0].reg_addr
= POWERCTRL1
;
344 sc_access
[0].value
= 0x00;
345 sc_access
[0].mask
= 0x41;
347 sc_access
[1].reg_addr
= POWERCTRL2
;
348 sc_access
[1].value
= 0x00;
349 sc_access
[1].mask
= 0x0C;
351 sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2);
355 return nc_enable_audiodac(UNMUTE
);
360 static int nc_power_down_cp(void)
362 struct sc_reg_access sc_access
[] = {
363 {POWERCTRL1
, 0x00, 0xBE},
364 {POWERCTRL2
, 0x00, 0x02},
368 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
369 retval
= nc_init_card();
373 pr_debug("sst: powering dn cp....\n");
374 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
377 static int nc_set_pcm_voice_params(void)
379 struct sc_reg_access sc_access
[] = {
397 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
398 retval
= nc_init_card();
402 sst_sc_reg_access(sc_access
, PMIC_WRITE
, 14);
403 pr_debug("sst: Voice parameters set successfully!!\n");
408 static int nc_set_pcm_audio_params(int sfreq
, int word_size
, int num_channel
)
411 struct sc_reg_access sc_access
;
414 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
415 retval
= nc_init_card();
449 snd_pmic_ops_nc
.num_channel
= num_channel
;
450 if (snd_pmic_ops_nc
.num_channel
== 1) {
452 sc_access
.value
= 0x07;
453 sc_access
.reg_addr
= RMUTE
;
454 pr_debug("sst: RIGHT_HP_MUTE value%d\n", sc_access
.value
);
455 sc_access
.mask
= MASK2
;
456 sst_sc_reg_access(&sc_access
, PMIC_READ_MODIFY
, 1);
458 sc_access
.value
= 0x00;
459 sc_access
.reg_addr
= RMUTE
;
460 pr_debug("sst: RIGHT_HP_MUTE value %d\n", sc_access
.value
);
461 sc_access
.mask
= MASK2
;
462 sst_sc_reg_access(&sc_access
, PMIC_READ_MODIFY
, 1);
467 pr_debug("sst: word_size = %d\n", word_size
);
469 if (word_size
== 24) {
470 sc_access
.reg_addr
= AUDIOPORT2
;
471 sc_access
.value
= config2
| 0x10;
472 sc_access
.mask
= 0x1F;
474 sc_access
.value
= config2
;
475 sc_access
.mask
= 0x1F;
476 sc_access
.reg_addr
= AUDIOPORT2
;
478 sst_sc_reg_access(&sc_access
, PMIC_READ_MODIFY
, 1);
480 pr_debug("sst: word_size = %d\n", word_size
);
481 sc_access
.reg_addr
= AUDIOPORT1
;
482 sc_access
.mask
= MASK5
|MASK4
|MASK1
|MASK0
;
484 sc_access
.value
= 0x98;
485 else if (word_size
== 24)
486 sc_access
.value
= 0xAB;
488 return sst_sc_reg_access(&sc_access
, PMIC_READ_MODIFY
, 1);
494 static int nc_set_selected_output_dev(u8 value
)
496 struct sc_reg_access sc_access_HP
[] = {
500 struct sc_reg_access sc_access_IS
[] = {
506 snd_pmic_ops_nc
.output_dev_id
= value
;
507 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
508 retval
= nc_init_card();
511 pr_debug("sst: nc set selected output:%d\n", value
);
513 case STEREO_HEADPHONE
:
514 retval
= sst_sc_reg_access(sc_access_HP
, PMIC_WRITE
, 2);
517 retval
= sst_sc_reg_access(sc_access_IS
, PMIC_WRITE
, 2);
520 pr_err("sst: rcvd illegal request: %d\n", value
);
526 static int nc_audio_init(void)
528 struct sc_reg_access sc_acces
, sc_access
[] = {
543 sst_sc_reg_access(sc_access
, PMIC_WRITE
, 12);
544 pr_debug("sst: Audio Init successfully!!\n");
546 /*set output device */
547 nc_set_selected_output_dev(snd_pmic_ops_nc
.output_dev_id
);
549 if (snd_pmic_ops_nc
.num_channel
== 1) {
550 sc_acces
.value
= 0x07;
551 sc_acces
.reg_addr
= RMUTE
;
552 pr_debug("sst: RIGHT_HP_MUTE value%d\n", sc_acces
.value
);
553 sc_acces
.mask
= MASK2
;
554 sst_sc_reg_access(&sc_acces
, PMIC_READ_MODIFY
, 1);
556 sc_acces
.value
= 0x00;
557 sc_acces
.reg_addr
= RMUTE
;
558 pr_debug("sst: RIGHT_HP_MUTE value%d\n", sc_acces
.value
);
559 sc_acces
.mask
= MASK2
;
560 sst_sc_reg_access(&sc_acces
, PMIC_READ_MODIFY
, 1);
566 static int nc_set_audio_port(int status
)
568 struct sc_reg_access sc_access
[2] = {{0,},};
571 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
572 retval
= nc_init_card();
576 if (status
== DEACTIVATE
) {
577 /* Deactivate audio port-tristate and power */
578 sc_access
[0].value
= 0x00;
579 sc_access
[0].mask
= MASK4
|MASK5
;
580 sc_access
[0].reg_addr
= AUDIOPORT1
;
581 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
582 } else if (status
== ACTIVATE
) {
583 /* activate audio port */
585 sc_access
[0].value
= 0x10;
586 sc_access
[0].mask
= MASK4
|MASK5
;
587 sc_access
[0].reg_addr
= AUDIOPORT1
;
588 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
594 static int nc_set_voice_port(int status
)
596 struct sc_reg_access sc_access
[2] = {{0,},};
599 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
600 retval
= nc_init_card();
604 if (status
== DEACTIVATE
) {
605 /* Activate Voice port */
606 sc_access
[0].value
= 0x00;
607 sc_access
[0].mask
= MASK4
;
608 sc_access
[0].reg_addr
= VOICEPORT1
;
609 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
610 } else if (status
== ACTIVATE
) {
611 /* Deactivate voice port */
612 nc_set_pcm_voice_params();
613 sc_access
[0].value
= 0x10;
614 sc_access
[0].mask
= MASK4
;
615 sc_access
[0].reg_addr
= VOICEPORT1
;
616 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
621 static int nc_set_mute(int dev_id
, u8 value
)
623 struct sc_reg_access sc_access
[3];
624 u8 mute_val
, cap_mute
;
627 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
628 retval
= nc_init_card();
632 pr_debug("sst: set device id::%d, value %d\n", dev_id
, value
);
635 case PMIC_SND_MUTE_ALL
:
636 pr_debug("sst: PMIC_SND_MUTE_ALL value %d\n", value
);
637 snd_pmic_ops_nc
.mute_status
= value
;
638 snd_pmic_ops_nc
.master_mute
= value
;
639 if (value
== UNMUTE
) {
640 /* unmute the system, set the 7th bit to zero */
641 mute_val
= cap_mute
= 0x00;
643 /* MUTE:Set the seventh bit */
647 sc_access
[0].reg_addr
= AUDIOLVOL
;
648 sc_access
[1].reg_addr
= AUDIORVOL
;
649 sc_access
[0].mask
= sc_access
[1].mask
= MASK7
;
650 sc_access
[0].value
= sc_access
[1].value
= mute_val
;
651 if (snd_pmic_ops_nc
.num_channel
== 1)
652 sc_access
[1].value
= 0x80;
653 if (!sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2)) {
654 sc_access
[0].reg_addr
= 0x109;
655 sc_access
[1].reg_addr
= 0x10a;
656 sc_access
[2].reg_addr
= 0x105;
657 sc_access
[0].mask
= sc_access
[1].mask
=
658 sc_access
[2].mask
= MASK6
;
659 sc_access
[0].value
= sc_access
[1].value
=
660 sc_access
[2].value
= cap_mute
;
662 if ((snd_pmic_ops_nc
.input_dev_id
== AMIC
) ||
663 (snd_pmic_ops_nc
.input_dev_id
== DMIC
))
664 sc_access
[1].value
= 0x40;
665 if (snd_pmic_ops_nc
.input_dev_id
== HS_MIC
)
666 sc_access
[0].value
= 0x40;
667 retval
= sst_sc_reg_access(sc_access
,
668 PMIC_READ_MODIFY
, 3);
671 case PMIC_SND_HP_MIC_MUTE
:
672 pr_debug("sst: PMIC_SND_HPMIC_MUTE value %d\n", value
);
673 if (value
== UNMUTE
) {
674 /* unmute the system, set the 6th bit to one */
675 sc_access
[0].value
= 0x00;
677 /* mute the system, reset the 6th bit to zero */
678 sc_access
[0].value
= 0x40;
680 sc_access
[0].reg_addr
= LIRSEL
;
681 sc_access
[0].mask
= MASK6
;
682 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
684 case PMIC_SND_AMIC_MUTE
:
685 pr_debug("sst: PMIC_SND_AMIC_MUTE value %d\n", value
);
686 if (value
== UNMUTE
) {
687 /* unmute the system, set the 6th bit to one */
688 sc_access
[0].value
= 0x00;
690 /* mute the system, reset the 6th bit to zero */
691 sc_access
[0].value
= 0x40;
693 sc_access
[0].reg_addr
= LILSEL
;
694 sc_access
[0].mask
= MASK6
;
695 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
698 case PMIC_SND_DMIC_MUTE
:
699 pr_debug("sst: INPUT_MUTE_DMIC value%d\n", value
);
700 if (value
== UNMUTE
) {
701 /* unmute the system, set the 6th bit to one */
702 sc_access
[1].value
= 0x00;
703 sc_access
[0].value
= 0x00;
705 /* mute the system, reset the 6th bit to zero */
706 sc_access
[1].value
= 0x40;
707 sc_access
[0].value
= 0x40;
709 sc_access
[0].reg_addr
= DMICCTRL1
;
710 sc_access
[0].mask
= MASK6
;
711 sc_access
[1].reg_addr
= LILSEL
;
712 sc_access
[1].mask
= MASK6
;
713 retval
= sst_sc_reg_access(sc_access
,
714 PMIC_READ_MODIFY
, 2);
717 case PMIC_SND_LEFT_HP_MUTE
:
718 case PMIC_SND_RIGHT_HP_MUTE
:
719 snd_pmic_ops_nc
.mute_status
= value
;
721 sc_access
[0].value
= 0x0;
723 sc_access
[0].value
= 0x04;
725 if (dev_id
== PMIC_SND_LEFT_HP_MUTE
) {
726 sc_access
[0].reg_addr
= LMUTE
;
727 pr_debug("sst: LEFT_HP_MUTE value %d\n",
730 if (snd_pmic_ops_nc
.num_channel
== 1)
731 sc_access
[0].value
= 0x04;
732 sc_access
[0].reg_addr
= RMUTE
;
733 pr_debug("sst: RIGHT_HP_MUTE value %d\n",
736 sc_access
[0].mask
= MASK2
;
737 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
739 case PMIC_SND_LEFT_SPEAKER_MUTE
:
740 case PMIC_SND_RIGHT_SPEAKER_MUTE
:
742 sc_access
[0].value
= 0x00;
744 sc_access
[0].value
= 0x03;
745 sc_access
[0].reg_addr
= LMUTE
;
746 pr_debug("sst: SPEAKER_MUTE %d\n", sc_access
[0].value
);
747 sc_access
[0].mask
= MASK1
;
748 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
757 static int nc_set_vol(int dev_id
, int value
)
759 struct sc_reg_access sc_access
[3];
760 int retval
= 0, entries
= 0;
762 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
763 retval
= nc_init_card();
767 pr_debug("sst: set volume:%d\n", dev_id
);
769 case PMIC_SND_CAPTURE_VOL
:
770 pr_debug("sst: PMIC_SND_CAPTURE_VOL:value::%d\n", value
);
771 sc_access
[0].value
= sc_access
[1].value
=
772 sc_access
[2].value
= -value
;
773 sc_access
[0].mask
= sc_access
[1].mask
= sc_access
[2].mask
=
774 (MASK0
|MASK1
|MASK2
|MASK3
|MASK4
|MASK5
);
775 sc_access
[0].reg_addr
= 0x10a;
776 sc_access
[1].reg_addr
= 0x109;
777 sc_access
[2].reg_addr
= 0x105;
781 case PMIC_SND_LEFT_PB_VOL
:
782 pr_debug("sst: PMIC_SND_LEFT_HP_VOL %d\n", value
);
783 sc_access
[0].value
= -value
;
784 sc_access
[0].reg_addr
= AUDIOLVOL
;
786 (MASK0
|MASK1
|MASK2
|MASK3
|MASK4
|MASK5
|MASK6
);
790 case PMIC_SND_RIGHT_PB_VOL
:
791 pr_debug("sst: PMIC_SND_RIGHT_HP_VOL value %d\n", value
);
792 if (snd_pmic_ops_nc
.num_channel
== 1) {
793 sc_access
[0].value
= 0x04;
794 sc_access
[0].reg_addr
= RMUTE
;
795 sc_access
[0].mask
= MASK2
;
797 sc_access
[0].value
= -value
;
798 sc_access
[0].reg_addr
= AUDIORVOL
;
800 (MASK0
|MASK1
|MASK2
|MASK3
|MASK4
|MASK5
|MASK6
);
809 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, entries
);
812 static int nc_set_selected_input_dev(u8 value
)
814 struct sc_reg_access sc_access
[6];
818 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
819 retval
= nc_init_card();
822 snd_pmic_ops_nc
.input_dev_id
= value
;
824 pr_debug("sst: nc set selected input:%d\n", value
);
828 pr_debug("sst: Selecting AMIC\n");
829 sc_access
[0].reg_addr
= 0x107;
830 sc_access
[0].value
= 0x40;
831 sc_access
[0].mask
= MASK6
|MASK4
|MASK3
|MASK1
|MASK0
;
832 sc_access
[1].reg_addr
= 0x10a;
833 sc_access
[1].value
= 0x40;
834 sc_access
[1].mask
= MASK6
;
835 sc_access
[2].reg_addr
= 0x109;
836 sc_access
[2].value
= 0x00;
837 sc_access
[2].mask
= MASK6
;
838 sc_access
[3].reg_addr
= 0x105;
839 sc_access
[3].value
= 0x40;
840 sc_access
[3].mask
= MASK6
;
845 pr_debug("sst: Selecting HS_MIC\n");
846 sc_access
[0].reg_addr
= 0x107;
847 sc_access
[0].mask
= MASK6
|MASK4
|MASK3
|MASK1
|MASK0
;
848 sc_access
[0].value
= 0x10;
849 sc_access
[1].reg_addr
= 0x109;
850 sc_access
[1].mask
= MASK6
;
851 sc_access
[1].value
= 0x40;
852 sc_access
[2].reg_addr
= 0x10a;
853 sc_access
[2].mask
= MASK6
;
854 sc_access
[2].value
= 0x00;
855 sc_access
[3].reg_addr
= 0x105;
856 sc_access
[3].value
= 0x40;
857 sc_access
[3].mask
= MASK6
;
862 pr_debug("sst: DMIC\n");
863 sc_access
[0].reg_addr
= 0x107;
864 sc_access
[0].mask
= MASK6
|MASK4
|MASK3
|MASK1
|MASK0
;
865 sc_access
[0].value
= 0x0B;
866 sc_access
[1].reg_addr
= 0x105;
867 sc_access
[1].value
= 0x80;
868 sc_access
[1].mask
= MASK7
|MASK6
;
869 sc_access
[2].reg_addr
= 0x10a;
870 sc_access
[2].value
= 0x40;
871 sc_access
[2].mask
= MASK6
;
872 sc_access
[3].reg_addr
= 0x109;
873 sc_access
[3].mask
= MASK6
;
874 sc_access
[3].value
= 0x40;
880 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, num_val
);
883 static int nc_get_mute(int dev_id
, u8
*value
)
885 int retval
= 0, mask
= 0;
886 struct sc_reg_access sc_access
= {0,};
888 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
889 retval
= nc_init_card();
893 pr_debug("sst: get mute::%d\n", dev_id
);
896 case PMIC_SND_AMIC_MUTE
:
897 pr_debug("sst: PMIC_SND_INPUT_MUTE_MIC1\n");
898 sc_access
.reg_addr
= LILSEL
;
901 case PMIC_SND_HP_MIC_MUTE
:
902 pr_debug("sst: PMIC_SND_INPUT_MUTE_MIC2\n");
903 sc_access
.reg_addr
= LIRSEL
;
906 case PMIC_SND_LEFT_HP_MUTE
:
907 case PMIC_SND_RIGHT_HP_MUTE
:
909 pr_debug("sst: PMIC_SN_LEFT/RIGHT_HP_MUTE\n");
910 if (dev_id
== PMIC_SND_RIGHT_HP_MUTE
)
911 sc_access
.reg_addr
= RMUTE
;
913 sc_access
.reg_addr
= LMUTE
;
916 case PMIC_SND_LEFT_SPEAKER_MUTE
:
917 pr_debug("sst: PMIC_MONO_EARPIECE_MUTE\n");
918 sc_access
.reg_addr
= RMUTE
;
921 case PMIC_SND_DMIC_MUTE
:
922 pr_debug("sst: PMIC_SND_INPUT_MUTE_DMIC\n");
923 sc_access
.reg_addr
= 0x105;
930 retval
= sst_sc_reg_access(&sc_access
, PMIC_READ
, 1);
931 pr_debug("sst: reg value = %d\n", sc_access
.value
);
934 *value
= (sc_access
.value
) & mask
;
935 pr_debug("sst: masked value = %d\n", *value
);
940 pr_debug("sst: value returned = 0x%x\n", *value
);
944 static int nc_get_vol(int dev_id
, int *value
)
946 int retval
= 0, mask
= 0;
947 struct sc_reg_access sc_access
= {0,};
949 if (snd_pmic_ops_nc
.card_status
== SND_CARD_UN_INIT
)
950 retval
= nc_init_card();
955 case PMIC_SND_CAPTURE_VOL
:
956 pr_debug("sst: PMIC_SND_INPUT_CAPTURE_VOL\n");
957 sc_access
.reg_addr
= LILSEL
;
958 mask
= (MASK0
|MASK1
|MASK2
|MASK3
|MASK4
|MASK5
);
961 case PMIC_SND_RIGHT_PB_VOL
:
962 pr_debug("sst: GET_VOLUME_PMIC_LEFT_HP_VOL\n");
963 sc_access
.reg_addr
= AUDIOLVOL
;
964 mask
= (MASK0
|MASK1
|MASK2
|MASK3
|MASK4
|MASK5
|MASK6
);
967 case PMIC_SND_LEFT_PB_VOL
:
968 pr_debug("sst: GET_VOLUME_PMIC_RIGHT_HP_VOL\n");
969 sc_access
.reg_addr
= AUDIORVOL
;
970 mask
= (MASK0
|MASK1
|MASK2
|MASK3
|MASK4
|MASK5
|MASK6
);
977 retval
= sst_sc_reg_access(&sc_access
, PMIC_READ
, 1);
978 pr_debug("sst: value read = 0x%x\n", sc_access
.value
);
979 *value
= -((sc_access
.value
) & mask
);
980 pr_debug("sst: get vol value returned = %d\n", *value
);
984 struct snd_pmic_ops snd_pmic_ops_nc
= {
985 .set_input_dev
= nc_set_selected_input_dev
,
986 .set_output_dev
= nc_set_selected_output_dev
,
987 .set_mute
= nc_set_mute
,
988 .get_mute
= nc_get_mute
,
989 .set_vol
= nc_set_vol
,
990 .get_vol
= nc_get_vol
,
991 .init_card
= nc_init_card
,
992 .set_pcm_audio_params
= nc_set_pcm_audio_params
,
993 .set_pcm_voice_params
= nc_set_pcm_voice_params
,
994 .set_voice_port
= nc_set_voice_port
,
995 .set_audio_port
= nc_set_audio_port
,
996 .power_up_pmic_pb
= nc_power_up_pb
,
997 .power_up_pmic_cp
= nc_power_up_cp
,
998 .power_down_pmic_pb
= nc_power_down_pb
,
999 .power_down_pmic_cp
= nc_power_down_cp
,
1000 .power_down_pmic
= nc_power_down
,