]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hp-dv6736-mic-fix
Move xen patchset to new version's subdir.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.drivers / alsa-post-ga-hp-dv6736-mic-fix
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hp-dv6736-mic-fix b/src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hp-dv6736-mic-fix
new file mode 100644 (file)
index 0000000..b090e5d
--- /dev/null
@@ -0,0 +1,168 @@
+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;
+       }