--- /dev/null
+From 79d7d5333b598e9a559bf27833f0ad2b8bf6ad2c Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Wed, 4 Mar 2009 09:03:50 +0100
+Subject: ALSA: hda - Fix HP dv6736 mic input
+Patch-mainline:
+References: bnc#480753
+
+Fix the mic input of HP dv6736 with Conexant 5051 codec chip.
+This laptop seems have no mic-switching per jack connection.
+A new model hp-dv6736 is introduced to match with the h/w implementation.
+
+Reference: Novell bnc#480753
+ https://bugzilla.novell.com/show_bug.cgi?id=480753
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Acked-by: Takashi Iwai <tiwai@suse.de>
+
+---
+ Documentation/sound/alsa/ALSA-Configuration.txt | 1
+ sound/pci/hda/patch_conexant.c | 63 ++++++++++++++++++++++--
+ 2 files changed, 59 insertions(+), 5 deletions(-)
+
+--- a/Documentation/sound/alsa/ALSA-Configuration.txt
++++ b/Documentation/sound/alsa/ALSA-Configuration.txt
+@@ -1016,6 +1016,7 @@
+ Conexant 5051
+ laptop Basic Laptop config (default)
+ hp HP Spartan laptop
++ hp-dv6736 HP dv6736
+ lenovo-x200 Lenovo X200 laptop
+
+ STAC9200
+--- a/sound/pci/hda/patch_conexant.c
++++ b/sound/pci/hda/patch_conexant.c
+@@ -58,6 +58,7 @@
+ */
+ unsigned int cur_eapd;
+ unsigned int hp_present;
++ unsigned int no_auto_mic;
+ unsigned int need_dac_fix;
+
+ /* capture */
+@@ -1571,8 +1572,11 @@
+ /* toggle input of built-in and mic jack appropriately */
+ static void cxt5051_portb_automic(struct hda_codec *codec)
+ {
++ struct conexant_spec *spec = codec->spec;
+ unsigned int present;
+
++ if (spec->no_auto_mic)
++ return;
+ present = snd_hda_codec_read(codec, 0x17, 0,
+ AC_VERB_GET_PIN_SENSE, 0) &
+ AC_PINSENSE_PRESENCE;
+@@ -1588,6 +1592,8 @@
+ unsigned int present;
+ hda_nid_t new_adc;
+
++ if (spec->no_auto_mic)
++ return;
+ present = snd_hda_codec_read(codec, 0x18, 0,
+ AC_VERB_GET_PIN_SENSE, 0) &
+ AC_PINSENSE_PRESENCE;
+@@ -1672,6 +1678,22 @@
+ {}
+ };
+
++static struct snd_kcontrol_new cxt5051_hp_dv6736_mixers[] = {
++ HDA_CODEC_VOLUME("Mic Volume", 0x14, 0x00, HDA_INPUT),
++ HDA_CODEC_MUTE("Mic Switch", 0x14, 0x00, HDA_INPUT),
++ HDA_CODEC_VOLUME("Master Playback Volume", 0x10, 0x00, HDA_OUTPUT),
++ {
++ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
++ .name = "Master Playback Switch",
++ .info = cxt_eapd_info,
++ .get = cxt_eapd_get,
++ .put = cxt5051_hp_master_sw_put,
++ .private_value = 0x1a,
++ },
++
++ {}
++};
++
+ static struct hda_verb cxt5051_init_verbs[] = {
+ /* Line in, Mic */
+ {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x03},
+@@ -1702,6 +1724,32 @@
+ { } /* end */
+ };
+
++static struct hda_verb cxt5051_hp_dv6736_init_verbs[] = {
++ /* Line in, Mic */
++ {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x03},
++ {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
++ {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0},
++ {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0},
++ /* SPK */
++ {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
++ {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
++ /* HP, Amp */
++ {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
++ {0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
++ /* DAC1 */
++ {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
++ /* Record selector: Int mic */
++ {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1) | 0x44},
++ {0x14, AC_VERB_SET_CONNECT_SEL, 0x1},
++ /* SPDIF route: PCM */
++ {0x1c, AC_VERB_SET_CONNECT_SEL, 0x0},
++ /* EAPD */
++ {0x1a, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */
++ {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CONEXANT_HP_EVENT},
++ {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|CXT5051_PORTB_EVENT},
++ { } /* end */
++};
++
+ static struct hda_verb cxt5051_lenovo_x200_init_verbs[] = {
+ /* Line in, Mic */
+ {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x03},
+@@ -1752,6 +1800,7 @@
+ enum {
+ CXT5051_LAPTOP, /* Laptops w/ EAPD support */
+ CXT5051_HP, /* no docking */
++ CXT5051_HP_DV6736, /* HP without mic switch */
+ CXT5051_LENOVO_X200, /* Lenovo X200 laptop */
+ CXT5051_MODELS
+ };
+@@ -1759,10 +1808,12 @@
+ static const char *cxt5051_models[CXT5051_MODELS] = {
+ [CXT5051_LAPTOP] = "laptop",
+ [CXT5051_HP] = "hp",
++ [CXT5051_HP_DV6736] = "hp-dv6736",
+ [CXT5051_LENOVO_X200] = "lenovo-x200",
+ };
+
+ static struct snd_pci_quirk cxt5051_cfg_tbl[] = {
++ SND_PCI_QUIRK(0x103c, 0x30cf, "HP DV6736", CXT5051_HP_DV6736),
+ SND_PCI_QUIRK(0x14f1, 0x0101, "Conexant Reference board",
+ CXT5051_LAPTOP),
+ SND_PCI_QUIRK(0x14f1, 0x5051, "HP Spartan 1.1", CXT5051_HP),
+@@ -1799,20 +1850,22 @@
+ spec->cur_adc = 0;
+ spec->cur_adc_idx = 0;
+
++ codec->patch_ops.unsol_event = cxt5051_hp_unsol_event;
++
+ board_config = snd_hda_check_board_config(codec, CXT5051_MODELS,
+ cxt5051_models,
+ cxt5051_cfg_tbl);
+ switch (board_config) {
+ case CXT5051_HP:
+- codec->patch_ops.unsol_event = cxt5051_hp_unsol_event;
+ spec->mixers[0] = cxt5051_hp_mixers;
+ break;
++ case CXT5051_HP_DV6736:
++ spec->init_verbs[0] = cxt5051_hp_dv6736_init_verbs;
++ spec->mixers[0] = cxt5051_hp_dv6736_mixers;
++ spec->no_auto_mic = 1;
++ break;
+ case CXT5051_LENOVO_X200:
+ spec->init_verbs[0] = cxt5051_lenovo_x200_init_verbs;
+- /* fallthru */
+- default:
+- case CXT5051_LAPTOP:
+- codec->patch_ops.unsol_event = cxt5051_hp_unsol_event;
+ break;
+ }
+