|
@@ -2959,6 +2959,23 @@ static void alc269_fixup_mic_mute_hook(void *private_data, int enabled)
|
|
|
snd_hda_set_pin_ctl_cache(codec, spec->mute_led_nid, pinval);
|
|
|
}
|
|
|
|
|
|
+/* Make sure the led works even in runtime suspend */
|
|
|
+static unsigned int led_power_filter(struct hda_codec *codec,
|
|
|
+ hda_nid_t nid,
|
|
|
+ unsigned int power_state)
|
|
|
+{
|
|
|
+ struct alc_spec *spec = codec->spec;
|
|
|
+
|
|
|
+ if (power_state != AC_PWRST_D3 || nid != spec->mute_led_nid)
|
|
|
+ return power_state;
|
|
|
+
|
|
|
+ /* Set pin ctl again, it might have just been set to 0 */
|
|
|
+ snd_hda_set_pin_ctl(codec, nid,
|
|
|
+ snd_hda_codec_get_pin_target(codec, nid));
|
|
|
+
|
|
|
+ return AC_PWRST_D0;
|
|
|
+}
|
|
|
+
|
|
|
static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
|
|
|
const struct hda_fixup *fix, int action)
|
|
|
{
|
|
@@ -2978,6 +2995,7 @@ static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
|
|
|
spec->mute_led_nid = pin - 0x0a + 0x18;
|
|
|
spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
|
|
|
spec->gen.vmaster_mute_enum = 1;
|
|
|
+ codec->power_filter = led_power_filter;
|
|
|
snd_printd("Detected mute LED for %x:%d\n", spec->mute_led_nid,
|
|
|
spec->mute_led_polarity);
|
|
|
break;
|
|
@@ -2993,6 +3011,7 @@ static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
|
|
|
spec->mute_led_nid = 0x18;
|
|
|
spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
|
|
|
spec->gen.vmaster_mute_enum = 1;
|
|
|
+ codec->power_filter = led_power_filter;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -3005,6 +3024,7 @@ static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
|
|
|
spec->mute_led_nid = 0x19;
|
|
|
spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
|
|
|
spec->gen.vmaster_mute_enum = 1;
|
|
|
+ codec->power_filter = led_power_filter;
|
|
|
}
|
|
|
}
|
|
|
|