Forgot alsa patch
Signed-off-by: Justin M. Forbes <jforbes@fedoraproject.org>
This commit is contained in:
parent
7b5ab8004d
commit
adab1b9baf
1 changed files with 88 additions and 0 deletions
|
|
@ -0,0 +1,88 @@
|
|||
From 2b796b34a3b9ade3307304121a726d318641415a Mon Sep 17 00:00:00 2001
|
||||
From: Takashi Iwai <tiwai@suse.de>
|
||||
Date: Mon, 27 Jul 2020 17:19:18 +0200
|
||||
Subject: [PATCH] ALSA: hda: Workaround for spurious wakeups on some Intel
|
||||
platforms
|
||||
|
||||
We've received a regression report on Intel HD-audio controller that
|
||||
wakes up immediately after S3 suspend. The bisection leads to the
|
||||
commit c4c8dd6ef807 ("ALSA: hda: Skip controller resume if not
|
||||
needed"). This commit replaces the system-suspend to use
|
||||
pm_runtime_force_suspend() instead of the direct call of
|
||||
__azx_runtime_suspend(). However, by some really mysterious reason,
|
||||
pm_runtime_force_suspend() causes a spurious wakeup (although it calls
|
||||
the same __azx_runtime_suspend() internally).
|
||||
|
||||
As an ugly workaround for now, revert the behavior to call
|
||||
__azx_runtime_suspend() and __azx_runtime_resume() for those old Intel
|
||||
platforms that may exhibit such a problem, while keeping the new
|
||||
standard pm_runtime_force_suspend() and pm_runtime_force_resume()
|
||||
pair for the remaining chips.
|
||||
|
||||
Fixes: c4c8dd6ef807 ("ALSA: hda: Skip controller resume if not needed")
|
||||
BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=208649
|
||||
Cc: <stable@vger.kernel.org>
|
||||
Signed-off-by: Takashi Iwai <tiwai@suse.de>
|
||||
---
|
||||
sound/pci/hda/hda_controller.h | 2 +-
|
||||
sound/pci/hda/hda_intel.c | 17 ++++++++++++++---
|
||||
2 files changed, 15 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/sound/pci/hda/hda_controller.h b/sound/pci/hda/hda_controller.h
|
||||
index fe171685492d..be63ead8161f 100644
|
||||
--- a/sound/pci/hda/hda_controller.h
|
||||
+++ b/sound/pci/hda/hda_controller.h
|
||||
@@ -41,7 +41,7 @@
|
||||
/* 24 unused */
|
||||
#define AZX_DCAPS_COUNT_LPIB_DELAY (1 << 25) /* Take LPIB as delay */
|
||||
#define AZX_DCAPS_PM_RUNTIME (1 << 26) /* runtime PM support */
|
||||
-/* 27 unused */
|
||||
+#define AZX_DCAPS_SUSPEND_SPURIOUS_WAKEUP (1 << 27) /* Workaround for spurious wakeups after suspend */
|
||||
#define AZX_DCAPS_CORBRP_SELF_CLEAR (1 << 28) /* CORBRP clears itself after reset */
|
||||
#define AZX_DCAPS_NO_MSI64 (1 << 29) /* Stick to 32-bit MSIs */
|
||||
#define AZX_DCAPS_SEPARATE_STREAM_TAG (1 << 30) /* capture and playback use separate stream tag */
|
||||
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
|
||||
index 9ba1fb8f0b7f..fb65450d8de1 100644
|
||||
--- a/sound/pci/hda/hda_intel.c
|
||||
+++ b/sound/pci/hda/hda_intel.c
|
||||
@@ -297,7 +297,8 @@ enum {
|
||||
/* PCH for HSW/BDW; with runtime PM */
|
||||
/* no i915 binding for this as HSW/BDW has another controller for HDMI */
|
||||
#define AZX_DCAPS_INTEL_PCH \
|
||||
- (AZX_DCAPS_INTEL_PCH_BASE | AZX_DCAPS_PM_RUNTIME)
|
||||
+ (AZX_DCAPS_INTEL_PCH_BASE | AZX_DCAPS_PM_RUNTIME |\
|
||||
+ AZX_DCAPS_SUSPEND_SPURIOUS_WAKEUP)
|
||||
|
||||
/* HSW HDMI */
|
||||
#define AZX_DCAPS_INTEL_HASWELL \
|
||||
@@ -1026,7 +1027,14 @@ static int azx_suspend(struct device *dev)
|
||||
chip = card->private_data;
|
||||
bus = azx_bus(chip);
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
- pm_runtime_force_suspend(dev);
|
||||
+ /* An ugly workaround: direct call of __azx_runtime_suspend() and
|
||||
+ * __azx_runtime_resume() for old Intel platforms that suffer from
|
||||
+ * spurious wakeups after S3 suspend
|
||||
+ */
|
||||
+ if (chip->driver_caps & AZX_DCAPS_SUSPEND_SPURIOUS_WAKEUP)
|
||||
+ __azx_runtime_suspend(chip);
|
||||
+ else
|
||||
+ pm_runtime_force_suspend(dev);
|
||||
if (bus->irq >= 0) {
|
||||
free_irq(bus->irq, chip);
|
||||
bus->irq = -1;
|
||||
@@ -1055,7 +1063,10 @@ static int azx_resume(struct device *dev)
|
||||
if (azx_acquire_irq(chip, 1) < 0)
|
||||
return -EIO;
|
||||
|
||||
- pm_runtime_force_resume(dev);
|
||||
+ if (chip->driver_caps & AZX_DCAPS_SUSPEND_SPURIOUS_WAKEUP)
|
||||
+ __azx_runtime_resume(chip, false);
|
||||
+ else
|
||||
+ pm_runtime_force_resume(dev);
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D0);
|
||||
|
||||
trace_azx_resume(chip);
|
||||
--
|
||||
2.26.2
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue