[alsa-devel] [PATCH] ALSA: hda - Disable runtime PM on LynxPoint(-LP) controllers

Takashi Iwai tiwai at suse.de
Tue Nov 19 17:51:51 CET 2013


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.

Further notes:
I actually could reproduce this on a few HP laptops here.
Go to S3 after runtime suspend, then the next playback fails,
resulting in either a codec stall or repeated sounds.

The problem seems lying in a deeper level.  The complete stall could
be avoided by disabling the call of azx_stop_chip() in
azx_runtime_suspend().  More specifically, it's the disablement of
CORB/RIRB in azx_free_cmd_io().  After removing this call, the sound
is resumed.

However, even with that workaround, the first playback after resume
stalls due to the missing RIRB interrupts (so you get "switch to
polling mode" kernel warning).  Interestingly, the codec communication
in the resume procedure does work.  The system goes to runtime suspend
immediately after resume, then something gets broken at that point.

This missing interrupt problem happens even if you do nothing in
runtime suspend/resume callback with empty callbacks.  This implies
that it's an issue in the underlying layer.  So, the only feasible
"fix" in the sound driver side to suppress the runtime PM, so far.

Cc: <stable at vger.kernel.org>
Signed-off-by: Takashi Iwai <tiwai at suse.de>
---

Yet another note: the patch is based on v3.12, not on linux-next, so
that it can be backported cleanly for 3.12 and earlier kernels.

 sound/pci/hda/hda_intel.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index 6e61a019aa5e..27fc33e54a50 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -3973,7 +3973,7 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
 	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
 	/* Lynx Point */
 	{ PCI_DEVICE(0x8086, 0x8c20),
-	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
+	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
 	/* Wellsburg */
 	{ PCI_DEVICE(0x8086, 0x8d20),
 	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
@@ -3981,10 +3981,10 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
 	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
 	/* Lynx Point-LP */
 	{ PCI_DEVICE(0x8086, 0x9c20),
-	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
+	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
 	/* Lynx Point-LP */
 	{ PCI_DEVICE(0x8086, 0x9c21),
-	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
+	  .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
 	/* Haswell */
 	{ PCI_DEVICE(0x8086, 0x0a0c),
 	  .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH |
-- 
1.8.4.3



More information about the Alsa-devel mailing list