At Wed, 20 Nov 2013 09:54:42 +0100,
David Henningsson wrote:
>> (Adding Mengdong to cc)
>> On 11/19/2013 05:51 PM, Takashi Iwai wrote:
> > We got bug reports of the stalled HD-audio, typically after S3 or S4,
> > and it turned out that they seemed triggered by runtime PM on Lynx
> > Point and Lynx Point-LP controllers. As there is no way to recover
> > properly from the stalled controller, it's safer to disable the
> > runtime PM support on these chips for now.
>> Oh, this is a bit sad news. Have you talked to Intel about it?
>> Anyway, I saw something similar a while ago, but never with access to
> the hardware, and then it was difficult to reproduce for the person on
> the other side. Nevertheless, when I read through the PM code I found
> that the GCTL register was sometimes accessed with readb (although it is
> a 32 bit register), so I wrote a patch for that, but the testing results
> of this patch were a bit inconclusive, so I never upstreamed it.
>> Anyway, I'm attaching the draft patch. Do you think it could be related?
It didn't change the behavior although the change looks good.
After a long debugging session in this morning, I finally nailed
down. This was the fault in the sound driver after all, shamefully :)
The fix patch is below.
The code needs a bit clean up, and I have it, but will apply this for
3.14.
Takashi
===
From: Takashi Iwai <tiwai at suse.de>
Subject: [PATCH 1/2] ALSA: hda - Fix unbalanced runtime PM notification at
resume
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.
Cc: <stable at vger.kernel.org>
Signed-off-by: Takashi Iwai <tiwai at suse.de>
---
sound/pci/hda/hda_codec.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
index be60f5227b34..bada677df8a7 100644
--- a/sound/pci/hda/hda_codec.c
+++ b/sound/pci/hda/hda_codec.c
@@ -4058,6 +4058,10 @@ static void hda_call_codec_resume(struct hda_codec *codec)
* 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);
--
1.8.4.3