Skip to content

Commit

Permalink
ALSA: hda: Release controller display power during shutdown/reboot
Browse files Browse the repository at this point in the history
Make sure the HDA driver's display power reference is released during
shutdown/reboot.

During the shutdown/reboot sequence the pci device core calls the
pm_runtime_resume handler for all devices before calling the driver's
shutdown callback and so the HDA driver's runtime resume callback will
acquire a display power reference (on HSW/BDW). This triggers a power
reference held WARN on HSW/BDW in the i915 driver's subsequent shutdown
handler, which expects all display power references to be released by
that time.

Since the HDA controller is stopped in the shutdown handler in any case,
let's follow here the same sequence as the one during runtime suspend.
This will also reset the HDA link and drop the display power reference,
getting rid of the above WARN.

Tested on HSW.

v2:
- Fix the build for CONFIG_PM=n (Takashi)
- s/__azx_runtime_suspend/azx_shutdown_chip/

Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/3618
References: https://lore.kernel.org/lkml/cea1f9a-52e0-b83-593d-52997fe1aaf6@er-systems.de
Reported-and-tested-by: Thomas Voegtle <tv@lio96.de>
Signed-off-by: Imre Deak <imre.deak@intel.com>
Link: https://lore.kernel.org/r/20210623134601.2128663-1-imre.deak@intel.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Imre Deak authored and Takashi Iwai committed Jun 23, 2021
1 parent 0ac05b2 commit 472e18f
Showing 1 changed file with 11 additions and 11 deletions.
22 changes: 11 additions & 11 deletions sound/pci/hda/hda_intel.c
Original file line number Diff line number Diff line change
Expand Up @@ -883,6 +883,14 @@ static unsigned int azx_get_pos_skl(struct azx *chip, struct azx_dev *azx_dev)
return azx_get_pos_posbuf(chip, azx_dev);
}

static void azx_shutdown_chip(struct azx *chip)
{
azx_stop_chip(chip);
azx_enter_link_reset(chip);
azx_clear_irq_pending(chip);
display_power(chip, false);
}

#ifdef CONFIG_PM
static DEFINE_MUTEX(card_list_lock);
static LIST_HEAD(card_list);
Expand Down Expand Up @@ -942,14 +950,6 @@ static bool azx_is_pm_ready(struct snd_card *card)
return true;
}

static void __azx_runtime_suspend(struct azx *chip)
{
azx_stop_chip(chip);
azx_enter_link_reset(chip);
azx_clear_irq_pending(chip);
display_power(chip, false);
}

static void __azx_runtime_resume(struct azx *chip)
{
struct hda_intel *hda = container_of(chip, struct hda_intel, chip);
Expand Down Expand Up @@ -1028,7 +1028,7 @@ static int azx_suspend(struct device *dev)

chip = card->private_data;
bus = azx_bus(chip);
__azx_runtime_suspend(chip);
azx_shutdown_chip(chip);
if (bus->irq >= 0) {
free_irq(bus->irq, chip);
bus->irq = -1;
Expand Down Expand Up @@ -1107,7 +1107,7 @@ static int azx_runtime_suspend(struct device *dev)
/* enable controller wake up event */
azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) | STATESTS_INT_MASK);

__azx_runtime_suspend(chip);
azx_shutdown_chip(chip);
trace_azx_runtime_suspend(chip);
return 0;
}
Expand Down Expand Up @@ -2385,7 +2385,7 @@ static void azx_shutdown(struct pci_dev *pci)
return;
chip = card->private_data;
if (chip && chip->running)
azx_stop_chip(chip);
azx_shutdown_chip(chip);
}

/* PCI IDs */
Expand Down

0 comments on commit 472e18f

Please sign in to comment.