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 | |
| 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>
| -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) { |
