ALSA: hda - Skip pin capability sanity check for bogus values
authorTakashi Iwai <tiwai@suse.de>
Fri, 20 Apr 2012 11:08:40 +0000 (13:08 +0200)
committerTakashi Iwai <tiwai@suse.de>
Fri, 20 Apr 2012 11:08:40 +0000 (13:08 +0200)
Some old codecs like ALC880 seem to give a bogus pin capability value 0
occasionally.  This breaks the new sanity check in snd_hda_set_pin_ctl().
Skip the sanity checks in such a case.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_codec.c

index 8b8b74a1284c1f7542f4f746c88d0024e7fc6aa4..408613c13f43c5c5fd5fa9ecb625f8758351967d 100644 (file)
@@ -4827,14 +4827,14 @@ int _snd_hda_set_pin_ctl(struct hda_codec *codec, hda_nid_t pin,
 {
        if (val) {
                unsigned int cap = snd_hda_query_pin_caps(codec, pin);
-               if (val & AC_PINCTL_OUT_EN) {
+               if (cap && (val & AC_PINCTL_OUT_EN)) {
                        if (!(cap & AC_PINCAP_OUT))
                                val &= ~(AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
                        else if ((val & AC_PINCTL_HP_EN) &&
                                 !(cap & AC_PINCAP_HP_DRV))
                                val &= ~AC_PINCTL_HP_EN;
                }
-               if (val & AC_PINCTL_IN_EN) {
+               if (cap && (val & AC_PINCTL_IN_EN)) {
                        if (!(cap & AC_PINCAP_IN))
                                val &= ~(AC_PINCTL_IN_EN | AC_PINCTL_VREFEN);
                }