diff options
author | Takashi Iwai <tiwai@suse.de> | 2018-08-28 16:39:10 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2018-09-13 07:58:43 +0200 |
commit | 7064f376d4a10686f51c879401a569bb4babf9c6 (patch) | |
tree | 8f9eb08e54211170313e304c9e56a11b4626361d | |
parent | 5b03006d5c58ddd31caf542eef4d0269bcf265b3 (diff) | |
download | blackbird-op-linux-7064f376d4a10686f51c879401a569bb4babf9c6.tar.gz blackbird-op-linux-7064f376d4a10686f51c879401a569bb4babf9c6.zip |
ALSA: intel8x0m: Register irq handler after register initializations
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>
-rw-r--r-- | sound/pci/intel8x0m.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/sound/pci/intel8x0m.c b/sound/pci/intel8x0m.c index 943a726b1c1b..c84629190cba 100644 --- a/sound/pci/intel8x0m.c +++ b/sound/pci/intel8x0m.c @@ -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; |