aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2007-04-20 06:30:28 -0400
committerJaroslav Kysela <perex@suse.cz>2007-05-11 10:56:08 -0400
commit2078f38c8008f5c54d9523ae19af32b9a0c5530e (patch)
tree6165183730bea3d3b80800e966547a4af3fcbba9
parentc9758b2182bdcccce31e1be474bfcd75b69cff0c (diff)
[ALSA] intel8x0 - Fix Oops in crash kernel
When intel8x0 driver is loaded in the crash kernel, it gets Oops occasionally. This is because the irq handler gets called before the proper hardware initialization. Now defer it after snd_intel8x0_chip_init(). (reference: http://lkml.org/lkml/2007/3/5/252) Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@suse.cz>
-rw-r--r--sound/pci/intel8x0.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c
index 7cf2dcb9d8d4..202f720b34b9 100644
--- a/sound/pci/intel8x0.c
+++ b/sound/pci/intel8x0.c
@@ -2493,6 +2493,7 @@ static int intel8x0_resume(struct pci_dev *pci)
2493 return -EIO; 2493 return -EIO;
2494 } 2494 }
2495 pci_set_master(pci); 2495 pci_set_master(pci);
2496 snd_intel8x0_chip_init(chip, 0);
2496 if (request_irq(pci->irq, snd_intel8x0_interrupt, 2497 if (request_irq(pci->irq, snd_intel8x0_interrupt,
2497 IRQF_SHARED, card->shortname, chip)) { 2498 IRQF_SHARED, card->shortname, chip)) {
2498 printk(KERN_ERR "intel8x0: unable to grab IRQ %d, " 2499 printk(KERN_ERR "intel8x0: unable to grab IRQ %d, "
@@ -2502,7 +2503,6 @@ static int intel8x0_resume(struct pci_dev *pci)
2502 } 2503 }
2503 chip->irq = pci->irq; 2504 chip->irq = pci->irq;
2504 synchronize_irq(chip->irq); 2505 synchronize_irq(chip->irq);
2505 snd_intel8x0_chip_init(chip, 0);
2506 2506
2507 /* re-initialize mixer stuff */ 2507 /* re-initialize mixer stuff */
2508 if (chip->device_type == DEVICE_INTEL_ICH4 && !spdif_aclink) { 2508 if (chip->device_type == DEVICE_INTEL_ICH4 && !spdif_aclink) {
@@ -2862,16 +2862,7 @@ static int __devinit snd_intel8x0_create(struct snd_card *card,
2862 ICH_REG_ALI_INTERRUPTSR : ICH_REG_GLOB_STA; 2862 ICH_REG_ALI_INTERRUPTSR : ICH_REG_GLOB_STA;
2863 chip->int_sta_mask = int_sta_masks; 2863 chip->int_sta_mask = int_sta_masks;
2864 2864
2865 /* request irq after initializaing int_sta_mask, etc */
2866 if (request_irq(pci->irq, snd_intel8x0_interrupt,
2867 IRQF_SHARED, card->shortname, chip)) {
2868 snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq);
2869 snd_intel8x0_free(chip);
2870 return -EBUSY;
2871 }
2872 chip->irq = pci->irq;
2873 pci_set_master(pci); 2865 pci_set_master(pci);
2874 synchronize_irq(chip->irq);
2875 2866
2876 switch(chip->device_type) { 2867 switch(chip->device_type) {
2877 case DEVICE_INTEL_ICH4: 2868 case DEVICE_INTEL_ICH4:
@@ -2901,6 +2892,15 @@ static int __devinit snd_intel8x0_create(struct snd_card *card,
2901 return err; 2892 return err;
2902 } 2893 }
2903 2894
2895 /* request irq after initializaing int_sta_mask, etc */
2896 if (request_irq(pci->irq, snd_intel8x0_interrupt,
2897 IRQF_SHARED, card->shortname, chip)) {
2898 snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq);
2899 snd_intel8x0_free(chip);
2900 return -EBUSY;
2901 }
2902 chip->irq = pci->irq;
2903
2904 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) { 2904 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
2905 snd_intel8x0_free(chip); 2905 snd_intel8x0_free(chip);
2906 return err; 2906 return err;