| From e3744214729a81c71b1f3bba945d2e0a9f85c700 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 28 Aug 2018 16:39:10 +0200 |
| Subject: ALSA: intel8x0m: Register irq handler after register initializations |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| [ Upstream commit 7064f376d4a10686f51c879401a569bb4babf9c6 ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| sound/pci/intel8x0m.c | 20 ++++++++++---------- |
| 1 file changed, 10 insertions(+), 10 deletions(-) |
| |
| diff --git a/sound/pci/intel8x0m.c b/sound/pci/intel8x0m.c |
| index 943a726b1c1b0..c84629190cbaf 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; |
| -- |
| 2.20.1 |
| |