diff options
author | Takashi Iwai <tiwai@suse.de> | 2012-12-04 11:01:25 -0500 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2012-12-12 05:32:56 -0500 |
commit | c5c215232dfb71d1cf2cc8627bdc2206726aa8a3 (patch) | |
tree | ec7198f923b216a9701943479560c219ffa8ab9f /sound/pci | |
parent | 1d31affbef40cea4958da03cf6ec3cea1c7f801e (diff) |
ALSA: hda - Avoid doubly suspend after vga switcheroo
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>
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/hda/hda_intel.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index eb88c528e120..1da8a5c9b9e1 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -2630,6 +2630,9 @@ static int azx_suspend(struct device *dev) | |||
2630 | struct azx *chip = card->private_data; | 2630 | struct azx *chip = card->private_data; |
2631 | struct azx_pcm *p; | 2631 | struct azx_pcm *p; |
2632 | 2632 | ||
2633 | if (chip->disabled) | ||
2634 | return 0; | ||
2635 | |||
2633 | snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); | 2636 | snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); |
2634 | azx_clear_irq_pending(chip); | 2637 | azx_clear_irq_pending(chip); |
2635 | list_for_each_entry(p, &chip->pcm_list, list) | 2638 | list_for_each_entry(p, &chip->pcm_list, list) |
@@ -2655,6 +2658,9 @@ static int azx_resume(struct device *dev) | |||
2655 | struct snd_card *card = dev_get_drvdata(dev); | 2658 | struct snd_card *card = dev_get_drvdata(dev); |
2656 | struct azx *chip = card->private_data; | 2659 | struct azx *chip = card->private_data; |
2657 | 2660 | ||
2661 | if (chip->disabled) | ||
2662 | return 0; | ||
2663 | |||
2658 | pci_set_power_state(pci, PCI_D0); | 2664 | pci_set_power_state(pci, PCI_D0); |
2659 | pci_restore_state(pci); | 2665 | pci_restore_state(pci); |
2660 | if (pci_enable_device(pci) < 0) { | 2666 | if (pci_enable_device(pci) < 0) { |