1 /* intel_sst_v1_control.c - Intel SST Driver for audio engine
3 * Copyright (C) 2008-10 Intel Corp
4 * Authors: Vinod Koul <vinod.koul@intel.com>
5 * Harsha Priya <priya.harsha@intel.com>
6 * Dharageswari R <dharageswari.r@intel.com>
7 * KP Jeeja <jeeja.kp@intel.com>
8 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; version 2 of the License.
14 * This program is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write to the Free Software Foundation, Inc.,
21 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
23 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25 * This file contains the control operations of vendor 2
28 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
30 #include <linux/pci.h>
31 #include <linux/delay.h>
32 #include <linux/file.h>
34 #include <sound/pcm.h>
35 #include <sound/pcm_params.h>
36 #include <sound/control.h>
37 #include <sound/initval.h>
38 #include "intel_sst.h"
39 #include "intel_sst_ioctl.h"
41 #include "intelmid_snd_control.h"
43 #include <linux/gpio.h>
44 #define KOSKI_VOICE_CODEC_ENABLE 46
48 MASTER_CLOCK_PRESCALAR
= 0x205,
49 SET_MASTER_AND_LR_CLK1
= 0x20b,
50 SET_MASTER_AND_LR_CLK2
= 0x20c,
51 MASTER_MODE_AND_DATA_DELAY
= 0x20d,
52 DIGITAL_INTERFACE_TO_DAI2
= 0x20e,
55 DAI2_TO_DAC_HP
= 0x210,
56 HP_OP_SINGLE_ENDED
= 0x224,
57 ENABLE_OPDEV_CTRL
= 0x226,
58 ENABLE_DEV_AND_USE_XTAL
= 0x227,
60 /* Max audio subsystem (PQ49) MAX 8921 */
61 AS_IP_MODE_CTL
= 0xF9,
62 AS_LEFT_SPKR_VOL_CTL
= 0xFA, /* Mono Earpiece volume control */
63 AS_RIGHT_SPKR_VOL_CTL
= 0xFB,
64 AS_LEFT_HP_VOL_CTL
= 0xFC,
65 AS_RIGHT_HP_VOL_CTL
= 0xFD,
69 /* Headphone volume control & mute registers */
75 * mx_init_card - initialize the sound card
77 * This initializes the audio paths to know values in case of this sound card
79 static int mx_init_card(void)
81 struct sc_reg_access sc_access
[] = {
130 snd_pmic_ops_mx
.card_status
= SND_CARD_INIT_DONE
;
131 snd_pmic_ops_mx
.num_channel
= 2;
132 snd_pmic_ops_mx
.master_mute
= UNMUTE
;
133 snd_pmic_ops_mx
.mute_status
= UNMUTE
;
134 return sst_sc_reg_access(sc_access
, PMIC_WRITE
, 47);
137 static int mx_enable_audiodac(int value
)
139 struct sc_reg_access sc_access
[3];
144 sc_access
[0].reg_addr
= AS_LEFT_HP_VOL_CTL
;
145 sc_access
[1].reg_addr
= AS_RIGHT_HP_VOL_CTL
;
147 if (value
== UNMUTE
) {
154 sc_access
[0].mask
= sc_access
[1].mask
= MASK0
|MASK1
|MASK2
|MASK3
|MASK4
;
155 sc_access
[0].value
= sc_access
[1].value
= (u8
)mute_val
;
156 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2);
159 pr_debug("mute status = %d\n", snd_pmic_ops_mx
.mute_status
);
160 if (snd_pmic_ops_mx
.mute_status
== MUTE
||
161 snd_pmic_ops_mx
.master_mute
== MUTE
)
164 sc_access
[0].reg_addr
= VOL_CTRL_LT
;
165 sc_access
[1].reg_addr
= VOL_CTRL_RT
;
166 sc_access
[0].mask
= sc_access
[1].mask
= MASK6
;
167 sc_access
[0].value
= sc_access
[1].value
= mute_val1
;
168 if (snd_pmic_ops_mx
.num_channel
== 1)
169 sc_access
[1].value
= 0x40;
170 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2);
173 static int mx_power_up_pb(unsigned int port
)
177 struct sc_reg_access sc_access
[3];
179 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
180 retval
= mx_init_card();
184 retval
= mx_enable_audiodac(MUTE
);
190 sc_access
[0].reg_addr
= AS_CONFIG
;
191 sc_access
[0].mask
= MASK7
;
192 sc_access
[0].value
= 0x80;
193 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
197 sc_access
[0].reg_addr
= ENABLE_OPDEV_CTRL
;
198 sc_access
[0].mask
= 0xff;
199 sc_access
[0].value
= 0x3C;
200 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
204 sc_access
[0].reg_addr
= ENABLE_DEV_AND_USE_XTAL
;
205 sc_access
[0].mask
= 0x80;
206 sc_access
[0].value
= 0x80;
207 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
211 return mx_enable_audiodac(UNMUTE
);
214 static int mx_power_down_pb(unsigned int device
)
216 struct sc_reg_access sc_access
[3];
219 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
220 retval
= mx_init_card();
225 retval
= mx_enable_audiodac(MUTE
);
229 sc_access
[0].reg_addr
= ENABLE_OPDEV_CTRL
;
230 sc_access
[0].mask
= MASK3
|MASK2
;
231 sc_access
[0].value
= 0x00;
233 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
237 return mx_enable_audiodac(UNMUTE
);
240 static int mx_power_up_cp(unsigned int port
)
243 struct sc_reg_access sc_access
[] = {
244 {ENABLE_DEV_AND_USE_XTAL
, 0x80, MASK7
},
245 {ENABLE_OPDEV_CTRL
, 0x3, 0x3},
248 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
249 retval
= mx_init_card();
254 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2);
257 static int mx_power_down_cp(unsigned int device
)
259 struct sc_reg_access sc_access
[] = {
260 {ENABLE_OPDEV_CTRL
, 0x00, MASK1
|MASK0
},
264 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
265 retval
= mx_init_card();
270 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
273 static int mx_power_down(void)
276 struct sc_reg_access sc_access
[3];
278 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
279 retval
= mx_init_card();
284 retval
= mx_enable_audiodac(MUTE
);
288 sc_access
[0].reg_addr
= AS_CONFIG
;
289 sc_access
[0].mask
= MASK7
;
290 sc_access
[0].value
= 0x00;
291 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
295 sc_access
[0].reg_addr
= ENABLE_DEV_AND_USE_XTAL
;
296 sc_access
[0].mask
= MASK7
;
297 sc_access
[0].value
= 0x00;
298 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
302 sc_access
[0].reg_addr
= ENABLE_OPDEV_CTRL
;
303 sc_access
[0].mask
= MASK3
|MASK2
;
304 sc_access
[0].value
= 0x00;
305 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
309 return mx_enable_audiodac(UNMUTE
);
312 static int mx_set_pcm_voice_params(void)
315 struct sc_reg_access sc_access
[] = {
328 {0x20c, 0xBE, 0x00},/* 0x00 -> 0xBE Koski */
329 {0x20d, 0x00, 0x00}, /* DAI2 'off' */
333 {0x211, 0x33, 0x00}, /* Voice filter */
348 {0x220, 0x00, 0x00}, /* Microphone configurations */
349 {0x221, 0x00, 0x00}, /* Microphone configurations */
350 {0x222, 0x50, 0x00}, /* Microphone configurations */
351 {0x223, 0x21, 0x00}, /* Microphone configurations */
362 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
363 retval
= mx_init_card();
367 pr_debug("SST DBG:mx_set_pcm_voice_params called\n");
368 return sst_sc_reg_access(sc_access
, PMIC_WRITE
, 44);
371 static int mx_set_pcm_audio_params(int sfreq
, int word_size
, int num_channel
)
375 int config1
= 0, config2
= 0, filter
= 0xB3;
376 struct sc_reg_access sc_access
[5];
378 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
379 retval
= mx_init_card();
423 snd_pmic_ops_mx
.num_channel
= num_channel
;
424 /*mute the right channel if MONO*/
425 if (snd_pmic_ops_mx
.num_channel
== 1) {
426 sc_access
[0].reg_addr
= VOL_CTRL_RT
;
427 sc_access
[0].value
= 0x40;
428 sc_access
[0].mask
= MASK6
;
430 sc_access
[1].reg_addr
= 0x224;
431 sc_access
[1].value
= 0x05;
432 sc_access
[1].mask
= MASK0
|MASK1
|MASK2
;
434 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2);
438 sc_access
[0].reg_addr
= VOL_CTRL_RT
;
439 sc_access
[0].value
= 0x00;
440 sc_access
[0].mask
= MASK6
;
442 sc_access
[1].reg_addr
= 0x224;
443 sc_access
[1].value
= 0x04;
444 sc_access
[1].mask
= MASK0
|MASK1
|MASK2
;
446 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2);
450 sc_access
[0].reg_addr
= 0x206;
451 sc_access
[0].value
= config1
;
452 sc_access
[1].reg_addr
= 0x207;
453 sc_access
[1].value
= config2
;
455 if (word_size
== 16) {
456 sc_access
[2].value
= 0x51;
457 sc_access
[3].value
= 0x31;
458 } else if (word_size
== 24) {
459 sc_access
[2].value
= 0x52;
460 sc_access
[3].value
= 0x92;
463 sc_access
[2].reg_addr
= 0x209;
464 sc_access
[3].reg_addr
= 0x20e;
466 sc_access
[4].reg_addr
= 0x211;
467 sc_access
[4].value
= filter
;
469 return sst_sc_reg_access(sc_access
, PMIC_WRITE
, 5);
472 static int mx_set_selected_output_dev(u8 dev_id
)
474 struct sc_reg_access sc_access
[2];
478 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
479 retval
= mx_init_card();
484 pr_debug("mx_set_selected_output_dev dev_id:0x%x\n", dev_id
);
485 snd_pmic_ops_mx
.output_dev_id
= dev_id
;
487 case STEREO_HEADPHONE
:
488 sc_access
[0].reg_addr
= 0xFF;
489 sc_access
[0].value
= 0x8C;
491 MASK2
|MASK3
|MASK5
|MASK6
|MASK4
;
497 sc_access
[0].reg_addr
= 0xFF;
498 sc_access
[0].value
= 0xb0;
499 sc_access
[0].mask
= MASK2
|MASK3
|MASK5
|MASK6
|MASK4
;
504 pr_debug("RECEIVER Koski selected\n");
506 /* configuration - AS enable, receiver enable */
507 sc_access
[0].reg_addr
= 0xFF;
508 sc_access
[0].value
= 0x81;
509 sc_access
[0].mask
= 0xff;
514 pr_err("Not a valid output dev\n");
517 return sst_sc_reg_access(sc_access
, PMIC_WRITE
, num_reg
);
521 static int mx_set_voice_port(int status
)
525 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
526 retval
= mx_init_card();
530 if (status
== ACTIVATE
)
531 retval
= mx_set_pcm_voice_params();
536 static int mx_set_audio_port(int status
)
541 static int mx_set_selected_input_dev(u8 dev_id
)
543 struct sc_reg_access sc_access
[2];
547 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
548 retval
= mx_init_card();
552 snd_pmic_ops_mx
.input_dev_id
= dev_id
;
553 pr_debug("mx_set_selected_input_dev dev_id:0x%x\n", dev_id
);
557 sc_access
[0].reg_addr
= 0x223;
558 sc_access
[0].value
= 0x00;
559 sc_access
[0].mask
= MASK7
|MASK6
|MASK5
|MASK4
|MASK0
;
560 sc_access
[1].reg_addr
= 0x222;
561 sc_access
[1].value
= 0x50;
562 sc_access
[1].mask
= MASK7
|MASK6
|MASK5
|MASK4
;
567 sc_access
[0].reg_addr
= 0x223;
568 sc_access
[0].value
= 0x20;
569 sc_access
[0].mask
= MASK7
|MASK6
|MASK5
|MASK4
|MASK0
;
570 sc_access
[1].reg_addr
= 0x222;
571 sc_access
[1].value
= 0x51;
572 sc_access
[1].mask
= MASK7
|MASK6
|MASK5
|MASK4
;
576 sc_access
[1].reg_addr
= 0x222;
577 sc_access
[1].value
= 0x00;
578 sc_access
[1].mask
= MASK7
|MASK6
|MASK5
|MASK4
|MASK0
;
579 sc_access
[0].reg_addr
= 0x223;
580 sc_access
[0].value
= 0x20;
581 sc_access
[0].mask
= MASK7
|MASK6
|MASK5
|MASK4
|MASK0
;
585 return sst_sc_reg_access(sc_access
, PMIC_WRITE
, num_reg
);
588 static int mx_set_mute(int dev_id
, u8 value
)
590 struct sc_reg_access sc_access
[5];
594 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
595 retval
= mx_init_card();
601 pr_debug("set_mute dev_id:0x%x , value:%d\n", dev_id
, value
);
604 case PMIC_SND_DMIC_MUTE
:
605 case PMIC_SND_AMIC_MUTE
:
606 case PMIC_SND_HP_MIC_MUTE
:
607 sc_access
[0].reg_addr
= 0x220;
608 sc_access
[1].reg_addr
= 0x221;
609 sc_access
[2].reg_addr
= 0x223;
611 sc_access
[0].value
= 0x00;
612 sc_access
[1].value
= 0x00;
613 if (snd_pmic_ops_mx
.input_dev_id
== DMIC
)
614 sc_access
[2].value
= 0x00;
616 sc_access
[2].value
= 0x20;
618 sc_access
[0].value
= 0x20;
619 sc_access
[1].value
= 0x20;
620 if (snd_pmic_ops_mx
.input_dev_id
== DMIC
)
621 sc_access
[2].value
= 0x20;
623 sc_access
[2].value
= 0x00;
625 sc_access
[0].mask
= MASK5
|MASK6
;
626 sc_access
[1].mask
= MASK5
|MASK6
;
627 sc_access
[2].mask
= MASK5
|MASK6
;
630 case PMIC_SND_LEFT_SPEAKER_MUTE
:
631 case PMIC_SND_LEFT_HP_MUTE
:
632 sc_access
[0].reg_addr
= VOL_CTRL_LT
;
634 sc_access
[0].value
= 0x40;
636 sc_access
[0].value
= 0x00;
637 sc_access
[0].mask
= MASK6
;
639 snd_pmic_ops_mx
.mute_status
= value
;
641 case PMIC_SND_RIGHT_SPEAKER_MUTE
:
642 case PMIC_SND_RIGHT_HP_MUTE
:
643 sc_access
[0].reg_addr
= VOL_CTRL_RT
;
644 if (snd_pmic_ops_mx
.num_channel
== 1)
647 sc_access
[0].value
= 0x40;
649 sc_access
[0].value
= 0x00;
650 sc_access
[0].mask
= MASK6
;
652 snd_pmic_ops_mx
.mute_status
= value
;
654 case PMIC_SND_MUTE_ALL
:
655 sc_access
[0].reg_addr
= VOL_CTRL_RT
;
656 sc_access
[1].reg_addr
= VOL_CTRL_LT
;
657 sc_access
[2].reg_addr
= 0x220;
658 sc_access
[3].reg_addr
= 0x221;
659 sc_access
[4].reg_addr
= 0x223;
660 snd_pmic_ops_mx
.master_mute
= value
;
662 sc_access
[0].value
= sc_access
[1].value
= 0x40;
663 sc_access
[2].value
= 0x00;
664 sc_access
[3].value
= 0x00;
665 if (snd_pmic_ops_mx
.input_dev_id
== DMIC
)
666 sc_access
[4].value
= 0x00;
668 sc_access
[4].value
= 0x20;
671 sc_access
[0].value
= sc_access
[1].value
= 0x00;
672 sc_access
[2].value
= sc_access
[3].value
= 0x20;
673 sc_access
[4].value
= 0x20;
674 if (snd_pmic_ops_mx
.input_dev_id
== DMIC
)
675 sc_access
[4].value
= 0x20;
677 sc_access
[4].value
= 0x00;
681 if (snd_pmic_ops_mx
.num_channel
== 1)
682 sc_access
[0].value
= 0x40;
683 sc_access
[0].mask
= sc_access
[1].mask
= MASK6
;
684 sc_access
[2].mask
= MASK5
|MASK6
;
685 sc_access
[3].mask
= MASK5
|MASK6
|MASK2
|MASK4
;
686 sc_access
[4].mask
= MASK5
|MASK6
|MASK4
;
690 case PMIC_SND_RECEIVER_MUTE
:
691 sc_access
[0].reg_addr
= VOL_CTRL_RT
;
693 sc_access
[0].value
= 0x40;
695 sc_access
[0].value
= 0x00;
696 sc_access
[0].mask
= MASK6
;
701 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, num_reg
);
704 static int mx_set_vol(int dev_id
, int value
)
706 struct sc_reg_access sc_access
[2] = {{0},};
710 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
711 retval
= mx_init_card();
715 pr_debug("set_vol dev_id:0x%x ,value:%d\n", dev_id
, value
);
717 case PMIC_SND_RECEIVER_VOL
:
720 case PMIC_SND_CAPTURE_VOL
:
721 sc_access
[0].reg_addr
= 0x220;
722 sc_access
[1].reg_addr
= 0x221;
723 sc_access
[0].value
= sc_access
[1].value
= -value
;
724 sc_access
[0].mask
= sc_access
[1].mask
=
725 (MASK0
|MASK1
|MASK2
|MASK3
|MASK4
);
728 case PMIC_SND_LEFT_PB_VOL
:
729 sc_access
[0].value
= -value
;
730 sc_access
[0].reg_addr
= VOL_CTRL_LT
;
731 sc_access
[0].mask
= (MASK0
|MASK1
|MASK2
|MASK3
|MASK4
|MASK5
);
734 case PMIC_SND_RIGHT_PB_VOL
:
735 sc_access
[0].value
= -value
;
736 sc_access
[0].reg_addr
= VOL_CTRL_RT
;
737 sc_access
[0].mask
= (MASK0
|MASK1
|MASK2
|MASK3
|MASK4
|MASK5
);
738 if (snd_pmic_ops_mx
.num_channel
== 1) {
739 sc_access
[0].value
= 0x40;
740 sc_access
[0].mask
= MASK6
;
741 sc_access
[0].reg_addr
= VOL_CTRL_RT
;
746 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, num_reg
);
749 static int mx_get_mute(int dev_id
, u8
*value
)
751 struct sc_reg_access sc_access
[4] = {{0},};
752 int retval
= 0, num_reg
= 0, mask
= 0;
754 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
755 retval
= mx_init_card();
760 case PMIC_SND_DMIC_MUTE
:
761 case PMIC_SND_AMIC_MUTE
:
762 case PMIC_SND_HP_MIC_MUTE
:
763 sc_access
[0].reg_addr
= 0x220;
766 retval
= sst_sc_reg_access(sc_access
, PMIC_READ
, num_reg
);
769 *value
= sc_access
[0].value
& mask
;
775 case PMIC_SND_LEFT_HP_MUTE
:
776 case PMIC_SND_LEFT_SPEAKER_MUTE
:
777 sc_access
[0].reg_addr
= VOL_CTRL_LT
;
781 case PMIC_SND_RIGHT_HP_MUTE
:
782 case PMIC_SND_RIGHT_SPEAKER_MUTE
:
783 sc_access
[0].reg_addr
= VOL_CTRL_RT
;
788 retval
= sst_sc_reg_access(sc_access
, PMIC_READ
, num_reg
);
791 *value
= sc_access
[0].value
& mask
;
799 static int mx_get_vol(int dev_id
, int *value
)
801 struct sc_reg_access sc_access
= {0,};
802 int retval
= 0, mask
= 0, num_reg
= 0;
804 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
805 retval
= mx_init_card();
810 case PMIC_SND_CAPTURE_VOL
:
811 sc_access
.reg_addr
= 0x220;
812 mask
= MASK0
|MASK1
|MASK2
|MASK3
|MASK4
;
815 case PMIC_SND_LEFT_PB_VOL
:
816 sc_access
.reg_addr
= VOL_CTRL_LT
;
817 mask
= MASK0
|MASK1
|MASK2
|MASK3
|MASK4
|MASK5
;
820 case PMIC_SND_RIGHT_PB_VOL
:
821 sc_access
.reg_addr
= VOL_CTRL_RT
;
822 mask
= MASK0
|MASK1
|MASK2
|MASK3
|MASK4
|MASK5
;
826 retval
= sst_sc_reg_access(&sc_access
, PMIC_READ
, num_reg
);
829 *value
= -(sc_access
.value
& mask
);
830 pr_debug("get volume value extracted %d\n", *value
);
834 static u8
mx_get_jack_status(void)
836 struct sc_reg_access sc_access_read
= {0,};
838 sc_access_read
.reg_addr
= 0x201;
839 sst_sc_reg_access(&sc_access_read
, PMIC_READ
, 1);
840 pr_debug("value returned = 0x%x\n", sc_access_read
.value
);
841 return sc_access_read
.value
;
844 static void mx_pmic_irq_enable(void *data
)
846 struct snd_intelmad
*intelmaddata
= data
;
848 intelmaddata
->jack_prev_state
= 0xc0;
852 static void mx_pmic_irq_cb(void *cb_data
, u8 intsts
)
854 u8 jack_cur_status
, jack_prev_state
= 0;
855 struct mad_jack
*mjack
= NULL
;
856 unsigned int present
= 0, jack_event_flag
= 0, buttonpressflag
= 0;
858 struct snd_intelmad
*intelmaddata
= cb_data
;
860 mjack
= &intelmaddata
->jack
[0];
862 jack_cur_status
= mx_get_jack_status();
863 jack_prev_state
= intelmaddata
->jack_prev_state
;
864 if ((jack_prev_state
== 0xc0) && (jack_cur_status
== 0x40)) {
865 /*headset insert detected. */
866 pr_debug("MAD headset inserted\n");
869 mjack
->jack_status
= 1;
870 mjack
->jack
.type
= SND_JACK_HEADSET
;
873 if ((jack_prev_state
== 0xc0) && (jack_cur_status
== 0x00)) {
874 /* headphone insert detected. */
875 pr_debug("MAD headphone inserted\n");
878 mjack
->jack
.type
= SND_JACK_HEADPHONE
;
881 if ((jack_prev_state
== 0x40) && (jack_cur_status
== 0xc0)) {
882 /* headset remove detected. */
883 pr_debug("MAD headset removed\n");
887 mjack
->jack_status
= 0;
888 mjack
->jack
.type
= SND_JACK_HEADSET
;
891 if ((jack_prev_state
== 0x00) && (jack_cur_status
== 0xc0)) {
892 /* headphone remove detected. */
893 pr_debug("MAD headphone removed\n");
896 mjack
->jack
.type
= SND_JACK_HEADPHONE
;
899 if ((jack_prev_state
== 0x40) && (jack_cur_status
== 0x00)) {
901 do_gettimeofday(&mjack
->buttonpressed
);
902 pr_debug("MAD button press detected\n");
905 if ((jack_prev_state
== 0x00) && (jack_cur_status
== 0x40)) {
906 if (mjack
->jack_status
) {
909 &mjack
->buttonreleased
);
911 pr_debug("MAD Button Released detected\n");
912 timediff
= mjack
->buttonreleased
.tv_sec
-
913 mjack
->buttonpressed
.tv_sec
;
917 pr_debug("MAD long press dtd\n");
918 /* send headphone detect/undetect */
922 MID_JACK_HS_LONG_PRESS
;
924 pr_debug("MAD short press dtd\n");
925 /* send headphone detect/undetect */
929 MID_JACK_HS_SHORT_PRESS
;
932 /***workaround for maxim
933 hw issue,0x00 t 0x40 is not
934 a valid transiton for Headset insertion */
935 /*headset insert detected. */
936 pr_debug("MAD headset inserted\n");
939 mjack
->jack_status
= 1;
940 mjack
->jack
.type
= SND_JACK_HEADSET
;
943 intelmaddata
->jack_prev_state
= jack_cur_status
;
944 pr_debug("mx_pmic_irq_cb prv_state= 0x%x\n",
945 intelmaddata
->jack_prev_state
);
949 sst_mad_send_jack_report(&mjack
->jack
,
950 buttonpressflag
, present
);
952 static int mx_jack_enable(void)
957 struct snd_pmic_ops snd_pmic_ops_mx
= {
958 .set_input_dev
= mx_set_selected_input_dev
,
959 .set_output_dev
= mx_set_selected_output_dev
,
960 .set_mute
= mx_set_mute
,
961 .get_mute
= mx_get_mute
,
962 .set_vol
= mx_set_vol
,
963 .get_vol
= mx_get_vol
,
964 .init_card
= mx_init_card
,
965 .set_pcm_audio_params
= mx_set_pcm_audio_params
,
966 .set_pcm_voice_params
= mx_set_pcm_voice_params
,
967 .set_voice_port
= mx_set_voice_port
,
968 .set_audio_port
= mx_set_audio_port
,
969 .power_up_pmic_pb
= mx_power_up_pb
,
970 .power_up_pmic_cp
= mx_power_up_cp
,
971 .power_down_pmic_pb
= mx_power_down_pb
,
972 .power_down_pmic_cp
= mx_power_down_cp
,
973 .power_down_pmic
= mx_power_down
,
974 .pmic_irq_cb
= mx_pmic_irq_cb
,
975 .pmic_irq_enable
= mx_pmic_irq_enable
,
976 .pmic_jack_enable
= mx_jack_enable
,