lkml.org 
[lkml]   [2020]   [Sep]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 319/388] ALSA: hda: Workaround for spurious wakeups on some Intel platforms
    Date
    From: Takashi Iwai <tiwai@suse.de>

    [ Upstream commit a6630529aecb5a3e84370c376ed658e892e6261e ]

    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>
    Link: https://lore.kernel.org/r/20200727164443.4233-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    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 82e26442724ba..a356fb0e57738 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 754e4d1a86b57..590ea262f2e20 100644
    --- a/sound/pci/hda/hda_intel.c
    +++ b/sound/pci/hda/hda_intel.c
    @@ -295,7 +295,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;
    @@ -1054,7 +1062,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.25.1


    \
     
     \ /
      Last update: 2020-09-29 13:56    [W:3.840 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site