]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ALSA: intel8x0m: Register irq handler after register initializations
authorTakashi Iwai <tiwai@suse.de>
Tue, 28 Aug 2018 14:39:10 +0000 (16:39 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 13 Sep 2018 05:58:43 +0000 (07:58 +0200)
The interrupt handler has to be acquired after the other resource
initialization when allocated with IRQF_SHARED.  Otherwise it's
triggered before the resource gets ready, and may lead to unpleasant
behavior.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/intel8x0m.c

index 943a726b1c1b066bc2339d1e410b5af154473309..c84629190cbaf72fecb4769b5fd596a25fce1fbc 100644 (file)
@@ -1171,16 +1171,6 @@ static int snd_intel8x0m_create(struct snd_card *card,
        }
 
  port_inited:
-       if (request_irq(pci->irq, snd_intel8x0m_interrupt, IRQF_SHARED,
-                       KBUILD_MODNAME, chip)) {
-               dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq);
-               snd_intel8x0m_free(chip);
-               return -EBUSY;
-       }
-       chip->irq = pci->irq;
-       pci_set_master(pci);
-       synchronize_irq(chip->irq);
-
        /* initialize offsets */
        chip->bdbars_count = 2;
        tbl = intel_regs;
@@ -1224,11 +1214,21 @@ static int snd_intel8x0m_create(struct snd_card *card,
        chip->int_sta_reg = ICH_REG_GLOB_STA;
        chip->int_sta_mask = int_sta_masks;
 
+       pci_set_master(pci);
+
        if ((err = snd_intel8x0m_chip_init(chip, 1)) < 0) {
                snd_intel8x0m_free(chip);
                return err;
        }
 
+       if (request_irq(pci->irq, snd_intel8x0m_interrupt, IRQF_SHARED,
+                       KBUILD_MODNAME, chip)) {
+               dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq);
+               snd_intel8x0m_free(chip);
+               return -EBUSY;
+       }
+       chip->irq = pci->irq;
+
        if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
                snd_intel8x0m_free(chip);
                return err;