From: "Rafael J. Wysocki" <rjw@sisk.pl>

The following patch adds free_irq() and request_irq() to the suspend and
resume, respectively, routines in the snd_intel8x0 driver.

The problem is that, apparently, some out-of-order interrupts may be generated
during resume and if some drivers do not call free_irq() on suspend, these
interrupts are mishandled.  For reference please see

	http://bugzilla.kernel.org/show_bug.cgi?id=4416

and

	http://sourceforge.net/mailarchive/message.php?msg_id=12448907

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 sound/pci/intel8x0.c |   11 ++++++++++-
 1 files changed, 10 insertions(+), 1 deletion(-)

diff -puN sound/pci/intel8x0.c~intel8x0-free-irq-in-suspend sound/pci/intel8x0.c
--- 25/sound/pci/intel8x0.c~intel8x0-free-irq-in-suspend	Tue Jul 26 13:32:04 2005
+++ 25-akpm/sound/pci/intel8x0.c	Tue Jul 26 13:32:04 2005
@@ -2373,6 +2373,8 @@ static int intel8x0_suspend(snd_card_t *
 	for (i = 0; i < 3; i++)
 		if (chip->ac97[i])
 			snd_ac97_suspend(chip->ac97[i]);
+	if (chip->irq >= 0)
+		free_irq(chip->irq, (void *)chip);
 	pci_disable_device(chip->pci);
 	return 0;
 }
@@ -2384,7 +2386,14 @@ static int intel8x0_resume(snd_card_t *c
 
 	pci_enable_device(chip->pci);
 	pci_set_master(chip->pci);
-	snd_intel8x0_chip_init(chip, 0);
+	if (request_irq(chip->irq, snd_intel8x0_interrupt, SA_INTERRUPT|SA_SHIRQ, card->shortname, (void *)chip)) {
+		snd_printk("unable to grab IRQ %d\n", chip->irq);
+		chip->irq = -1;
+		pci_disable_device(chip->pci);
+		return -EBUSY;
+	}
+	synchronize_irq(chip->irq);
+	snd_intel8x0_chip_init(chip, 1);
 
 	/* refill nocache */
 	if (chip->fix_nocache)
_