ALSA: hda - Avoid doubly suspend after vga switcheroo
authorTakashi Iwai <tiwai@suse.de>
Tue, 4 Dec 2012 16:01:25 +0000 (17:01 +0100)
committerTakashi Iwai <tiwai@suse.de>
Wed, 12 Dec 2012 10:32:56 +0000 (11:32 +0100)
The HD-audio driver artificially calls the suspend and the resume code
path in the VGA switcheroo state changes.  When a machine goes to
suspend, it tries to suspend the device again, and it stalls at
snd_power_wait().

This patch adds checks whether the devices were already in (forced)
suspend in PM callbacks for avoiding the doubly suspend.

Reported-by: Daniel J Blueman <daniel@quora.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_intel.c

index eb88c52..1da8a5c 100644 (file)
@@ -2630,6 +2630,9 @@ static int azx_suspend(struct device *dev)
        struct azx *chip = card->private_data;
        struct azx_pcm *p;
 
+       if (chip->disabled)
+               return 0;
+
        snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
        azx_clear_irq_pending(chip);
        list_for_each_entry(p, &chip->pcm_list, list)
@@ -2655,6 +2658,9 @@ static int azx_resume(struct device *dev)
        struct snd_card *card = dev_get_drvdata(dev);
        struct azx *chip = card->private_data;
 
+       if (chip->disabled)
+               return 0;
+
        pci_set_power_state(pci, PCI_D0);
        pci_restore_state(pci);
        if (pci_enable_device(pci) < 0) {