ALSA: hda - Avoid codec D3 for keeping mute LED up on Lenovo Yxx0
authorTakashi Iwai <tiwai@suse.de>
Mon, 13 Jan 2014 15:18:25 +0000 (16:18 +0100)
committerTakashi Iwai <tiwai@suse.de>
Tue, 25 Feb 2014 07:39:54 +0000 (08:39 +0100)
The GPIO line used for the mute LED control on Lenovo Yxx0 laptops is
cleared unexpectedly when the codec goes to D3, typically by
power-saving.  For avoiding it, add a power filter in the fixup.

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=16373
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/patch_realtek.c

index c5405f319cfeaa3b0079696439a42172484b77e1..6151ece625465c6207d7357931a67f38497ea181 100644 (file)
@@ -4894,6 +4894,17 @@ static void alc662_led_gpio1_mute_hook(void *private_data, int enabled)
                                    spec->gpio_led);
 }
 
+/* avoid D3 for keeping GPIO up */
+static unsigned int gpio_led_power_filter(struct hda_codec *codec,
+                                         hda_nid_t nid,
+                                         unsigned int power_state)
+{
+       struct alc_spec *spec = codec->spec;
+       if (nid == codec->afg && power_state == AC_PWRST_D3 && spec->gpio_led)
+               return AC_PWRST_D0;
+       return power_state;
+}
+
 static void alc662_fixup_led_gpio1(struct hda_codec *codec,
                                   const struct hda_fixup *fix, int action)
 {
@@ -4908,6 +4919,7 @@ static void alc662_fixup_led_gpio1(struct hda_codec *codec,
                spec->gen.vmaster_mute.hook = alc662_led_gpio1_mute_hook;
                spec->gpio_led = 0;
                snd_hda_add_verbs(codec, gpio_init);
+               codec->power_filter = gpio_led_power_filter;
        }
 }