| From 0756f09c4946fe2d9ce2ebcb6f2e3c58830d22a3 Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Wed, 4 Dec 2013 13:59:45 +0100 |
| Subject: ALSA: hda - Fix silent output on MacBook Air 2,1 |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| commit 0756f09c4946fe2d9ce2ebcb6f2e3c58830d22a3 upstream. |
| |
| MacBook Air 2,1 has a fairly different pin assignment from its brother |
| MBA 1,1, and yet another quirks are needed for pin 0x18 and 0x19, |
| similarly like what iMac 9,1 requires, in order to make the sound |
| working on it. |
| |
| Reported-and-tested-by: Bruno Prémont <bonbons@linux-vserver.org> |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/pci/hda/patch_realtek.c | 39 +++++++++++++++++++++++++++++++-------- |
| 1 file changed, 31 insertions(+), 8 deletions(-) |
| |
| --- a/sound/pci/hda/patch_realtek.c |
| +++ b/sound/pci/hda/patch_realtek.c |
| @@ -1769,6 +1769,7 @@ enum { |
| ALC889_FIXUP_DAC_ROUTE, |
| ALC889_FIXUP_MBP_VREF, |
| ALC889_FIXUP_IMAC91_VREF, |
| + ALC889_FIXUP_MBA21_VREF, |
| ALC882_FIXUP_INV_DMIC, |
| ALC882_FIXUP_NO_PRIMARY_HP, |
| ALC887_FIXUP_ASUS_BASS, |
| @@ -1872,17 +1873,13 @@ static void alc889_fixup_mbp_vref(struct |
| } |
| } |
| |
| -/* Set VREF on speaker pins on imac91 */ |
| -static void alc889_fixup_imac91_vref(struct hda_codec *codec, |
| - const struct hda_fixup *fix, int action) |
| +static void alc889_fixup_mac_pins(struct hda_codec *codec, |
| + const hda_nid_t *nids, int num_nids) |
| { |
| struct alc_spec *spec = codec->spec; |
| - static hda_nid_t nids[2] = { 0x18, 0x1a }; |
| int i; |
| |
| - if (action != HDA_FIXUP_ACT_INIT) |
| - return; |
| - for (i = 0; i < ARRAY_SIZE(nids); i++) { |
| + for (i = 0; i < num_nids; i++) { |
| unsigned int val; |
| val = snd_hda_codec_get_pin_target(codec, nids[i]); |
| val |= AC_PINCTL_VREF_50; |
| @@ -1891,6 +1888,26 @@ static void alc889_fixup_imac91_vref(str |
| spec->gen.keep_vref_in_automute = 1; |
| } |
| |
| +/* Set VREF on speaker pins on imac91 */ |
| +static void alc889_fixup_imac91_vref(struct hda_codec *codec, |
| + const struct hda_fixup *fix, int action) |
| +{ |
| + static hda_nid_t nids[2] = { 0x18, 0x1a }; |
| + |
| + if (action == HDA_FIXUP_ACT_INIT) |
| + alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids)); |
| +} |
| + |
| +/* Set VREF on speaker pins on mba21 */ |
| +static void alc889_fixup_mba21_vref(struct hda_codec *codec, |
| + const struct hda_fixup *fix, int action) |
| +{ |
| + static hda_nid_t nids[2] = { 0x18, 0x19 }; |
| + |
| + if (action == HDA_FIXUP_ACT_INIT) |
| + alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids)); |
| +} |
| + |
| /* Don't take HP output as primary |
| * Strangely, the speaker output doesn't work on Vaio Z and some Vaio |
| * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05 |
| @@ -2087,6 +2104,12 @@ static const struct hda_fixup alc882_fix |
| .chained = true, |
| .chain_id = ALC882_FIXUP_GPIO1, |
| }, |
| + [ALC889_FIXUP_MBA21_VREF] = { |
| + .type = HDA_FIXUP_FUNC, |
| + .v.func = alc889_fixup_mba21_vref, |
| + .chained = true, |
| + .chain_id = ALC889_FIXUP_MBP_VREF, |
| + }, |
| [ALC882_FIXUP_INV_DMIC] = { |
| .type = HDA_FIXUP_FUNC, |
| .v.func = alc_fixup_inv_dmic_0x12, |
| @@ -2151,7 +2174,7 @@ static const struct snd_pci_quirk alc882 |
| SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF), |
| SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD), |
| SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBP_VREF), |
| - SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBP_VREF), |
| + SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF), |
| SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF), |
| SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF), |
| SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO), |