Merge branch 'fix/acer-alc889-fix' into fix/hda
Takashi Iwai [Mon, 13 Feb 2012 14:34:31 +0000 (15:34 +0100)]
Conflicts:
sound/pci/hda/patch_realtek.c

Merged back the fix for Acer Aspire 6935 with ALC889 codec.
The fix commit was based on 3.2 kernel so that it can be applied to
stable kernel cleanly.

1  2 
sound/pci/hda/patch_realtek.c

@@@ -4357,78 -4196,33 +4357,96 @@@ static int patch_alc260(struct hda_code
   * Pin config fixes
   */
  enum {
 -      PINFIX_ABIT_AW9D_MAX,
 -      PINFIX_LENOVO_Y530,
 -      PINFIX_PB_M5210,
 -      PINFIX_ACER_ASPIRE_7736,
 -      PINFIX_ASUS_W90V,
 +      ALC882_FIXUP_ABIT_AW9D_MAX,
 +      ALC882_FIXUP_LENOVO_Y530,
 +      ALC882_FIXUP_PB_M5210,
 +      ALC882_FIXUP_ACER_ASPIRE_7736,
 +      ALC882_FIXUP_ASUS_W90V,
 +      ALC889_FIXUP_VAIO_TT,
 +      ALC888_FIXUP_EEE1601,
 +      ALC882_FIXUP_EAPD,
 +      ALC883_FIXUP_EAPD,
 +      ALC883_FIXUP_ACER_EAPD,
 +      ALC882_FIXUP_GPIO3,
 +      ALC889_FIXUP_COEF,
 +      ALC882_FIXUP_ASUS_W2JC,
 +      ALC882_FIXUP_ACER_ASPIRE_4930G,
 +      ALC882_FIXUP_ACER_ASPIRE_8930G,
 +      ALC882_FIXUP_ASPIRE_8930G_VERBS,
 +      ALC885_FIXUP_MACPRO_GPIO,
+       ALC889_FIXUP_DAC_ROUTE,
  };
  
 +static void alc889_fixup_coef(struct hda_codec *codec,
 +                            const struct alc_fixup *fix, int action)
 +{
 +      if (action != ALC_FIXUP_ACT_INIT)
 +              return;
 +      alc889_coef_init(codec);
 +}
 +
 +/* toggle speaker-output according to the hp-jack state */
 +static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
 +{
 +      unsigned int gpiostate, gpiomask, gpiodir;
 +
 +      gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
 +                                     AC_VERB_GET_GPIO_DATA, 0);
 +
 +      if (!muted)
 +              gpiostate |= (1 << pin);
 +      else
 +              gpiostate &= ~(1 << pin);
 +
 +      gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
 +                                    AC_VERB_GET_GPIO_MASK, 0);
 +      gpiomask |= (1 << pin);
 +
 +      gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
 +                                   AC_VERB_GET_GPIO_DIRECTION, 0);
 +      gpiodir |= (1 << pin);
 +
 +
 +      snd_hda_codec_write(codec, codec->afg, 0,
 +                          AC_VERB_SET_GPIO_MASK, gpiomask);
 +      snd_hda_codec_write(codec, codec->afg, 0,
 +                          AC_VERB_SET_GPIO_DIRECTION, gpiodir);
 +
 +      msleep(1);
 +
 +      snd_hda_codec_write(codec, codec->afg, 0,
 +                          AC_VERB_SET_GPIO_DATA, gpiostate);
 +}
 +
 +/* set up GPIO at initialization */
 +static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
 +                                   const struct alc_fixup *fix, int action)
 +{
 +      if (action != ALC_FIXUP_ACT_INIT)
 +              return;
 +      alc882_gpio_mute(codec, 0, 0);
 +      alc882_gpio_mute(codec, 1, 0);
 +}
 +
+ /* Fix the connection of some pins for ALC889:
+  * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
+  * work correctly (bko#42740)
+  */
+ static void alc889_fixup_dac_route(struct hda_codec *codec,
+                                  const struct alc_fixup *fix, int action)
+ {
+       if (action == ALC_FIXUP_ACT_PRE_PROBE) {
+               hda_nid_t conn1[2] = { 0x0c, 0x0d };
+               hda_nid_t conn2[2] = { 0x0e, 0x0f };
+               snd_hda_override_conn_list(codec, 0x14, 2, conn1);
+               snd_hda_override_conn_list(codec, 0x15, 2, conn1);
+               snd_hda_override_conn_list(codec, 0x18, 2, conn2);
+               snd_hda_override_conn_list(codec, 0x1a, 2, conn2);
+       }
+ }
  static const struct alc_fixup alc882_fixups[] = {
 -      [PINFIX_ABIT_AW9D_MAX] = {
 +      [ALC882_FIXUP_ABIT_AW9D_MAX] = {
                .type = ALC_FIXUP_PINS,
                .v.pins = (const struct alc_pincfg[]) {
                        { 0x15, 0x01080104 }, /* side */
                        { }
                }
        },
 +      [ALC889_FIXUP_VAIO_TT] = {
 +              .type = ALC_FIXUP_PINS,
 +              .v.pins = (const struct alc_pincfg[]) {
 +                      { 0x17, 0x90170111 }, /* hidden surround speaker */
 +                      { }
 +              }
 +      },
 +      [ALC888_FIXUP_EEE1601] = {
 +              .type = ALC_FIXUP_VERBS,
 +              .v.verbs = (const struct hda_verb[]) {
 +                      { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
 +                      { 0x20, AC_VERB_SET_PROC_COEF,  0x0838 },
 +                      { }
 +              }
 +      },
 +      [ALC882_FIXUP_EAPD] = {
 +              .type = ALC_FIXUP_VERBS,
 +              .v.verbs = (const struct hda_verb[]) {
 +                      /* change to EAPD mode */
 +                      { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
 +                      { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
 +                      { }
 +              }
 +      },
 +      [ALC883_FIXUP_EAPD] = {
 +              .type = ALC_FIXUP_VERBS,
 +              .v.verbs = (const struct hda_verb[]) {
 +                      /* change to EAPD mode */
 +                      { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
 +                      { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
 +                      { }
 +              }
 +      },
 +      [ALC883_FIXUP_ACER_EAPD] = {
 +              .type = ALC_FIXUP_VERBS,
 +              .v.verbs = (const struct hda_verb[]) {
 +                      /* eanable EAPD on Acer laptops */
 +                      { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
 +                      { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
 +                      { }
 +              }
 +      },
 +      [ALC882_FIXUP_GPIO3] = {
 +              .type = ALC_FIXUP_VERBS,
 +              .v.verbs = alc_gpio3_init_verbs,
 +      },
 +      [ALC882_FIXUP_ASUS_W2JC] = {
 +              .type = ALC_FIXUP_VERBS,
 +              .v.verbs = alc_gpio1_init_verbs,
 +              .chained = true,
 +              .chain_id = ALC882_FIXUP_EAPD,
 +      },
 +      [ALC889_FIXUP_COEF] = {
 +              .type = ALC_FIXUP_FUNC,
 +              .v.func = alc889_fixup_coef,
 +      },
 +      [ALC882_FIXUP_ACER_ASPIRE_4930G] = {
 +              .type = ALC_FIXUP_PINS,
 +              .v.pins = (const struct alc_pincfg[]) {
 +                      { 0x16, 0x99130111 }, /* CLFE speaker */
 +                      { 0x17, 0x99130112 }, /* surround speaker */
 +                      { }
 +              }
 +      },
 +      [ALC882_FIXUP_ACER_ASPIRE_8930G] = {
 +              .type = ALC_FIXUP_PINS,
 +              .v.pins = (const struct alc_pincfg[]) {
 +                      { 0x16, 0x99130111 }, /* CLFE speaker */
 +                      { 0x1b, 0x99130112 }, /* surround speaker */
 +                      { }
 +              },
 +              .chained = true,
 +              .chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
 +      },
 +      [ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
 +              /* additional init verbs for Acer Aspire 8930G */
 +              .type = ALC_FIXUP_VERBS,
 +              .v.verbs = (const struct hda_verb[]) {
 +                      /* Enable all DACs */
 +                      /* DAC DISABLE/MUTE 1? */
 +                      /*  setting bits 1-5 disables DAC nids 0x02-0x06
 +                       *  apparently. Init=0x38 */
 +                      { 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
 +                      { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
 +                      /* DAC DISABLE/MUTE 2? */
 +                      /*  some bit here disables the other DACs.
 +                       *  Init=0x4900 */
 +                      { 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
 +                      { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
 +                      /* DMIC fix
 +                       * This laptop has a stereo digital microphone.
 +                       * The mics are only 1cm apart which makes the stereo
 +                       * useless. However, either the mic or the ALC889
 +                       * makes the signal become a difference/sum signal
 +                       * instead of standard stereo, which is annoying.
 +                       * So instead we flip this bit which makes the
 +                       * codec replicate the sum signal to both channels,
 +                       * turning it into a normal mono mic.
 +                       */
 +                      /* DMIC_CONTROL? Init value = 0x0001 */
 +                      { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
 +                      { 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
 +                      { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
 +                      { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
 +                      { }
 +              }
 +      },
 +      [ALC885_FIXUP_MACPRO_GPIO] = {
 +              .type = ALC_FIXUP_FUNC,
 +              .v.func = alc885_fixup_macpro_gpio,
 +      },
+       [ALC889_FIXUP_DAC_ROUTE] = {
+               .type = ALC_FIXUP_FUNC,
+               .v.func = alc889_fixup_dac_route,
+       },
  };
  
  static const struct snd_pci_quirk alc882_fixup_tbl[] = {
 -      SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", PINFIX_PB_M5210),
 +      SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
 +      SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
 +      SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
 +      SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
 +      SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
 +      SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
 +      SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
 +                    ALC882_FIXUP_ACER_ASPIRE_4930G),
 +      SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
 +                    ALC882_FIXUP_ACER_ASPIRE_4930G),
 +      SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
 +                    ALC882_FIXUP_ACER_ASPIRE_8930G),
 +      SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
 +                    ALC882_FIXUP_ACER_ASPIRE_8930G),
 +      SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
 +                    ALC882_FIXUP_ACER_ASPIRE_4930G),
 +      SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
 +                    ALC882_FIXUP_ACER_ASPIRE_4930G),
 +      SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
 +                    ALC882_FIXUP_ACER_ASPIRE_4930G),
 +      SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
+       SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
 -      SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", PINFIX_ASUS_W90V),
 -      SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", PINFIX_LENOVO_Y530),
 -      SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
 -      SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", PINFIX_ACER_ASPIRE_7736),
 +      SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
 +      SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
 +      SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
 +      SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
 +      SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
 +      SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
 +
 +      /* All Apple entries are in codec SSIDs */
 +      SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_FIXUP_MACPRO_GPIO),
 +      SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
 +      SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
 +      SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
 +      SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
 +
 +      SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
 +      SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
 +      SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
 +      SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
 +      SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
 +      SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
 +      SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
        {}
  };