aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorHui Wang <hui.wang@canonical.com>2014-08-19 00:07:03 -0400
committerTakashi Iwai <tiwai@suse.de>2014-08-19 01:57:46 -0400
commitf475371aa65de84fa483a998ab7594531026b9d9 (patch)
tree2805e45c8f2385f280616caea1ebae34f8dc6770 /sound
parentf3ee07d8b6e061bf34a7167c3f564e8da4360a99 (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.c9
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