sst: report correct jack event
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / staging / intel_sst / intelmid_v2_control.c
blob46ab55eb8097bfb5abb3fbab2b336371a6e27b31
1 /*
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/gpio.h>
32 #include <linux/pci.h>
33 #include <linux/delay.h>
34 #include <linux/file.h>
35 #include <sound/control.h>
36 #include "intel_sst.h"
37 #include "intelmid_snd_control.h"
38 #include "intelmid.h"
40 enum reg_v3 {
41 VAUDIOCNT = 0x51,
42 VOICEPORT1 = 0x100,
43 VOICEPORT2 = 0x101,
44 AUDIOPORT1 = 0x102,
45 AUDIOPORT2 = 0x103,
46 ADCSAMPLERATE = 0x104,
47 DMICCTRL1 = 0x105,
48 DMICCTRL2 = 0x106,
49 MICCTRL = 0x107,
50 MICSELVOL = 0x108,
51 LILSEL = 0x109,
52 LIRSEL = 0x10a,
53 VOICEVOL = 0x10b,
54 AUDIOLVOL = 0x10c,
55 AUDIORVOL = 0x10d,
56 LMUTE = 0x10e,
57 RMUTE = 0x10f,
58 POWERCTRL1 = 0x110,
59 POWERCTRL2 = 0x111,
60 DRVPOWERCTRL = 0x112,
61 VREFPLL = 0x113,
62 PCMBUFCTRL = 0x114,
63 SOFTMUTE = 0x115,
64 DTMFPATH = 0x116,
65 DTMFVOL = 0x117,
66 DTMFFREQ = 0x118,
67 DTMFHFREQ = 0x119,
68 DTMFLFREQ = 0x11a,
69 DTMFCTRL = 0x11b,
70 DTMFASON = 0x11c,
71 DTMFASOFF = 0x11d,
72 DTMFASINUM = 0x11e,
73 CLASSDVOL = 0x11f,
74 VOICEDACAVOL = 0x120,
75 AUDDACAVOL = 0x121,
76 LOMUTEVOL = 0x122,
77 HPLVOL = 0x123,
78 HPRVOL = 0x124,
79 MONOVOL = 0x125,
80 LINEOUTMIXVOL = 0x126,
81 EPMIXVOL = 0x127,
82 LINEOUTLSEL = 0x128,
83 LINEOUTRSEL = 0x129,
84 EPMIXOUTSEL = 0x12a,
85 HPLMIXSEL = 0x12b,
86 HPRMIXSEL = 0x12c,
87 LOANTIPOP = 0x12d,
88 AUXDBNC = 0x12f,
91 static void nc_set_amp_power(int power)
93 if (snd_pmic_ops_nc.gpio_amp)
94 gpio_set_value(snd_pmic_ops_nc.gpio_amp, power);
97 /****
98 * nc_init_card - initialize the sound card
100 * This initializes the audio paths to know values in case of this sound card
102 static int nc_init_card(void)
104 struct sc_reg_access sc_access[] = {
105 {VAUDIOCNT, 0x25, 0},
106 {VOICEPORT1, 0x00, 0},
107 {VOICEPORT2, 0x00, 0},
108 {AUDIOPORT1, 0x98, 0},
109 {AUDIOPORT2, 0x09, 0},
110 {AUDIOLVOL, 0x00, 0},
111 {AUDIORVOL, 0x00, 0},
112 {LMUTE, 0x03, 0},
113 {RMUTE, 0x03, 0},
114 {POWERCTRL1, 0x00, 0},
115 {POWERCTRL2, 0x00, 0},
116 {DRVPOWERCTRL, 0x00, 0},
117 {VREFPLL, 0x10, 0},
118 {HPLMIXSEL, 0xee, 0},
119 {HPRMIXSEL, 0xf6, 0},
120 {PCMBUFCTRL, 0x0, 0},
121 {VOICEVOL, 0x0e, 0},
122 {HPLVOL, 0x06, 0},
123 {HPRVOL, 0x06, 0},
124 {MICCTRL, 0x51, 0x00},
125 {ADCSAMPLERATE, 0x8B, 0x00},
126 {MICSELVOL, 0x5B, 0x00},
127 {LILSEL, 0x06, 0},
128 {LIRSEL, 0x46, 0},
129 {LOANTIPOP, 0x00, 0},
130 {DMICCTRL1, 0x40, 0},
131 {AUXDBNC, 0xff, 0},
133 snd_pmic_ops_nc.card_status = SND_CARD_INIT_DONE;
134 snd_pmic_ops_nc.master_mute = UNMUTE;
135 snd_pmic_ops_nc.mute_status = UNMUTE;
136 sst_sc_reg_access(sc_access, PMIC_WRITE, 27);
137 mutex_init(&snd_pmic_ops_nc.lock);
138 pr_debug("init complete!!\n");
139 return 0;
142 static int nc_enable_audiodac(int value)
144 struct sc_reg_access sc_access[3];
145 int mute_val = 0;
147 if (snd_pmic_ops_nc.mute_status == MUTE)
148 return 0;
150 if (((snd_pmic_ops_nc.output_dev_id == MONO_EARPIECE) ||
151 (snd_pmic_ops_nc.output_dev_id == INTERNAL_SPKR)) &&
152 (value == UNMUTE))
153 return 0;
154 if (value == UNMUTE) {
155 /* unmute the system, set the 7th bit to zero */
156 mute_val = 0x00;
157 } else {
158 /* MUTE:Set the seventh bit */
159 mute_val = 0x04;
162 sc_access[0].reg_addr = LMUTE;
163 sc_access[1].reg_addr = RMUTE;
164 sc_access[0].mask = sc_access[1].mask = MASK2;
165 sc_access[0].value = sc_access[1].value = mute_val;
167 if (snd_pmic_ops_nc.num_channel == 1)
168 sc_access[1].value = 0x04;
169 return sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 2);
173 static int nc_power_up_pb(unsigned int port)
175 struct sc_reg_access sc_access[7];
176 int retval = 0;
178 if (snd_pmic_ops_nc.card_status == SND_CARD_UN_INIT)
179 retval = nc_init_card();
180 if (retval)
181 return retval;
182 if (port == 0xFF)
183 return 0;
184 mutex_lock(&snd_pmic_ops_nc.lock);
185 nc_enable_audiodac(MUTE);
186 msleep(30);
188 pr_debug("powering up pb....\n");
190 sc_access[0].reg_addr = VAUDIOCNT;
191 sc_access[0].value = 0x27;
192 sc_access[0].mask = 0x27;
193 sc_access[1].reg_addr = VREFPLL;
194 if (port == 0) {
195 sc_access[1].value = 0x3A;
196 sc_access[1].mask = 0x3A;
197 } else if (port == 1) {
198 sc_access[1].value = 0x35;
199 sc_access[1].mask = 0x35;
201 retval = sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 2);
205 sc_access[0].reg_addr = POWERCTRL1;
206 if (port == 0) {
207 sc_access[0].value = 0x40;
208 sc_access[0].mask = 0x40;
209 } else if (port == 1) {
210 sc_access[0].value = 0x01;
211 sc_access[0].mask = 0x01;
213 sc_access[1].reg_addr = POWERCTRL2;
214 sc_access[1].value = 0x0C;
215 sc_access[1].mask = 0x0C;
217 sc_access[2].reg_addr = DRVPOWERCTRL;
218 sc_access[2].value = 0x86;
219 sc_access[2].mask = 0x86;
221 sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 3);
223 msleep(30);
225 snd_pmic_ops_nc.pb_on = 1;
228 * There is a mismatch between Playback Sources and the enumerated
229 * values of output sources. This mismatch causes ALSA upper to send
230 * Item 1 for Internal Speaker, but the expected enumeration is 2! For
231 * now, treat MONO_EARPIECE and INTERNAL_SPKR identically and power up
232 * the needed resources
234 if (snd_pmic_ops_nc.output_dev_id == MONO_EARPIECE ||
235 snd_pmic_ops_nc.output_dev_id == INTERNAL_SPKR)
236 nc_set_amp_power(1);
237 nc_enable_audiodac(UNMUTE);
238 mutex_unlock(&snd_pmic_ops_nc.lock);
239 return 0;
242 static int nc_power_up_cp(unsigned int port)
244 struct sc_reg_access sc_access[5];
245 int retval = 0;
248 if (snd_pmic_ops_nc.card_status == SND_CARD_UN_INIT)
249 retval = nc_init_card();
250 if (retval)
251 return retval;
254 pr_debug("powering up cp....\n");
256 if (port == 0xFF)
257 return 0;
258 sc_access[0].reg_addr = VAUDIOCNT;
259 sc_access[0].value = 0x27;
260 sc_access[0].mask = 0x27;
261 sc_access[1].reg_addr = VREFPLL;
262 if (port == 0) {
263 sc_access[1].value = 0x3E;
264 sc_access[1].mask = 0x3E;
265 } else if (port == 1) {
266 sc_access[1].value = 0x35;
267 sc_access[1].mask = 0x35;
270 retval = sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 2);
273 sc_access[0].reg_addr = POWERCTRL1;
274 if (port == 0) {
275 sc_access[0].value = 0xB4;
276 sc_access[0].mask = 0xB4;
277 } else if (port == 1) {
278 sc_access[0].value = 0xBF;
279 sc_access[0].mask = 0xBF;
281 sc_access[1].reg_addr = POWERCTRL2;
282 if (port == 0) {
283 sc_access[1].value = 0x0C;
284 sc_access[1].mask = 0x0C;
285 } else if (port == 1) {
286 sc_access[1].value = 0x02;
287 sc_access[1].mask = 0x02;
290 return sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 2);
294 static int nc_power_down(void)
296 int retval = 0;
297 struct sc_reg_access sc_access[5];
299 if (snd_pmic_ops_nc.card_status == SND_CARD_UN_INIT)
300 retval = nc_init_card();
301 if (retval)
302 return retval;
303 nc_enable_audiodac(MUTE);
306 pr_debug("powering dn nc_power_down ....\n");
308 if (snd_pmic_ops_nc.output_dev_id == MONO_EARPIECE ||
309 snd_pmic_ops_nc.output_dev_id == INTERNAL_SPKR)
310 nc_set_amp_power(0);
312 msleep(30);
314 sc_access[0].reg_addr = DRVPOWERCTRL;
315 sc_access[0].value = 0x00;
316 sc_access[0].mask = 0x00;
318 sst_sc_reg_access(sc_access, PMIC_WRITE, 1);
320 sc_access[0].reg_addr = POWERCTRL1;
321 sc_access[0].value = 0x00;
322 sc_access[0].mask = 0x00;
324 sc_access[1].reg_addr = POWERCTRL2;
325 sc_access[1].value = 0x00;
326 sc_access[1].mask = 0x00;
330 sst_sc_reg_access(sc_access, PMIC_WRITE, 2);
332 msleep(30);
333 sc_access[0].reg_addr = VREFPLL;
334 sc_access[0].value = 0x10;
335 sc_access[0].mask = 0x10;
337 sc_access[1].reg_addr = VAUDIOCNT;
338 sc_access[1].value = 0x25;
339 sc_access[1].mask = 0x25;
342 retval = sst_sc_reg_access(sc_access, PMIC_WRITE, 2);
344 msleep(30);
345 return nc_enable_audiodac(UNMUTE);
348 static int nc_power_down_pb(unsigned int device)
351 int retval = 0;
352 struct sc_reg_access sc_access[5];
354 if (snd_pmic_ops_nc.card_status == SND_CARD_UN_INIT)
355 retval = nc_init_card();
356 if (retval)
357 return retval;
359 pr_debug("powering dn pb....\n");
360 mutex_lock(&snd_pmic_ops_nc.lock);
361 nc_enable_audiodac(MUTE);
364 msleep(30);
367 sc_access[0].reg_addr = DRVPOWERCTRL;
368 sc_access[0].value = 0x00;
369 sc_access[0].mask = 0x00;
371 sst_sc_reg_access(sc_access, PMIC_WRITE, 1);
373 msleep(30);
375 sc_access[0].reg_addr = POWERCTRL1;
376 sc_access[0].value = 0x00;
377 sc_access[0].mask = 0x41;
379 sc_access[1].reg_addr = POWERCTRL2;
380 sc_access[1].value = 0x00;
381 sc_access[1].mask = 0x0C;
383 sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 2);
385 msleep(30);
387 snd_pmic_ops_nc.pb_on = 0;
389 nc_enable_audiodac(UNMUTE);
390 mutex_unlock(&snd_pmic_ops_nc.lock);
391 return 0;
394 static int nc_power_down_cp(unsigned int device)
396 struct sc_reg_access sc_access[] = {
397 {POWERCTRL1, 0x00, 0xBE},
398 {POWERCTRL2, 0x00, 0x02},
400 int retval = 0;
402 if (snd_pmic_ops_nc.card_status == SND_CARD_UN_INIT)
403 retval = nc_init_card();
404 if (retval)
405 return retval;
407 pr_debug("powering dn cp....\n");
408 return sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 1);
411 static int nc_set_pcm_voice_params(void)
413 struct sc_reg_access sc_access[] = {
414 {0x100, 0xD5, 0},
415 {0x101, 0x08, 0},
416 {0x104, 0x03, 0},
417 {0x107, 0x10, 0},
418 {0x10B, 0x0E, 0},
419 {0x10E, 0x03, 0},
420 {0x10F, 0x03, 0},
421 {0x114, 0x13, 0},
422 {0x115, 0x00, 0},
423 {0x128, 0xFE, 0},
424 {0x129, 0xFE, 0},
425 {0x12A, 0xFE, 0},
426 {0x12B, 0xDE, 0},
427 {0x12C, 0xDE, 0},
429 int retval = 0;
431 if (snd_pmic_ops_nc.card_status == SND_CARD_UN_INIT)
432 retval = nc_init_card();
433 if (retval)
434 return retval;
436 sst_sc_reg_access(sc_access, PMIC_WRITE, 14);
437 pr_debug("Voice parameters set successfully!!\n");
438 return 0;
442 static int nc_set_pcm_audio_params(int sfreq, int word_size, int num_channel)
444 int config2 = 0;
445 struct sc_reg_access sc_access;
446 int retval = 0;
448 if (snd_pmic_ops_nc.card_status == SND_CARD_UN_INIT)
449 retval = nc_init_card();
450 if (retval)
451 return retval;
453 switch (sfreq) {
454 case 8000:
455 config2 = 0x00;
456 break;
457 case 11025:
458 config2 = 0x01;
459 break;
460 case 12000:
461 config2 = 0x02;
462 break;
463 case 16000:
464 config2 = 0x03;
465 break;
466 case 22050:
467 config2 = 0x04;
468 break;
469 case 24000:
470 config2 = 0x05;
471 break;
472 case 32000:
473 config2 = 0x07;
474 break;
475 case 44100:
476 config2 = 0x08;
477 break;
478 case 48000:
479 config2 = 0x09;
480 break;
483 snd_pmic_ops_nc.num_channel = num_channel;
484 if (snd_pmic_ops_nc.num_channel == 1) {
486 sc_access.value = 0x07;
487 sc_access.reg_addr = RMUTE;
488 pr_debug("RIGHT_HP_MUTE value%d\n", sc_access.value);
489 sc_access.mask = MASK2;
490 sst_sc_reg_access(&sc_access, PMIC_READ_MODIFY, 1);
491 } else {
492 sc_access.value = 0x00;
493 sc_access.reg_addr = RMUTE;
494 pr_debug("RIGHT_HP_MUTE value %d\n", sc_access.value);
495 sc_access.mask = MASK2;
496 sst_sc_reg_access(&sc_access, PMIC_READ_MODIFY, 1);
501 pr_debug("word_size = %d\n", word_size);
503 if (word_size == 24) {
504 sc_access.reg_addr = AUDIOPORT2;
505 sc_access.value = config2 | 0x10;
506 sc_access.mask = 0x1F;
507 } else {
508 sc_access.value = config2;
509 sc_access.mask = 0x1F;
510 sc_access.reg_addr = AUDIOPORT2;
512 sst_sc_reg_access(&sc_access, PMIC_READ_MODIFY, 1);
514 pr_debug("word_size = %d\n", word_size);
515 sc_access.reg_addr = AUDIOPORT1;
516 sc_access.mask = MASK5|MASK4|MASK1|MASK0;
517 if (word_size == 16)
518 sc_access.value = 0x98;
519 else if (word_size == 24)
520 sc_access.value = 0xAB;
522 return sst_sc_reg_access(&sc_access, PMIC_READ_MODIFY, 1);
528 static int nc_set_selected_output_dev(u8 value)
530 struct sc_reg_access sc_access_HP[] = {
531 {LMUTE, 0x02, 0x06},
532 {RMUTE, 0x02, 0x06},
533 {DRVPOWERCTRL, 0x06, 0x06},
535 struct sc_reg_access sc_access_IS[] = {
536 {LMUTE, 0x04, 0x06},
537 {RMUTE, 0x04, 0x06},
538 {DRVPOWERCTRL, 0x00, 0x06},
540 int retval = 0;
542 snd_pmic_ops_nc.output_dev_id = value;
543 if (snd_pmic_ops_nc.card_status == SND_CARD_UN_INIT)
544 retval = nc_init_card();
545 if (retval)
546 return retval;
547 pr_debug("nc set selected output:%d\n", value);
548 mutex_lock(&snd_pmic_ops_nc.lock);
549 switch (value) {
550 case STEREO_HEADPHONE:
551 if (snd_pmic_ops_nc.pb_on)
552 sst_sc_reg_access(sc_access_HP+2, PMIC_WRITE, 1);
553 retval = sst_sc_reg_access(sc_access_HP, PMIC_WRITE, 2);
554 nc_set_amp_power(0);
555 break;
556 case MONO_EARPIECE:
557 case INTERNAL_SPKR:
558 retval = sst_sc_reg_access(sc_access_IS, PMIC_WRITE, 3);
559 if (snd_pmic_ops_nc.pb_on)
560 nc_set_amp_power(1);
561 break;
562 default:
563 pr_err("rcvd illegal request: %d\n", value);
564 mutex_unlock(&snd_pmic_ops_nc.lock);
565 return -EINVAL;
567 mutex_unlock(&snd_pmic_ops_nc.lock);
568 return retval;
571 static int nc_audio_init(void)
573 struct sc_reg_access sc_acces, sc_access[] = {
574 {0x100, 0x00, 0},
575 {0x101, 0x00, 0},
576 {0x104, 0x8B, 0},
577 {0x107, 0x11, 0},
578 {0x10B, 0x0E, 0},
579 {0x114, 0x00, 0},
580 {0x115, 0x00, 0},
581 {0x128, 0x00, 0},
582 {0x129, 0x00, 0},
583 {0x12A, 0x00, 0},
584 {0x12B, 0xee, 0},
585 {0x12C, 0xf6, 0},
588 sst_sc_reg_access(sc_access, PMIC_WRITE, 12);
589 pr_debug("Audio Init successfully!!\n");
591 /*set output device */
592 nc_set_selected_output_dev(snd_pmic_ops_nc.output_dev_id);
594 if (snd_pmic_ops_nc.num_channel == 1) {
595 sc_acces.value = 0x07;
596 sc_acces.reg_addr = RMUTE;
597 pr_debug("RIGHT_HP_MUTE value%d\n", sc_acces.value);
598 sc_acces.mask = MASK2;
599 sst_sc_reg_access(&sc_acces, PMIC_READ_MODIFY, 1);
600 } else {
601 sc_acces.value = 0x00;
602 sc_acces.reg_addr = RMUTE;
603 pr_debug("RIGHT_HP_MUTE value%d\n", sc_acces.value);
604 sc_acces.mask = MASK2;
605 sst_sc_reg_access(&sc_acces, PMIC_READ_MODIFY, 1);
608 return 0;
611 static int nc_set_audio_port(int status)
613 struct sc_reg_access sc_access[2] = {{0,},};
614 int retval = 0;
616 if (snd_pmic_ops_nc.card_status == SND_CARD_UN_INIT)
617 retval = nc_init_card();
618 if (retval)
619 return retval;
621 if (status == DEACTIVATE) {
622 /* Deactivate audio port-tristate and power */
623 sc_access[0].value = 0x00;
624 sc_access[0].mask = MASK4|MASK5;
625 sc_access[0].reg_addr = AUDIOPORT1;
626 return sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 1);
627 } else if (status == ACTIVATE) {
628 /* activate audio port */
629 nc_audio_init();
630 sc_access[0].value = 0x10;
631 sc_access[0].mask = MASK4|MASK5 ;
632 sc_access[0].reg_addr = AUDIOPORT1;
633 return sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 1);
634 } else
635 return -EINVAL;
639 static int nc_set_voice_port(int status)
641 struct sc_reg_access sc_access[2] = {{0,},};
642 int retval = 0;
644 if (snd_pmic_ops_nc.card_status == SND_CARD_UN_INIT)
645 retval = nc_init_card();
646 if (retval)
647 return retval;
649 if (status == DEACTIVATE) {
650 /* Activate Voice port */
651 sc_access[0].value = 0x00;
652 sc_access[0].mask = MASK4;
653 sc_access[0].reg_addr = VOICEPORT1;
654 return sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 1);
655 } else if (status == ACTIVATE) {
656 /* Deactivate voice port */
657 nc_set_pcm_voice_params();
658 sc_access[0].value = 0x10;
659 sc_access[0].mask = MASK4;
660 sc_access[0].reg_addr = VOICEPORT1;
661 return sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 1);
662 } else
663 return -EINVAL;
666 static int nc_set_mute(int dev_id, u8 value)
668 struct sc_reg_access sc_access[3];
669 u8 mute_val, cap_mute;
670 int retval = 0;
672 if (snd_pmic_ops_nc.card_status == SND_CARD_UN_INIT)
673 retval = nc_init_card();
674 if (retval)
675 return retval;
677 pr_debug("set device id::%d, value %d\n", dev_id, value);
679 switch (dev_id) {
680 case PMIC_SND_MUTE_ALL:
681 pr_debug("PMIC_SND_MUTE_ALL value %d\n", value);
682 snd_pmic_ops_nc.mute_status = value;
683 snd_pmic_ops_nc.master_mute = value;
684 if (value == UNMUTE) {
685 /* unmute the system, set the 7th bit to zero */
686 mute_val = cap_mute = 0x00;
687 } else {
688 /* MUTE:Set the seventh bit */
689 mute_val = 0x80;
690 cap_mute = 0x40;
692 sc_access[0].reg_addr = AUDIOLVOL;
693 sc_access[1].reg_addr = AUDIORVOL;
694 sc_access[0].mask = sc_access[1].mask = MASK7;
695 sc_access[0].value = sc_access[1].value = mute_val;
696 if (snd_pmic_ops_nc.num_channel == 1)
697 sc_access[1].value = 0x80;
698 if (!sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 2)) {
699 sc_access[0].reg_addr = 0x109;
700 sc_access[1].reg_addr = 0x10a;
701 sc_access[2].reg_addr = 0x105;
702 sc_access[0].mask = sc_access[1].mask =
703 sc_access[2].mask = MASK6;
704 sc_access[0].value = sc_access[1].value =
705 sc_access[2].value = cap_mute;
707 if ((snd_pmic_ops_nc.input_dev_id == AMIC) ||
708 (snd_pmic_ops_nc.input_dev_id == DMIC))
709 sc_access[1].value = 0x40;
710 if (snd_pmic_ops_nc.input_dev_id == HS_MIC)
711 sc_access[0].value = 0x40;
712 retval = sst_sc_reg_access(sc_access,
713 PMIC_READ_MODIFY, 3);
715 break;
716 case PMIC_SND_HP_MIC_MUTE:
717 pr_debug("PMIC_SND_HPMIC_MUTE value %d\n", value);
718 if (value == UNMUTE) {
719 /* unmute the system, set the 6th bit to one */
720 sc_access[0].value = 0x00;
721 } else {
722 /* mute the system, reset the 6th bit to zero */
723 sc_access[0].value = 0x40;
725 sc_access[0].reg_addr = LIRSEL;
726 sc_access[0].mask = MASK6;
727 retval = sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 1);
728 break;
729 case PMIC_SND_AMIC_MUTE:
730 pr_debug("PMIC_SND_AMIC_MUTE value %d\n", value);
731 if (value == UNMUTE) {
732 /* unmute the system, set the 6th bit to one */
733 sc_access[0].value = 0x00;
734 } else {
735 /* mute the system, reset the 6th bit to zero */
736 sc_access[0].value = 0x40;
738 sc_access[0].reg_addr = LILSEL;
739 sc_access[0].mask = MASK6;
740 retval = sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 1);
741 break;
743 case PMIC_SND_DMIC_MUTE:
744 pr_debug("INPUT_MUTE_DMIC value%d\n", value);
745 if (value == UNMUTE) {
746 /* unmute the system, set the 6th bit to one */
747 sc_access[1].value = 0x00;
748 sc_access[0].value = 0x00;
749 } else {
750 /* mute the system, reset the 6th bit to zero */
751 sc_access[1].value = 0x40;
752 sc_access[0].value = 0x40;
754 sc_access[0].reg_addr = DMICCTRL1;
755 sc_access[0].mask = MASK6;
756 sc_access[1].reg_addr = LILSEL;
757 sc_access[1].mask = MASK6;
758 retval = sst_sc_reg_access(sc_access,
759 PMIC_READ_MODIFY, 2);
760 break;
762 case PMIC_SND_LEFT_HP_MUTE:
763 case PMIC_SND_RIGHT_HP_MUTE:
764 snd_pmic_ops_nc.mute_status = value;
765 if (value == UNMUTE)
766 sc_access[0].value = 0x0;
767 else
768 sc_access[0].value = 0x04;
770 if (dev_id == PMIC_SND_LEFT_HP_MUTE) {
771 sc_access[0].reg_addr = LMUTE;
772 pr_debug("LEFT_HP_MUTE value %d\n",
773 sc_access[0].value);
774 } else {
775 if (snd_pmic_ops_nc.num_channel == 1)
776 sc_access[0].value = 0x04;
777 sc_access[0].reg_addr = RMUTE;
778 pr_debug("RIGHT_HP_MUTE value %d\n",
779 sc_access[0].value);
781 sc_access[0].mask = MASK2;
782 retval = sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 1);
783 break;
784 case PMIC_SND_LEFT_SPEAKER_MUTE:
785 case PMIC_SND_RIGHT_SPEAKER_MUTE:
786 if (value == UNMUTE)
787 sc_access[0].value = 0x00;
788 else
789 sc_access[0].value = 0x03;
790 sc_access[0].reg_addr = LMUTE;
791 pr_debug("SPEAKER_MUTE %d\n", sc_access[0].value);
792 sc_access[0].mask = MASK1;
793 retval = sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, 1);
794 break;
795 default:
796 return -EINVAL;
798 return retval ;
802 static int nc_set_vol(int dev_id, int value)
804 struct sc_reg_access sc_access[3];
805 int retval = 0, entries = 0;
807 if (snd_pmic_ops_nc.card_status == SND_CARD_UN_INIT)
808 retval = nc_init_card();
809 if (retval)
810 return retval;
812 pr_debug("set volume:%d\n", dev_id);
813 switch (dev_id) {
814 case PMIC_SND_CAPTURE_VOL:
815 pr_debug("PMIC_SND_CAPTURE_VOL:value::%d\n", value);
816 sc_access[0].value = sc_access[1].value =
817 sc_access[2].value = -value;
818 sc_access[0].mask = sc_access[1].mask = sc_access[2].mask =
819 (MASK0|MASK1|MASK2|MASK3|MASK4|MASK5);
820 sc_access[0].reg_addr = 0x10a;
821 sc_access[1].reg_addr = 0x109;
822 sc_access[2].reg_addr = 0x105;
823 entries = 3;
824 break;
826 case PMIC_SND_LEFT_PB_VOL:
827 pr_debug("PMIC_SND_LEFT_HP_VOL %d\n", value);
828 sc_access[0].value = -value;
829 sc_access[0].reg_addr = HPLVOL;
830 sc_access[0].mask = (MASK0|MASK1|MASK2|MASK3|MASK4);
831 entries = 1;
832 break;
834 case PMIC_SND_RIGHT_PB_VOL:
835 pr_debug("PMIC_SND_RIGHT_HP_VOL value %d\n", value);
836 if (snd_pmic_ops_nc.num_channel == 1) {
837 sc_access[0].value = 0x04;
838 sc_access[0].reg_addr = RMUTE;
839 sc_access[0].mask = MASK2;
840 } else {
841 sc_access[0].value = -value;
842 sc_access[0].reg_addr = HPRVOL;
843 sc_access[0].mask = (MASK0|MASK1|MASK2|MASK3|MASK4);
845 entries = 1;
846 break;
848 case PMIC_SND_LEFT_MASTER_VOL:
849 pr_debug("PMIC_SND_LEFT_MASTER_VOL value %d\n", value);
850 sc_access[0].value = -value;
851 sc_access[0].reg_addr = AUDIOLVOL;
852 sc_access[0].mask =
853 (MASK0|MASK1|MASK2|MASK3|MASK4|MASK5|MASK6);
854 entries = 1;
855 break;
857 case PMIC_SND_RIGHT_MASTER_VOL:
858 pr_debug("PMIC_SND_RIGHT_MASTER_VOL value %d\n", value);
859 sc_access[0].value = -value;
860 sc_access[0].reg_addr = AUDIORVOL;
861 sc_access[0].mask =
862 (MASK0|MASK1|MASK2|MASK3|MASK4|MASK5|MASK6);
863 entries = 1;
864 break;
866 default:
867 return -EINVAL;
870 return sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, entries);
873 static int nc_set_selected_input_dev(u8 value)
875 struct sc_reg_access sc_access[6];
876 u8 num_val;
877 int retval = 0;
879 if (snd_pmic_ops_nc.card_status == SND_CARD_UN_INIT)
880 retval = nc_init_card();
881 if (retval)
882 return retval;
883 snd_pmic_ops_nc.input_dev_id = value;
885 pr_debug("nc set selected input:%d\n", value);
887 switch (value) {
888 case AMIC:
889 pr_debug("Selecting AMIC\n");
890 sc_access[0].reg_addr = 0x107;
891 sc_access[0].value = 0x40;
892 sc_access[0].mask = MASK6|MASK3|MASK1|MASK0;
893 sc_access[1].reg_addr = 0x10a;
894 sc_access[1].value = 0x40;
895 sc_access[1].mask = MASK6;
896 sc_access[2].reg_addr = 0x109;
897 sc_access[2].value = 0x00;
898 sc_access[2].mask = MASK6;
899 sc_access[3].reg_addr = 0x105;
900 sc_access[3].value = 0x40;
901 sc_access[3].mask = MASK6;
902 num_val = 4;
903 break;
905 case HS_MIC:
906 pr_debug("Selecting HS_MIC\n");
907 sc_access[0].reg_addr = MICCTRL;
908 sc_access[0].mask = MASK6|MASK3|MASK1|MASK0;
909 sc_access[0].value = 0x00;
910 sc_access[1].reg_addr = 0x109;
911 sc_access[1].mask = MASK6;
912 sc_access[1].value = 0x40;
913 sc_access[2].reg_addr = 0x10a;
914 sc_access[2].mask = MASK6;
915 sc_access[2].value = 0x00;
916 sc_access[3].reg_addr = 0x105;
917 sc_access[3].value = 0x40;
918 sc_access[3].mask = MASK6;
919 sc_access[4].reg_addr = ADCSAMPLERATE;
920 sc_access[4].mask = MASK7|MASK6|MASK5|MASK4|MASK3;
921 sc_access[4].value = 0xc8;
922 num_val = 5;
923 break;
925 case DMIC:
926 pr_debug("DMIC\n");
927 sc_access[0].reg_addr = MICCTRL;
928 sc_access[0].mask = MASK6|MASK3|MASK1|MASK0;
929 sc_access[0].value = 0x0B;
930 sc_access[1].reg_addr = 0x105;
931 sc_access[1].value = 0x80;
932 sc_access[1].mask = MASK7|MASK6;
933 sc_access[2].reg_addr = 0x10a;
934 sc_access[2].value = 0x40;
935 sc_access[2].mask = MASK6;
936 sc_access[3].reg_addr = LILSEL;
937 sc_access[3].mask = MASK6;
938 sc_access[3].value = 0x00;
939 sc_access[4].reg_addr = ADCSAMPLERATE;
940 sc_access[4].mask = MASK7|MASK6|MASK5|MASK4|MASK3;
941 sc_access[4].value = 0x33;
942 num_val = 5;
943 break;
944 default:
945 return -EINVAL;
947 return sst_sc_reg_access(sc_access, PMIC_READ_MODIFY, num_val);
950 static int nc_get_mute(int dev_id, u8 *value)
952 int retval = 0, mask = 0;
953 struct sc_reg_access sc_access = {0,};
955 if (snd_pmic_ops_nc.card_status == SND_CARD_UN_INIT)
956 retval = nc_init_card();
957 if (retval)
958 return retval;
960 pr_debug("get mute::%d\n", dev_id);
962 switch (dev_id) {
963 case PMIC_SND_AMIC_MUTE:
964 pr_debug("PMIC_SND_INPUT_MUTE_MIC1\n");
965 sc_access.reg_addr = LILSEL;
966 mask = MASK6;
967 break;
968 case PMIC_SND_HP_MIC_MUTE:
969 pr_debug("PMIC_SND_INPUT_MUTE_MIC2\n");
970 sc_access.reg_addr = LIRSEL;
971 mask = MASK6;
972 break;
973 case PMIC_SND_LEFT_HP_MUTE:
974 case PMIC_SND_RIGHT_HP_MUTE:
975 mask = MASK2;
976 pr_debug("PMIC_SN_LEFT/RIGHT_HP_MUTE\n");
977 if (dev_id == PMIC_SND_RIGHT_HP_MUTE)
978 sc_access.reg_addr = RMUTE;
979 else
980 sc_access.reg_addr = LMUTE;
981 break;
983 case PMIC_SND_LEFT_SPEAKER_MUTE:
984 pr_debug("PMIC_MONO_EARPIECE_MUTE\n");
985 sc_access.reg_addr = RMUTE;
986 mask = MASK1;
987 break;
988 case PMIC_SND_DMIC_MUTE:
989 pr_debug("PMIC_SND_INPUT_MUTE_DMIC\n");
990 sc_access.reg_addr = 0x105;
991 mask = MASK6;
992 break;
993 default:
994 return -EINVAL;
997 retval = sst_sc_reg_access(&sc_access, PMIC_READ, 1);
998 pr_debug("reg value = %d\n", sc_access.value);
999 if (retval)
1000 return retval;
1001 *value = (sc_access.value) & mask;
1002 pr_debug("masked value = %d\n", *value);
1003 if (*value)
1004 *value = 0;
1005 else
1006 *value = 1;
1007 pr_debug("value returned = 0x%x\n", *value);
1008 return retval;
1011 static int nc_get_vol(int dev_id, int *value)
1013 int retval = 0, mask = 0;
1014 struct sc_reg_access sc_access = {0,};
1016 if (snd_pmic_ops_nc.card_status == SND_CARD_UN_INIT)
1017 retval = nc_init_card();
1018 if (retval)
1019 return retval;
1021 switch (dev_id) {
1022 case PMIC_SND_CAPTURE_VOL:
1023 pr_debug("PMIC_SND_INPUT_CAPTURE_VOL\n");
1024 sc_access.reg_addr = LILSEL;
1025 mask = (MASK0|MASK1|MASK2|MASK3|MASK4|MASK5);
1026 break;
1028 case PMIC_SND_LEFT_MASTER_VOL:
1029 pr_debug("GET_VOLUME_PMIC_LEFT_MASTER_VOL\n");
1030 sc_access.reg_addr = AUDIOLVOL;
1031 mask = (MASK0|MASK1|MASK2|MASK3|MASK4|MASK5|MASK6);
1032 break;
1034 case PMIC_SND_RIGHT_MASTER_VOL:
1035 pr_debug("GET_VOLUME_PMIC_RIGHT_MASTER_VOL\n");
1036 sc_access.reg_addr = AUDIORVOL;
1037 mask = (MASK0|MASK1|MASK2|MASK3|MASK4|MASK5|MASK6);
1038 break;
1040 case PMIC_SND_RIGHT_PB_VOL:
1041 pr_debug("GET_VOLUME_PMIC_RIGHT_HP_VOL\n");
1042 sc_access.reg_addr = HPRVOL;
1043 mask = (MASK0|MASK1|MASK2|MASK3|MASK4);
1044 break;
1046 case PMIC_SND_LEFT_PB_VOL:
1047 pr_debug("GET_VOLUME_PMIC_LEFT_HP_VOL\n");
1048 sc_access.reg_addr = HPLVOL;
1049 mask = (MASK0|MASK1|MASK2|MASK3|MASK4);
1050 break;
1052 default:
1053 return -EINVAL;
1056 retval = sst_sc_reg_access(&sc_access, PMIC_READ, 1);
1057 pr_debug("value read = 0x%x\n", sc_access.value);
1058 *value = -((sc_access.value) & mask);
1059 pr_debug("get vol value returned = %d\n", *value);
1060 return retval;
1063 static void hp_automute(enum snd_jack_types type, int present)
1065 u8 in = DMIC;
1066 u8 out = INTERNAL_SPKR;
1067 if (present) {
1068 if (type == SND_JACK_HEADSET)
1069 in = HS_MIC;
1070 out = STEREO_HEADPHONE;
1072 nc_set_selected_input_dev(in);
1073 nc_set_selected_output_dev(out);
1076 static void nc_pmic_irq_cb(void *cb_data, u8 intsts)
1078 u8 value = 0;
1079 struct mad_jack *mjack = NULL;
1080 unsigned int present = 0, jack_event_flag = 0, buttonpressflag = 0;
1081 struct snd_intelmad *intelmaddata = cb_data;
1082 struct sc_reg_access sc_access_read = {0,};
1084 sc_access_read.reg_addr = 0x132;
1085 sst_sc_reg_access(&sc_access_read, PMIC_READ, 1);
1086 value = (sc_access_read.value);
1087 pr_debug("value returned = 0x%x\n", value);
1089 mjack = &intelmaddata->jack[0];
1090 if (intsts & 0x1) {
1091 pr_debug("SST DBG:MAD headset detected\n");
1092 /* send headset detect/undetect */
1093 present = (value == 0x1) ? 3 : 0;
1094 jack_event_flag = 1;
1095 mjack->jack.type = SND_JACK_HEADSET;
1096 hp_automute(SND_JACK_HEADSET, present);
1099 if (intsts & 0x2) {
1100 pr_debug(":MAD headphone detected\n");
1101 /* send headphone detect/undetect */
1102 present = (value == 0x2) ? 1 : 0;
1103 jack_event_flag = 1;
1104 mjack->jack.type = SND_JACK_HEADPHONE;
1105 hp_automute(SND_JACK_HEADPHONE, present);
1108 if (intsts & 0x4) {
1109 pr_debug("MAD short push detected\n");
1110 /* send short push */
1111 present = 1;
1112 jack_event_flag = 1;
1113 buttonpressflag = 1;
1114 mjack->jack.type = MID_JACK_HS_SHORT_PRESS;
1117 if (intsts & 0x8) {
1118 pr_debug(":MAD long push detected\n");
1119 /* send long push */
1120 present = 1;
1121 jack_event_flag = 1;
1122 buttonpressflag = 1;
1123 mjack->jack.type = MID_JACK_HS_LONG_PRESS;
1126 if (jack_event_flag)
1127 sst_mad_send_jack_report(&mjack->jack,
1128 buttonpressflag, present);
1130 static int nc_jack_enable(void)
1132 return 0;
1135 struct snd_pmic_ops snd_pmic_ops_nc = {
1136 .input_dev_id = DMIC,
1137 .output_dev_id = INTERNAL_SPKR,
1138 .set_input_dev = nc_set_selected_input_dev,
1139 .set_output_dev = nc_set_selected_output_dev,
1140 .set_mute = nc_set_mute,
1141 .get_mute = nc_get_mute,
1142 .set_vol = nc_set_vol,
1143 .get_vol = nc_get_vol,
1144 .init_card = nc_init_card,
1145 .set_pcm_audio_params = nc_set_pcm_audio_params,
1146 .set_pcm_voice_params = nc_set_pcm_voice_params,
1147 .set_voice_port = nc_set_voice_port,
1148 .set_audio_port = nc_set_audio_port,
1149 .power_up_pmic_pb = nc_power_up_pb,
1150 .power_up_pmic_cp = nc_power_up_cp,
1151 .power_down_pmic_pb = nc_power_down_pb,
1152 .power_down_pmic_cp = nc_power_down_cp,
1153 .power_down_pmic = nc_power_down,
1154 .pmic_irq_cb = nc_pmic_irq_cb,
1155 .pmic_jack_enable = nc_jack_enable,