[ALSA] hda - Fix mic input on HP2133

The mic pins are wrongly assigned on AD1884A mobile model.
The mic handling is fixed for the automatic mic selection, too.

Signed-off-by: Takashi Iwai <tiwai@suse.de>

+28 -22
+28 -22
sound/pci/hda/patch_analog.c
··· 3644 3644 { } /* end */ 3645 3645 }; 3646 3646 3647 - static struct hda_input_mux ad1884a_mobile_capture_source = { 3648 - .num_items = 2, 3649 - .items = { 3650 - { "Mic", 0x1 }, /* port-C */ 3651 - { "Mix", 0x3 }, 3652 - }, 3653 - }; 3654 - 3655 3647 static struct snd_kcontrol_new ad1884a_mobile_mixers[] = { 3656 3648 HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT), 3657 3649 HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT), 3658 3650 HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT), 3659 3651 HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT), 3660 - HDA_CODEC_VOLUME("Mic Playback Volume", 0x20, 0x01, HDA_INPUT), 3661 - HDA_CODEC_MUTE("Mic Playback Switch", 0x20, 0x01, HDA_INPUT), 3662 3652 HDA_CODEC_VOLUME("Beep Playback Volume", 0x20, 0x03, HDA_INPUT), 3663 3653 HDA_CODEC_MUTE("Beep Playback Switch", 0x20, 0x03, HDA_INPUT), 3664 - HDA_CODEC_VOLUME("Mic Boost", 0x15, 0x0, HDA_INPUT), 3654 + HDA_CODEC_VOLUME("Mic Capture Volume", 0x14, 0x0, HDA_INPUT), 3655 + HDA_CODEC_VOLUME("Internal Mic Capture Volume", 0x15, 0x0, HDA_INPUT), 3665 3656 HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT), 3666 3657 HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT), 3667 - { 3668 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 3669 - .name = "Capture Source", 3670 - .info = ad198x_mux_enum_info, 3671 - .get = ad198x_mux_enum_get, 3672 - .put = ad198x_mux_enum_put, 3673 - }, 3674 3658 { } /* end */ 3675 3659 }; 3676 3660 ··· 3671 3687 present ? 0x00 : 0x02); 3672 3688 } 3673 3689 3690 + /* switch to external mic if plugged */ 3691 + static void ad1884a_hp_automic(struct hda_codec *codec) 3692 + { 3693 + unsigned int present; 3694 + 3695 + present = snd_hda_codec_read(codec, 0x14, 0, 3696 + AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 3697 + snd_hda_codec_write(codec, 0x0c, 0, AC_VERB_SET_CONNECT_SEL, 3698 + present ? 0 : 1); 3699 + } 3700 + 3674 3701 #define AD1884A_HP_EVENT 0x37 3702 + #define AD1884A_MIC_EVENT 0x36 3675 3703 3676 3704 /* unsolicited event for HP jack sensing */ 3677 3705 static void ad1884a_hp_unsol_event(struct hda_codec *codec, unsigned int res) 3678 3706 { 3679 - if ((res >> 26) != AD1884A_HP_EVENT) 3680 - return; 3681 - ad1884a_hp_automute(codec); 3707 + switch (res >> 26) { 3708 + case AD1884A_HP_EVENT: 3709 + ad1884a_hp_automute(codec); 3710 + break; 3711 + case AD1884A_MIC_EVENT: 3712 + ad1884a_hp_automic(codec); 3713 + break; 3714 + } 3682 3715 } 3683 3716 3684 3717 /* initialize jack-sensing, too */ ··· 3703 3702 { 3704 3703 ad198x_init(codec); 3705 3704 ad1884a_hp_automute(codec); 3705 + ad1884a_hp_automic(codec); 3706 3706 return 0; 3707 3707 } 3708 3708 ··· 3717 3715 /* Port-F pin */ 3718 3716 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 3719 3717 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 3718 + /* Port-C pin - internal mic-in */ 3719 + {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 3720 + {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */ 3721 + {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */ 3720 3722 /* analog mix */ 3721 3723 {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 3722 3724 /* unsolicited event for pin-sense */ 3723 3725 {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_HP_EVENT}, 3726 + {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_MIC_EVENT}, 3724 3727 { } /* end */ 3725 3728 }; 3726 3729 ··· 3885 3878 spec->mixers[0] = ad1884a_mobile_mixers; 3886 3879 spec->init_verbs[spec->num_init_verbs++] = ad1884a_laptop_verbs; 3887 3880 spec->multiout.dig_out_nid = 0; 3888 - spec->input_mux = &ad1884a_mobile_capture_source; 3889 3881 codec->patch_ops.unsol_event = ad1884a_hp_unsol_event; 3890 3882 codec->patch_ops.init = ad1884a_hp_init; 3891 3883 break;