diff options
author | Takashi Iwai <tiwai@suse.de> | 2006-06-06 09:44:34 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2006-06-22 15:34:13 -0400 |
commit | 688956f23bdbfb1c3551bfafc819f989b36bb8ae (patch) | |
tree | ae59fdf7662b5a27c66554cbfd2b67c49fc156da /sound | |
parent | c5533bf36b4a6629dab0e08c4951247050928853 (diff) |
[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')
-rw-r--r-- | sound/pci/cs4281.c | 14 | ||||
-rw-r--r-- | sound/pci/rme32.c | 12 | ||||
-rw-r--r-- | sound/pci/rme96.c | 10 |
3 files changed, 18 insertions, 18 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, | |||
1379 | chip->ba0_addr = pci_resource_start(pci, 0); | 1379 | chip->ba0_addr = pci_resource_start(pci, 0); |
1380 | chip->ba1_addr = pci_resource_start(pci, 1); | 1380 | chip->ba1_addr = pci_resource_start(pci, 1); |
1381 | 1381 | ||
1382 | chip->ba0 = ioremap_nocache(chip->ba0_addr, pci_resource_len(pci, 0)); | ||
1383 | chip->ba1 = ioremap_nocache(chip->ba1_addr, pci_resource_len(pci, 1)); | ||
1384 | if (!chip->ba0 || !chip->ba1) { | ||
1385 | snd_cs4281_free(chip); | ||
1386 | return -ENOMEM; | ||
1387 | } | ||
1388 | |||
1382 | if (request_irq(pci->irq, snd_cs4281_interrupt, SA_INTERRUPT|SA_SHIRQ, | 1389 | if (request_irq(pci->irq, snd_cs4281_interrupt, SA_INTERRUPT|SA_SHIRQ, |
1383 | "CS4281", chip)) { | 1390 | "CS4281", chip)) { |
1384 | snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); | 1391 | 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, | |||
1387 | } | 1394 | } |
1388 | chip->irq = pci->irq; | 1395 | chip->irq = pci->irq; |
1389 | 1396 | ||
1390 | chip->ba0 = ioremap_nocache(chip->ba0_addr, pci_resource_len(pci, 0)); | ||
1391 | chip->ba1 = ioremap_nocache(chip->ba1_addr, pci_resource_len(pci, 1)); | ||
1392 | if (!chip->ba0 || !chip->ba1) { | ||
1393 | snd_cs4281_free(chip); | ||
1394 | return -ENOMEM; | ||
1395 | } | ||
1396 | |||
1397 | tmp = snd_cs4281_chip_init(chip); | 1397 | tmp = snd_cs4281_chip_init(chip); |
1398 | if (tmp) { | 1398 | if (tmp) { |
1399 | snd_cs4281_free(chip); | 1399 | snd_cs4281_free(chip); |
diff --git a/sound/pci/rme32.c b/sound/pci/rme32.c index 4dd53bfe0308..2cb9fe98db2f 100644 --- a/sound/pci/rme32.c +++ b/sound/pci/rme32.c | |||
@@ -1368,18 +1368,18 @@ static int __devinit snd_rme32_create(struct rme32 * rme32) | |||
1368 | return err; | 1368 | return err; |
1369 | rme32->port = pci_resource_start(rme32->pci, 0); | 1369 | rme32->port = pci_resource_start(rme32->pci, 0); |
1370 | 1370 | ||
1371 | if (request_irq(pci->irq, snd_rme32_interrupt, SA_INTERRUPT | SA_SHIRQ, "RME32", (void *) rme32)) { | ||
1372 | snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); | ||
1373 | return -EBUSY; | ||
1374 | } | ||
1375 | rme32->irq = pci->irq; | ||
1376 | |||
1377 | if ((rme32->iobase = ioremap_nocache(rme32->port, RME32_IO_SIZE)) == 0) { | 1371 | if ((rme32->iobase = ioremap_nocache(rme32->port, RME32_IO_SIZE)) == 0) { |
1378 | snd_printk(KERN_ERR "unable to remap memory region 0x%lx-0x%lx\n", | 1372 | snd_printk(KERN_ERR "unable to remap memory region 0x%lx-0x%lx\n", |
1379 | rme32->port, rme32->port + RME32_IO_SIZE - 1); | 1373 | rme32->port, rme32->port + RME32_IO_SIZE - 1); |
1380 | return -ENOMEM; | 1374 | return -ENOMEM; |
1381 | } | 1375 | } |
1382 | 1376 | ||
1377 | if (request_irq(pci->irq, snd_rme32_interrupt, SA_INTERRUPT | SA_SHIRQ, "RME32", (void *) rme32)) { | ||
1378 | snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); | ||
1379 | return -EBUSY; | ||
1380 | } | ||
1381 | rme32->irq = pci->irq; | ||
1382 | |||
1383 | /* read the card's revision number */ | 1383 | /* read the card's revision number */ |
1384 | pci_read_config_byte(pci, 8, &rme32->rev); | 1384 | pci_read_config_byte(pci, 8, &rme32->rev); |
1385 | 1385 | ||
diff --git a/sound/pci/rme96.c b/sound/pci/rme96.c index 65611a7d366d..991cb18c14f3 100644 --- a/sound/pci/rme96.c +++ b/sound/pci/rme96.c | |||
@@ -1583,17 +1583,17 @@ snd_rme96_create(struct rme96 *rme96) | |||
1583 | return err; | 1583 | return err; |
1584 | rme96->port = pci_resource_start(rme96->pci, 0); | 1584 | rme96->port = pci_resource_start(rme96->pci, 0); |
1585 | 1585 | ||
1586 | if ((rme96->iobase = ioremap_nocache(rme96->port, RME96_IO_SIZE)) == 0) { | ||
1587 | snd_printk(KERN_ERR "unable to remap memory region 0x%lx-0x%lx\n", rme96->port, rme96->port + RME96_IO_SIZE - 1); | ||
1588 | return -ENOMEM; | ||
1589 | } | ||
1590 | |||
1586 | if (request_irq(pci->irq, snd_rme96_interrupt, SA_INTERRUPT|SA_SHIRQ, "RME96", (void *)rme96)) { | 1591 | if (request_irq(pci->irq, snd_rme96_interrupt, SA_INTERRUPT|SA_SHIRQ, "RME96", (void *)rme96)) { |
1587 | snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); | 1592 | snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); |
1588 | return -EBUSY; | 1593 | return -EBUSY; |
1589 | } | 1594 | } |
1590 | rme96->irq = pci->irq; | 1595 | rme96->irq = pci->irq; |
1591 | 1596 | ||
1592 | if ((rme96->iobase = ioremap_nocache(rme96->port, RME96_IO_SIZE)) == 0) { | ||
1593 | snd_printk(KERN_ERR "unable to remap memory region 0x%lx-0x%lx\n", rme96->port, rme96->port + RME96_IO_SIZE - 1); | ||
1594 | return -ENOMEM; | ||
1595 | } | ||
1596 | |||
1597 | /* read the card's revision number */ | 1597 | /* read the card's revision number */ |
1598 | pci_read_config_byte(pci, 8, &rme96->rev); | 1598 | pci_read_config_byte(pci, 8, &rme96->rev); |
1599 | 1599 | ||