Skip to contentSkip to conversation

HDA: Fix sound resume hang

PATCH In review Daniel J Blueman 2 participants 2 messages Dec 18, 2012 Sound

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 HDA: Fix sound resume hang

Resuming a switcheroo'd HDA controller hangs since the completion is one-shot (thus works the first time). Fix by using completions that explictly need rearming, so remain fired before.

---
 sound/pci/hda/hda_intel.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
sound/pci/hda/hda_intel.c +2 -2
index 22ecadc..e12b939 100644
@@ -2856,7 +2856,7 @@ static int azx_free(struct azx *chip)
 	azx_notifier_unregister(chip);
 
 	chip->init_failed = 1; /* to be sure */
-	complete(&chip->probe_wait);
+	complete_all(&chip->probe_wait);
 
 	if (use_vga_switcheroo(chip)) {
 		if (chip->disabled && chip->bus)
@@ -3482,7 +3482,7 @@ static int __devinit azx_probe(struct pci_dev *pci,
 		pm_runtime_put_noidle(&pci->dev);
 
 	dev++;
-	complete(&chip->probe_wait);
+	complete_all(&chip->probe_wait);
 	return 0;
 
 out_free:
Signature · 1 line
1.7.10.4
#1 lore raw

At Tue, 18 Dec 2012 23:59:33 +0800,

Quoted 6 lines · Daniel J Blueman

Resuming a switcheroo'd HDA controller hangs since the completion is one-shot (thus works the first time). Fix by using completions that explictly need rearming, so remain fired before.

Oops, sorry, this was a forgotten scenario.
This isn't a perfect fix but easy enough and would work practically, so I applied it now. Thanks.

Takashi

Quoted 29 lines
---
 sound/pci/hda/hda_intel.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
sound/pci/hda/hda_intel.c +2 -2
index 22ecadc..e12b939 100644
@@ -2856,7 +2856,7 @@ static int azx_free(struct azx *chip)
 	azx_notifier_unregister(chip);
 
 	chip->init_failed = 1; /* to be sure */
-	complete(&chip->probe_wait);
+	complete_all(&chip->probe_wait);
 
 	if (use_vga_switcheroo(chip)) {
 		if (chip->disabled && chip->bus)
@@ -3482,7 +3482,7 @@ static int __devinit azx_probe(struct pci_dev *pci,
 		pm_runtime_put_noidle(&pci->dev);
 
 	dev++;
-	complete(&chip->probe_wait);
+	complete_all(&chip->probe_wait);
 	return 0;
 
 out_free:
Signature · 1 line
1.7.10.4