diff options
author | Takashi Iwai <tiwai@suse.de> | 2006-06-06 15:44:34 +0200 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2006-06-22 21:34:13 +0200 |
commit | 688956f23bdbfb1c3551bfafc819f989b36bb8ae (patch) | |
tree | ae59fdf7662b5a27c66554cbfd2b67c49fc156da /sound/pci/cs4281.c | |
parent | c5533bf36b4a6629dab0e08c4951247050928853 (diff) | |
download | lwn-688956f23bdbfb1c3551bfafc819f989b36bb8ae.tar.gz lwn-688956f23bdbfb1c3551bfafc819f989b36bb8ae.zip |
[ALSA] Fix races in irq handler and ioremap
Call ioremap before request_irq for avoiding possible races
in the irq handler.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/cs4281.c')
-rw-r--r-- | sound/pci/cs4281.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/sound/pci/cs4281.c b/sound/pci/cs4281.c index 8c150eab45b6..e77a4ce314b7 100644 --- a/sound/pci/cs4281.c +++ b/sound/pci/cs4281.c @@ -1379,6 +1379,13 @@ static int __devinit snd_cs4281_create(struct snd_card *card, chip->ba0_addr = pci_resource_start(pci, 0); chip->ba1_addr = pci_resource_start(pci, 1); + chip->ba0 = ioremap_nocache(chip->ba0_addr, pci_resource_len(pci, 0)); + chip->ba1 = ioremap_nocache(chip->ba1_addr, pci_resource_len(pci, 1)); + if (!chip->ba0 || !chip->ba1) { + snd_cs4281_free(chip); + return -ENOMEM; + } + if (request_irq(pci->irq, snd_cs4281_interrupt, SA_INTERRUPT|SA_SHIRQ, "CS4281", chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); @@ -1387,13 +1394,6 @@ static int __devinit snd_cs4281_create(struct snd_card *card, } chip->irq = pci->irq; - chip->ba0 = ioremap_nocache(chip->ba0_addr, pci_resource_len(pci, 0)); - chip->ba1 = ioremap_nocache(chip->ba1_addr, pci_resource_len(pci, 1)); - if (!chip->ba0 || !chip->ba1) { - snd_cs4281_free(chip); - return -ENOMEM; - } - tmp = snd_cs4281_chip_init(chip); if (tmp) { snd_cs4281_free(chip); |