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,