| From 0fc28fc030a85aa3d6d14e9e9fca0c8237c9ffb5 Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Wed, 20 Nov 2013 12:15:07 +0100 |
| Subject: ALSA: hda - Fix unbalanced runtime PM notification at resume |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| commit 0fc28fc030a85aa3d6d14e9e9fca0c8237c9ffb5 upstream. |
| |
| When a codec is resumed, it keeps the power on while the resuming |
| phase via hda_keep_power_on(), then turns down via |
| snd_hda_power_down(). At that point, snd_hda_power_down() notifies |
| the power down to the controller, and this may confuse the refcount if |
| the codec was already powered up before the resume. |
| |
| In the end result, the controller goes to runtime suspend even before |
| the codec is kicked off to the power save, and the communication |
| stalls happens. |
| |
| The fix is to add the power-up notification together with |
| hda_keep_power_on(), and clears the flag appropriately. |
| |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/pci/hda/hda_codec.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/sound/pci/hda/hda_codec.c |
| +++ b/sound/pci/hda/hda_codec.c |
| @@ -3924,6 +3924,10 @@ static void hda_call_codec_resume(struct |
| * in the resume / power-save sequence |
| */ |
| hda_keep_power_on(codec); |
| + if (codec->pm_down_notified) { |
| + codec->pm_down_notified = 0; |
| + hda_call_pm_notify(codec->bus, true); |
| + } |
| hda_set_power_state(codec, AC_PWRST_D0); |
| restore_shutup_pins(codec); |
| hda_exec_init_verbs(codec); |