diff options
author | Hui Wang <hui.wang@canonical.com> | 2014-08-19 00:07:03 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2014-08-19 01:57:46 -0400 |
commit | f475371aa65de84fa483a998ab7594531026b9d9 (patch) | |
tree | 2805e45c8f2385f280616caea1ebae34f8dc6770 /sound | |
parent | f3ee07d8b6e061bf34a7167c3f564e8da4360a99 (diff) |
ALSA: hda - restore the gpio led after resume
On some HP laptops, the mute led is controlled by codec gpio.
When some machine resume from s3/s4, the codec gpio data will be
cleared to 0 by BIOS:
Before suspend:
IO[3]: enable=1, dir=1, wake=0, sticky=0, data=1, unsol=0
After resume:
IO[3]: enable=1, dir=1, wake=0, sticky=0, data=0, unsol=0
To skip the AFG node to enter D3 can't fix this problem.
A workaround is to restore the gpio data when the system resume
back from s3/s4. It is safe even on the machines without this
problem.
BugLink: https://bugs.launchpad.net/bugs/1358116
Tested-by: Franz Hsieh <franz.hsieh@canonical.com>
Cc: stable@vger.kernel.org
Signed-off-by: Hui Wang <hui.wang@canonical.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index b32ce086d2e0..d71270a3f73f 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -3268,6 +3268,15 @@ static int alc269_resume(struct hda_codec *codec) | |||
3268 | snd_hda_codec_resume_cache(codec); | 3268 | snd_hda_codec_resume_cache(codec); |
3269 | alc_inv_dmic_sync(codec, true); | 3269 | alc_inv_dmic_sync(codec, true); |
3270 | hda_call_check_power_status(codec, 0x01); | 3270 | hda_call_check_power_status(codec, 0x01); |
3271 | |||
3272 | /* on some machine, the BIOS will clear the codec gpio data when enter | ||
3273 | * suspend, and won't restore the data after resume, so we restore it | ||
3274 | * in the driver. | ||
3275 | */ | ||
3276 | if (spec->gpio_led) | ||
3277 | snd_hda_codec_write(codec, codec->afg, 0, AC_VERB_SET_GPIO_DATA, | ||
3278 | spec->gpio_led); | ||
3279 | |||
3271 | if (spec->has_alc5505_dsp) | 3280 | if (spec->has_alc5505_dsp) |
3272 | alc5505_dsp_resume(codec); | 3281 | alc5505_dsp_resume(codec); |
3273 | 3282 | ||