* [PATCH] ALSA: hda - Make sure mute LEDs stay on during runtime suspend (Realtek)
@ 2013-11-06 9:50 David Henningsson
2013-11-06 10:11 ` Takashi Iwai
0 siblings, 1 reply; 3+ messages in thread
From: David Henningsson @ 2013-11-06 9:50 UTC (permalink / raw)
To: tiwai, alsa-devel; +Cc: David Henningsson, 1248465, stable
Some HP machines with Realtek codecs have mute LEDs connected to VREF pins.
However when these go into runtime suspend, the pin powers down and its
pin control is disabled, thus disabling the LED too.
This patch fixes that issue by making sure that the pin stays in D0 with
correct pin control.
Cc: stable@kernel.org
BugLink: https://bugs.launchpad.net/bugs/1248465
Tested-by: Franz Hsieh <franz.hsieh@canonical.com>
Signed-off-by: David Henningsson <david.henningsson@canonical.com>
---
sound/pci/hda/patch_realtek.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index a51f48c..0acbe82 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -2955,6 +2955,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)
{
@@ -2974,6 +2991,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;
@@ -2989,6 +3007,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;
}
}
@@ -3001,6 +3020,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;
}
}
--
1.7.9.5
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] ALSA: hda - Make sure mute LEDs stay on during runtime suspend (Realtek)
2013-11-06 9:50 [PATCH] ALSA: hda - Make sure mute LEDs stay on during runtime suspend (Realtek) David Henningsson
@ 2013-11-06 10:11 ` Takashi Iwai
2013-11-06 10:17 ` David Henningsson
0 siblings, 1 reply; 3+ messages in thread
From: Takashi Iwai @ 2013-11-06 10:11 UTC (permalink / raw)
To: David Henningsson; +Cc: alsa-devel, stable, 1248465
At Wed, 6 Nov 2013 10:50:44 +0100,
David Henningsson wrote:
>
> Some HP machines with Realtek codecs have mute LEDs connected to VREF pins.
> However when these go into runtime suspend, the pin powers down and its
> pin control is disabled, thus disabling the LED too.
>
> This patch fixes that issue by making sure that the pin stays in D0 with
> correct pin control.
>
> Cc: stable@kernel.org
> BugLink: https://bugs.launchpad.net/bugs/1248465
> Tested-by: Franz Hsieh <franz.hsieh@canonical.com>
> Signed-off-by: David Henningsson <david.henningsson@canonical.com>
Thanks, applied.
I do wonder, though, whether the LED survives even after turning AFG
to D3. With IDT codecs, we had to keep AFG D0 just for keeping this
VREF stuff. Maybe Realtek codecs behave differently.
Takashi
> ---
> sound/pci/hda/patch_realtek.c | 20 ++++++++++++++++++++
> 1 file changed, 20 insertions(+)
>
> diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
> index a51f48c..0acbe82 100644
> --- a/sound/pci/hda/patch_realtek.c
> +++ b/sound/pci/hda/patch_realtek.c
> @@ -2955,6 +2955,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)
> {
> @@ -2974,6 +2991,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;
> @@ -2989,6 +3007,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;
> }
> }
>
> @@ -3001,6 +3020,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;
> }
> }
>
> --
> 1.7.9.5
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] ALSA: hda - Make sure mute LEDs stay on during runtime suspend (Realtek)
2013-11-06 10:11 ` Takashi Iwai
@ 2013-11-06 10:17 ` David Henningsson
0 siblings, 0 replies; 3+ messages in thread
From: David Henningsson @ 2013-11-06 10:17 UTC (permalink / raw)
To: Takashi Iwai; +Cc: alsa-devel, 1248465
On 11/06/2013 11:11 AM, Takashi Iwai wrote:
> At Wed, 6 Nov 2013 10:50:44 +0100,
> David Henningsson wrote:
>>
>> Some HP machines with Realtek codecs have mute LEDs connected to VREF pins.
>> However when these go into runtime suspend, the pin powers down and its
>> pin control is disabled, thus disabling the LED too.
>>
>> This patch fixes that issue by making sure that the pin stays in D0 with
>> correct pin control.
>>
>> Cc: stable@kernel.org
>> BugLink: https://bugs.launchpad.net/bugs/1248465
>> Tested-by: Franz Hsieh <franz.hsieh@canonical.com>
>> Signed-off-by: David Henningsson <david.henningsson@canonical.com>
>
> Thanks, applied.
>
> I do wonder, though, whether the LED survives even after turning AFG
> to D3. With IDT codecs, we had to keep AFG D0 just for keeping this
> VREF stuff. Maybe Realtek codecs behave differently.
Well, the patch was tested by Franz and found working, so it seems
indeed that AFG can be in D3 and the LED still works.
(Actually it could even be the other way around - maybe even the pin can
remain in D3 and still have vref output, as long as the pin ctl is set.
I never tested that explicitly.)
--
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2013-11-06 10:17 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-11-06 9:50 [PATCH] ALSA: hda - Make sure mute LEDs stay on during runtime suspend (Realtek) David Henningsson
2013-11-06 10:11 ` Takashi Iwai
2013-11-06 10:17 ` David Henningsson
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.