http://linux-sound.bkbits.net/linux-sound perex@suse.cz|ChangeSet|20040315202839|17583 perex diff -Nru a/sound/core/init.c b/sound/core/init.c --- a/sound/core/init.c Mon Mar 15 22:28:25 2004 +++ b/sound/core/init.c Mon Mar 15 22:28:25 2004 @@ -281,7 +281,8 @@ } if (card->private_free) card->private_free(card); - snd_info_unregister(card->proc_id); + if (card->proc_id) + snd_info_unregister(card->proc_id); if (snd_info_card_free(card) < 0) { snd_printk(KERN_WARNING "unable to free card info\n"); /* Not fatal error */ diff -Nru a/sound/drivers/serial-u16550.c b/sound/drivers/serial-u16550.c --- a/sound/drivers/serial-u16550.c Mon Mar 15 22:28:25 2004 +++ b/sound/drivers/serial-u16550.c Mon Mar 15 22:28:25 2004 @@ -342,7 +342,7 @@ unsigned char c; /* Do some vague tests for the presence of the uart */ - if (io_base == 0) { + if (io_base == 0 || io_base == SNDRV_AUTO_PORT) { return -ENODEV; /* Not configured */ } @@ -804,10 +804,9 @@ return err; } - if (irq >= 0) { + if (irq >= 0 && irq != SNDRV_AUTO_IRQ) { if (request_irq(irq, snd_uart16550_interrupt, SA_INTERRUPT, "Serial MIDI", (void *) uart)) { - uart->irq = -1; snd_printk("irq %d busy. Using Polling.\n", irq); } else { uart->irq = irq; diff -Nru a/sound/i2c/cs8427.c b/sound/i2c/cs8427.c --- a/sound/i2c/cs8427.c Mon Mar 15 22:28:25 2004 +++ b/sound/i2c/cs8427.c Mon Mar 15 22:28:25 2004 @@ -553,6 +553,7 @@ SNDRV_CTL_EVENT_MASK_VALUE, &chip->playback.pcm_ctl->id); reset = chip->rate != rate; + chip->rate = rate; snd_i2c_unlock(cs8427->bus); if (reset) snd_cs8427_reset(cs8427); diff -Nru a/sound/isa/dt019x.c b/sound/isa/dt019x.c --- a/sound/isa/dt019x.c Mon Mar 15 22:28:25 2004 +++ b/sound/isa/dt019x.c Mon Mar 15 22:28:25 2004 @@ -296,8 +296,8 @@ return res; dev++; return 0; - } - return -ENODEV; + } + return -ENODEV; } static void __devexit snd_dt019x_pnp_remove(struct pnp_card_link * pcard) @@ -322,8 +322,10 @@ cards += pnp_register_card_driver(&dt019x_pnpc_driver); #ifdef MODULE - if (!cards) + if (!cards) { + pnp_unregister_card_driver(&dt019x_pnpc_driver); snd_printk(KERN_ERR "no DT-019X / ALS-007 based soundcards found\n"); + } #endif return cards ? 0 : -ENODEV; } diff -Nru a/sound/isa/es1688/es1688.c b/sound/isa/es1688/es1688.c --- a/sound/isa/es1688/es1688.c Mon Mar 15 22:28:25 2004 +++ b/sound/isa/es1688/es1688.c Mon Mar 15 22:28:25 2004 @@ -182,7 +182,7 @@ static int __init alsa_card_es1688_init(void) { static unsigned long possible_ports[] = {0x220, 0x240, 0x260, -1}; - int dev, cards = 0; + int dev, cards = 0, i; for (dev = cards = 0; dev < SNDRV_CARDS && enable[dev]; dev++) { if (port[dev] == SNDRV_AUTO_PORT) @@ -190,7 +190,10 @@ if (snd_audiodrive_probe(dev) >= 0) cards++; } - cards += snd_legacy_auto_probe(possible_ports, snd_audiodrive_legacy_auto_probe); + i = snd_legacy_auto_probe(possible_ports, snd_audiodrive_legacy_auto_probe); + if (i > 0) + cards += i; + if (!cards) { #ifdef MODULE printk(KERN_ERR "ESS AudioDrive ES1688 soundcard not found or device busy\n"); diff -Nru a/sound/isa/es18xx.c b/sound/isa/es18xx.c --- a/sound/isa/es18xx.c Mon Mar 15 22:28:25 2004 +++ b/sound/isa/es18xx.c Mon Mar 15 22:28:25 2004 @@ -2232,7 +2232,7 @@ static int __init alsa_card_es18xx_init(void) { static unsigned long possible_ports[] = {0x220, 0x240, 0x260, 0x280, -1}; - int dev, cards = 0; + int dev, cards = 0, i; /* legacy non-auto cards at first */ for (dev = 0; dev < SNDRV_CARDS; dev++) { @@ -2246,10 +2246,16 @@ cards++; } /* legacy auto configured cards */ - cards += snd_legacy_auto_probe(possible_ports, snd_audiodrive_probe_legacy_port); + i = snd_legacy_auto_probe(possible_ports, snd_audiodrive_probe_legacy_port); + if (i > 0) + cards += i; + #ifdef CONFIG_PNP /* ISA PnP cards at last */ - cards += pnp_register_card_driver(&es18xx_pnpc_driver); + i = pnp_register_card_driver(&es18xx_pnpc_driver); + if (i > 0) + cards += i; + #endif if(!cards) { #ifdef CONFIG_PNP diff -Nru a/sound/isa/gus/gusclassic.c b/sound/isa/gus/gusclassic.c --- a/sound/isa/gus/gusclassic.c Mon Mar 15 22:28:25 2004 +++ b/sound/isa/gus/gusclassic.c Mon Mar 15 22:28:25 2004 @@ -238,7 +238,7 @@ static int __init alsa_card_gusclassic_init(void) { static unsigned long possible_ports[] = {0x220, 0x230, 0x240, 0x250, 0x260, -1}; - int dev, cards; + int dev, cards, i; for (dev = cards = 0; dev < SNDRV_CARDS && enable[dev]; dev++) { if (port[dev] == SNDRV_AUTO_PORT) @@ -246,7 +246,10 @@ if (snd_gusclassic_probe(dev) >= 0) cards++; } - cards += snd_legacy_auto_probe(possible_ports, snd_gusclassic_legacy_auto_probe); + i = snd_legacy_auto_probe(possible_ports, snd_gusclassic_legacy_auto_probe); + if (i > 0) + cards += i; + if (!cards) { #ifdef MODULE printk(KERN_ERR "GUS Classic soundcard not found or device busy\n"); diff -Nru a/sound/isa/gus/gusextreme.c b/sound/isa/gus/gusextreme.c --- a/sound/isa/gus/gusextreme.c Mon Mar 15 22:28:25 2004 +++ b/sound/isa/gus/gusextreme.c Mon Mar 15 22:28:25 2004 @@ -220,17 +220,17 @@ xgf1_irq = gf1_irq[dev]; if (xgf1_irq == SNDRV_AUTO_IRQ) { if ((xgf1_irq = snd_legacy_find_free_irq(possible_gf1_irqs)) < 0) { - snd_card_free(card); snd_printk("unable to find a free IRQ for GF1\n"); - return -EBUSY; + err = -EBUSY; + goto out; } } xess_irq = irq[dev]; if (xess_irq == SNDRV_AUTO_IRQ) { if ((xess_irq = snd_legacy_find_free_irq(possible_ess_irqs)) < 0) { - snd_card_free(card); snd_printk("unable to find a free IRQ for ES1688\n"); - return -EBUSY; + err = -EBUSY; + goto out; } } if (mpu_port[dev] == SNDRV_AUTO_PORT) @@ -241,26 +241,24 @@ xgf1_dma = dma1[dev]; if (xgf1_dma == SNDRV_AUTO_DMA) { if ((xgf1_dma = snd_legacy_find_free_dma(possible_gf1_dmas)) < 0) { - snd_card_free(card); snd_printk("unable to find a free DMA for GF1\n"); - return -EBUSY; + err = -EBUSY; + goto out; } } xess_dma = dma8[dev]; if (xess_dma == SNDRV_AUTO_DMA) { if ((xess_dma = snd_legacy_find_free_dma(possible_ess_dmas)) < 0) { - snd_card_free(card); snd_printk("unable to find a free DMA for ES1688\n"); - return -EBUSY; + err = -EBUSY; + goto out; } } if ((err = snd_es1688_create(card, port[dev], mpu_port[dev], xess_irq, xmpu_irq, xess_dma, - ES1688_HW_1688, &es1688)) < 0) { - snd_card_free(card); - return err; - } + ES1688_HW_1688, &es1688)) < 0) + goto out; if (gf1_port[dev] < 0) gf1_port[dev] = port[dev] + 0x20; if ((err = snd_gus_create(card, @@ -270,77 +268,65 @@ -1, 0, channels[dev], pcm_channels[dev], 0, - &gus)) < 0) { - snd_card_free(card); - return err; - } - if ((err = snd_gusextreme_detect(dev, card, gus, es1688)) < 0) { - snd_card_free(card); - return err; - } + &gus)) < 0) + goto out; + + if ((err = snd_gusextreme_detect(dev, card, gus, es1688)) < 0) + goto out; + snd_gusextreme_init(dev, gus); - if ((err = snd_gus_initialize(gus)) < 0) { - snd_card_free(card); - return err; - } + if ((err = snd_gus_initialize(gus)) < 0) + goto out; + if (!gus->ess_flag) { snd_printdd("GUS Extreme soundcard was not detected at 0x%lx\n", gus->gf1.port); - snd_card_free(card); - return -ENODEV; - } - if ((err = snd_es1688_pcm(es1688, 0, NULL)) < 0) { - snd_card_free(card); - return err; - } - if ((err = snd_es1688_mixer(es1688)) < 0) { - snd_card_free(card); - return err; + err = -ENODEV; + goto out; } + if ((err = snd_es1688_pcm(es1688, 0, NULL)) < 0) + goto out; + + if ((err = snd_es1688_mixer(es1688)) < 0) + goto out; + snd_component_add(card, "ES1688"); if (pcm_channels[dev] > 0) { - if ((err = snd_gf1_pcm_new(gus, 1, 1, NULL)) < 0) { - snd_card_free(card); - return err; - } - } - if ((err = snd_gf1_new_mixer(gus)) < 0) { - snd_card_free(card); - return err; - } - if ((err = snd_gusextreme_mixer(es1688)) < 0) { - snd_card_free(card); - return err; + if ((err = snd_gf1_pcm_new(gus, 1, 1, NULL)) < 0) + goto out; } + if ((err = snd_gf1_new_mixer(gus)) < 0) + goto out; + + if ((err = snd_gusextreme_mixer(es1688)) < 0) + goto out; if (snd_opl3_create(card, es1688->port, es1688->port + 2, OPL3_HW_OPL3, 0, &opl3) < 0) { printk(KERN_ERR "gusextreme: opl3 not detected at 0x%lx\n", es1688->port); } else { - if ((err = snd_opl3_hwdep_new(opl3, 0, 2, NULL)) < 0) { - snd_card_free(card); - return err; - } + if ((err = snd_opl3_hwdep_new(opl3, 0, 2, NULL)) < 0) + goto out; } - if (es1688->mpu_port >= 0x300) { - if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_ES1688, + if (es1688->mpu_port >= 0x300 && + (err = snd_mpu401_uart_new(card, 0, MPU401_HW_ES1688, es1688->mpu_port, 0, xmpu_irq, SA_INTERRUPT, - NULL)) < 0) { - snd_card_free(card); - return err; - } - } + NULL)) < 0) + goto out; sprintf(card->longname, "Gravis UltraSound Extreme at 0x%lx, irq %i&%i, dma %i&%i", es1688->port, xgf1_irq, xess_irq, xgf1_dma, xess_dma); - if ((err = snd_card_register(card)) < 0) { - snd_card_free(card); - return err; - } + if ((err = snd_card_register(card)) < 0) + goto out; + snd_gusextreme_cards[dev] = card; return 0; + + out: + snd_card_free(card); + return err; } static int __init snd_gusextreme_legacy_auto_probe(unsigned long xport) @@ -363,7 +349,7 @@ static int __init alsa_card_gusextreme_init(void) { static unsigned long possible_ports[] = {0x220, 0x240, 0x260, -1}; - int dev, cards; + int dev, cards, i; for (dev = cards = 0; dev < SNDRV_CARDS && enable[dev] > 0; dev++) { if (port[dev] == SNDRV_AUTO_PORT) @@ -371,7 +357,10 @@ if (snd_gusextreme_probe(dev) >= 0) cards++; } - cards += snd_legacy_auto_probe(possible_ports, snd_gusextreme_legacy_auto_probe); + i = snd_legacy_auto_probe(possible_ports, snd_gusextreme_legacy_auto_probe); + if (i > 0) + cards += i; + if (!cards) { #ifdef MODULE printk(KERN_ERR "GUS Extreme soundcard not found or device busy\n"); diff -Nru a/sound/isa/gus/gusmax.c b/sound/isa/gus/gusmax.c --- a/sound/isa/gus/gusmax.c Mon Mar 15 22:28:25 2004 +++ b/sound/isa/gus/gusmax.c Mon Mar 15 22:28:25 2004 @@ -378,7 +378,7 @@ static int __init alsa_card_gusmax_init(void) { static unsigned long possible_ports[] = {0x220, 0x230, 0x240, 0x250, 0x260, -1}; - int dev, cards; + int dev, cards, i; for (dev = cards = 0; dev < SNDRV_CARDS && enable[dev] > 0; dev++) { if (port[dev] == SNDRV_AUTO_PORT) @@ -386,7 +386,10 @@ if (snd_gusmax_probe(dev) >= 0) cards++; } - cards += snd_legacy_auto_probe(possible_ports, snd_gusmax_legacy_auto_probe); + i = snd_legacy_auto_probe(possible_ports, snd_gusmax_legacy_auto_probe); + if (i > 0) + cards += i; + if (!cards) { #ifdef MODULE printk(KERN_ERR "GUS MAX soundcard not found or device busy\n"); diff -Nru a/sound/isa/gus/interwave.c b/sound/isa/gus/interwave.c --- a/sound/isa/gus/interwave.c Mon Mar 15 22:28:25 2004 +++ b/sound/isa/gus/interwave.c Mon Mar 15 22:28:25 2004 @@ -929,7 +929,7 @@ static int __init alsa_card_interwave_init(void) { - int cards = 0; + int cards = 0, i; static long possible_ports[] = {0x210, 0x220, 0x230, 0x240, 0x250, 0x260, -1}; int dev; @@ -949,10 +949,14 @@ #endif } /* legacy auto configured cards */ - cards += snd_legacy_auto_probe(possible_ports, snd_interwave_probe_legacy_port); + i = snd_legacy_auto_probe(possible_ports, snd_interwave_probe_legacy_port); + if (i > 0) + cards += i; #ifdef CONFIG_PNP - /* ISA PnP cards */ - cards += pnp_register_card_driver(&interwave_pnpc_driver); + /* ISA PnP cards */ + i = pnp_register_card_driver(&interwave_pnpc_driver); + if (i > 0) + cards += i; #endif if (!cards) { diff -Nru a/sound/isa/sb/es968.c b/sound/isa/sb/es968.c --- a/sound/isa/sb/es968.c Mon Mar 15 22:28:25 2004 +++ b/sound/isa/sb/es968.c Mon Mar 15 22:28:25 2004 @@ -203,8 +203,8 @@ return res; dev++; return 0; - } - return -ENODEV; + } + return -ENODEV; } static void __devexit snd_es968_pnp_remove(struct pnp_card_link * pcard) @@ -225,15 +225,14 @@ static int __init alsa_card_es968_init(void) { - int res = pnp_register_card_driver(&es968_pnpc_driver); - if (res == 0) - { - pnp_unregister_card_driver(&es968_pnpc_driver); + int cards = pnp_register_card_driver(&es968_pnpc_driver); #ifdef MODULE + if (cards == 0) { + pnp_unregister_card_driver(&es968_pnpc_driver); snd_printk(KERN_ERR "no ES968 based soundcards found\n"); -#endif } - return res < 0 ? res : 0; +#endif + return cards ? 0 : -ENODEV; } static void __exit alsa_card_es968_exit(void) diff -Nru a/sound/isa/sb/sb16.c b/sound/isa/sb/sb16.c --- a/sound/isa/sb/sb16.c Mon Mar 15 22:28:25 2004 +++ b/sound/isa/sb/sb16.c Mon Mar 15 22:28:25 2004 @@ -629,7 +629,7 @@ static int __init alsa_card_sb16_init(void) { - int dev, cards = 0; + int dev, cards = 0, i; static unsigned long possible_ports[] = {0x220, 0x240, 0x260, 0x280, -1}; /* legacy non-auto cards at first */ @@ -649,10 +649,15 @@ #endif } /* legacy auto configured cards */ - cards += snd_legacy_auto_probe(possible_ports, snd_sb16_probe_legacy_port); + i = snd_legacy_auto_probe(possible_ports, snd_sb16_probe_legacy_port); + if (i > 0) + cards += i; + #ifdef CONFIG_PNP /* PnP cards at last */ - cards += pnp_register_card_driver(&sb16_pnpc_driver); + i = pnp_register_card_driver(&sb16_pnpc_driver); + if (i >0) + cards += i; #endif if (!cards) { diff -Nru a/sound/isa/sb/sb8.c b/sound/isa/sb/sb8.c --- a/sound/isa/sb/sb8.c Mon Mar 15 22:28:25 2004 +++ b/sound/isa/sb/sb8.c Mon Mar 15 22:28:25 2004 @@ -199,7 +199,7 @@ static int __init alsa_card_sb8_init(void) { static unsigned long possible_ports[] = {0x220, 0x240, 0x260, -1}; - int dev, cards; + int dev, cards, i; for (dev = cards = 0; dev < SNDRV_CARDS && enable[dev]; dev++) { if (port[dev] == SNDRV_AUTO_PORT) @@ -207,7 +207,10 @@ if (snd_sb8_probe(dev) >= 0) cards++; } - cards += snd_legacy_auto_probe(possible_ports, snd_card_sb8_legacy_auto_probe); + i = snd_legacy_auto_probe(possible_ports, snd_card_sb8_legacy_auto_probe); + if (i > 0) + cards += i; + if (!cards) { #ifdef MODULE snd_printk(KERN_ERR "Sound Blaster soundcard not found or device busy\n"); diff -Nru a/sound/pci/emu10k1/emu10k1_callback.c b/sound/pci/emu10k1/emu10k1_callback.c --- a/sound/pci/emu10k1/emu10k1_callback.c Mon Mar 15 22:28:25 2004 +++ b/sound/pci/emu10k1/emu10k1_callback.c Mon Mar 15 22:28:25 2004 @@ -426,7 +426,7 @@ snd_emu10k1_ptr_write(hw, CDF, ch, sample); /* invalidate maps */ - temp = ((unsigned int)hw->silent_page_dmaaddr << 1) | MAP_PTI_MASK; + temp = ((unsigned int)hw->silent_page.addr << 1) | MAP_PTI_MASK; snd_emu10k1_ptr_write(hw, MAPA, ch, temp); snd_emu10k1_ptr_write(hw, MAPB, ch, temp); diff -Nru a/sound/pci/emu10k1/memory.c b/sound/pci/emu10k1/memory.c --- a/sound/pci/emu10k1/memory.c Mon Mar 15 22:28:25 2004 +++ b/sound/pci/emu10k1/memory.c Mon Mar 15 22:28:25 2004 @@ -62,7 +62,7 @@ page *= UNIT_PAGES; for (i = 0; i < UNIT_PAGES; i++, page++) /* do not increment ptr */ - __set_ptb_entry(emu, page, emu->silent_page_dmaaddr); + __set_ptb_entry(emu, page, emu->silent_page.addr); } #endif /* PAGE_SIZE */ diff -Nru a/sound/pci/trident/trident_memory.c b/sound/pci/trident/trident_memory.c --- a/sound/pci/trident/trident_memory.c Mon Mar 15 22:28:25 2004 +++ b/sound/pci/trident/trident_memory.c Mon Mar 15 22:28:25 2004 @@ -76,8 +76,8 @@ static inline void set_silent_tlb(trident_t *trident, int page) { page <<= 1; - __set_tlb_bus(trident, page, (unsigned long)trident->tlb.silent_page, trident->tlb.silent_page_dmaaddr); - __set_tlb_bus(trident, page+1, (unsigned long)trident->tlb.silent_page, trident->tlb.silent_page_dmaaddr); + __set_tlb_bus(trident, page, (unsigned long)trident->tlb.silent_page.area, trident->tlb.silent_page.addr); + __set_tlb_bus(trident, page+1, (unsigned long)trident->tlb.silent_page.area, trident->tlb.silent_page.addr); } #else @@ -111,7 +111,7 @@ int i; page *= UNIT_PAGES; for (i = 0; i < UNIT_PAGES; i++, page++) - __set_tlb_bus(trident, page, (unsigned long)trident->tlb.silent_page, trident->tlb.silent_page_dmaaddr); + __set_tlb_bus(trident, page, (unsigned long)trident->tlb.silent_page.area, trident->tlb.silent_page.addr); } #endif /* PAGE_SIZE */