X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sound%2Fisa%2Fwavefront%2Fwavefront.c;h=85db535aea9b595271b9ccecd43ec548dcd30b6e;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=0275fa4cbb92f0c0dd991eaf1c27abf02a9970bf;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/sound/isa/wavefront/wavefront.c b/sound/isa/wavefront/wavefront.c index 0275fa4cb..85db535ae 100644 --- a/sound/isa/wavefront/wavefront.c +++ b/sound/isa/wavefront/wavefront.c @@ -23,20 +23,19 @@ #include #include #include +#include +#include #include +#include #include -#define SNDRV_GET_ID #include #include #include -#define chip_t cs4231_t - MODULE_AUTHOR("Paul Barton-Davis "); MODULE_DESCRIPTION("Turtle Beach Wavefront"); MODULE_LICENSE("GPL"); -MODULE_CLASSES("{sound}"); -MODULE_DEVICES("{{Turtle Beach,Maui/Tropez/Tropez+}}"); +MODULE_SUPPORTED_DEVICE("{{Turtle Beach,Maui/Tropez/Tropez+}}"); static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ @@ -51,56 +50,43 @@ static int ics2115_irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ; /* 2,9,11,12,15 */ static long fm_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT; /* PnP setup */ static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; /* 0,1,3,5,6,7 */ static int dma2[SNDRV_CARDS] = SNDRV_DEFAULT_DMA; /* 0,1,3,5,6,7 */ -static int use_cs4232_midi[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0}; +static int use_cs4232_midi[SNDRV_CARDS]; -MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +module_param_array(index, int, NULL, 0444); MODULE_PARM_DESC(index, "Index value for WaveFront soundcard."); -MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC); -MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s"); +module_param_array(id, charp, NULL, 0444); MODULE_PARM_DESC(id, "ID string for WaveFront soundcard."); -MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC); -MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +module_param_array(enable, bool, NULL, 0444); MODULE_PARM_DESC(enable, "Enable WaveFront soundcard."); -MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC); #ifdef CONFIG_PNP -MODULE_PARM(isapnp, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +module_param_array(isapnp, bool, NULL, 0444); MODULE_PARM_DESC(isapnp, "ISA PnP detection for WaveFront soundcards."); -MODULE_PARM_SYNTAX(isapnp, SNDRV_ISAPNP_DESC); #endif -MODULE_PARM(cs4232_pcm_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l"); +module_param_array(cs4232_pcm_port, long, NULL, 0444); MODULE_PARM_DESC(cs4232_pcm_port, "Port # for CS4232 PCM interface."); -MODULE_PARM_SYNTAX(cs4232_pcm_port, SNDRV_PORT12_DESC); -MODULE_PARM(cs4232_pcm_irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +module_param_array(cs4232_pcm_irq, int, NULL, 0444); MODULE_PARM_DESC(cs4232_pcm_irq, "IRQ # for CS4232 PCM interface."); -MODULE_PARM_SYNTAX(cs4232_pcm_irq, SNDRV_ENABLED ",allows:{{5},{7},{9},{11},{12},{15}},dialog:list"); -MODULE_PARM(dma1, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +module_param_array(dma1, int, NULL, 0444); MODULE_PARM_DESC(dma1, "DMA1 # for CS4232 PCM interface."); -MODULE_PARM_SYNTAX(dma1, SNDRV_DMA_DESC); -MODULE_PARM(dma2, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +module_param_array(dma2, int, NULL, 0444); MODULE_PARM_DESC(dma2, "DMA2 # for CS4232 PCM interface."); -MODULE_PARM_SYNTAX(dma2, SNDRV_DMA_DESC); -MODULE_PARM(cs4232_mpu_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l"); +module_param_array(cs4232_mpu_port, long, NULL, 0444); MODULE_PARM_DESC(cs4232_mpu_port, "port # for CS4232 MPU-401 interface."); -MODULE_PARM_SYNTAX(cs4232_mpu_port, SNDRV_PORT12_DESC); -MODULE_PARM(cs4232_mpu_irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +module_param_array(cs4232_mpu_irq, int, NULL, 0444); MODULE_PARM_DESC(cs4232_mpu_irq, "IRQ # for CS4232 MPU-401 interface."); -MODULE_PARM_SYNTAX(cs4232_mpu_irq, SNDRV_ENABLED ",allows:{{9},{11},{12},{15}},dialog:list"); -MODULE_PARM(ics2115_irq, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +module_param_array(ics2115_irq, int, NULL, 0444); MODULE_PARM_DESC(ics2115_irq, "IRQ # for ICS2115."); -MODULE_PARM_SYNTAX(ics2115_irq, SNDRV_ENABLED ",allows:{{9},{11},{12},{15}},dialog:list"); -MODULE_PARM(ics2115_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l"); +module_param_array(ics2115_port, long, NULL, 0444); MODULE_PARM_DESC(ics2115_port, "Port # for ICS2115."); -MODULE_PARM_SYNTAX(ics2115_port, SNDRV_PORT12_DESC); -MODULE_PARM(fm_port, "1-" __MODULE_STRING(SNDRV_CARDS) "l"); +module_param_array(fm_port, long, NULL, 0444); MODULE_PARM_DESC(fm_port, "FM port #."); -MODULE_PARM_SYNTAX(fm_port, SNDRV_PORT12_DESC); -MODULE_PARM(use_cs4232_midi, "1-" __MODULE_STRING(SNDRV_CARDS) "i"); +module_param_array(use_cs4232_midi, bool, NULL, 0444); MODULE_PARM_DESC(use_cs4232_midi, "Use CS4232 MPU-401 interface (inaccessibly located inside your computer)"); -MODULE_PARM_SYNTAX(use_cs4232_midi, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC); -static snd_card_t *snd_wavefront_legacy[SNDRV_CARDS] = SNDRV_DEFAULT_PTR; +static struct platform_device *platform_devices[SNDRV_CARDS]; #ifdef CONFIG_PNP +static int pnp_registered; static struct pnp_card_device_id snd_wavefront_pnpids[] = { /* Tropez */ @@ -257,7 +243,7 @@ snd_wavefront_pnp (int dev, snd_wavefront_card_t *acard, struct pnp_card_link *c cs4232_mpu_irq[dev] = pnp_irq(pdev, 0); } - snd_printk ("CS4232 MPU: port=0x%lx, irq=%i\n", + snd_printk (KERN_INFO "CS4232 MPU: port=0x%lx, irq=%i\n", cs4232_mpu_port[dev], cs4232_mpu_irq[dev]); } @@ -277,9 +263,7 @@ snd_wavefront_pnp (int dev, snd_wavefront_card_t *acard, struct pnp_card_link *c #endif /* CONFIG_PNP */ -static irqreturn_t snd_wavefront_ics2115_interrupt(int irq, - void *dev_id, - struct pt_regs *regs) +static irqreturn_t snd_wavefront_ics2115_interrupt(int irq, void *dev_id) { snd_wavefront_card_t *acard; @@ -296,12 +280,12 @@ static irqreturn_t snd_wavefront_ics2115_interrupt(int irq, return IRQ_HANDLED; } -snd_hwdep_t * __devinit -snd_wavefront_new_synth (snd_card_t *card, +static struct snd_hwdep * __devinit +snd_wavefront_new_synth (struct snd_card *card, int hw_dev, snd_wavefront_card_t *acard) { - snd_hwdep_t *wavefront_synth; + struct snd_hwdep *wavefront_synth; if (snd_wavefront_detect (acard) < 0) { return NULL; @@ -322,17 +306,17 @@ snd_wavefront_new_synth (snd_card_t *card, return wavefront_synth; } -snd_hwdep_t * __devinit -snd_wavefront_new_fx (snd_card_t *card, +static struct snd_hwdep * __devinit +snd_wavefront_new_fx (struct snd_card *card, int hw_dev, snd_wavefront_card_t *acard, unsigned long port) { - snd_hwdep_t *fx_processor; + struct snd_hwdep *fx_processor; if (snd_wavefront_fx_start (&acard->wavefront)) { - snd_printk ("cannot initialize YSS225 FX processor"); + snd_printk (KERN_ERR "cannot initialize YSS225 FX processor"); return NULL; } @@ -349,22 +333,22 @@ snd_wavefront_new_fx (snd_card_t *card, static snd_wavefront_mpu_id internal_id = internal_mpu; static snd_wavefront_mpu_id external_id = external_mpu; -snd_rawmidi_t * __devinit -snd_wavefront_new_midi (snd_card_t *card, +static struct snd_rawmidi *__devinit +snd_wavefront_new_midi (struct snd_card *card, int midi_dev, snd_wavefront_card_t *acard, unsigned long port, snd_wavefront_mpu_id mpu) { - snd_rawmidi_t *rmidi; + struct snd_rawmidi *rmidi; static int first = 1; if (first) { first = 0; acard->wavefront.midi.base = port; if (snd_wavefront_midi_start (acard)) { - snd_printk ("cannot initialize MIDI interface\n"); + snd_printk (KERN_ERR "cannot initialize MIDI interface\n"); return NULL; } } @@ -391,56 +375,28 @@ snd_wavefront_new_midi (snd_card_t *card, } static void -snd_wavefront_free(snd_card_t *card) +snd_wavefront_free(struct snd_card *card) { snd_wavefront_card_t *acard = (snd_wavefront_card_t *)card->private_data; if (acard) { - if (acard->wavefront.res_base != NULL) { - release_resource(acard->wavefront.res_base); - kfree_nocheck(acard->wavefront.res_base); - } + release_and_free_resource(acard->wavefront.res_base); if (acard->wavefront.irq > 0) free_irq(acard->wavefront.irq, (void *)acard); } } -static int __devinit -snd_wavefront_probe (int dev, struct pnp_card_link *pcard, - const struct pnp_card_device_id *pid) +static struct snd_card *snd_wavefront_card_new(int dev) { - snd_card_t *card; + struct snd_card *card; snd_wavefront_card_t *acard; - cs4231_t *chip; - snd_hwdep_t *wavefront_synth; - snd_rawmidi_t *ics2115_internal_rmidi = NULL; - snd_rawmidi_t *ics2115_external_rmidi = NULL; - snd_hwdep_t *fx_processor; - int hw_dev = 0, midi_dev = 0, err; -#ifdef CONFIG_PNP - if (!isapnp[dev]) { -#endif - if (cs4232_pcm_port[dev] == SNDRV_AUTO_PORT) { - snd_printk("specify CS4232 port\n"); - return -EINVAL; - } - if (ics2115_port[dev] == SNDRV_AUTO_PORT) { - snd_printk("specify ICS2115 port\n"); - return -ENODEV; - } -#ifdef CONFIG_PNP - } -#endif - card = snd_card_new (index[dev], - id[dev], - THIS_MODULE, + card = snd_card_new (index[dev], id[dev], THIS_MODULE, sizeof(snd_wavefront_card_t)); + if (card == NULL) + return NULL; - if (card == NULL) { - return -ENOMEM; - } - acard = (snd_wavefront_card_t *)card->private_data; + acard = card->private_data; acard->wavefront.irq = -1; spin_lock_init(&acard->wavefront.irq_lock); init_waitqueue_head(&acard->wavefront.interrupt_sleeper); @@ -448,18 +404,19 @@ snd_wavefront_probe (int dev, struct pnp_card_link *pcard, spin_lock_init(&acard->wavefront.midi.virtual); card->private_free = snd_wavefront_free; -#ifdef CONFIG_PNP - if (isapnp[dev]) { - if (snd_wavefront_pnp (dev, acard, pcard, pid) < 0) { - if (cs4232_pcm_port[dev] == SNDRV_AUTO_PORT) { - snd_printk ("isapnp detection failed\n"); - snd_card_free (card); - return -ENODEV; - } - } - snd_card_set_dev(card, &pcard->card->dev); - } -#endif /* CONFIG_PNP */ + return card; +} + +static int __devinit +snd_wavefront_probe (struct snd_card *card, int dev) +{ + snd_wavefront_card_t *acard = card->private_data; + struct snd_cs4231 *chip; + struct snd_hwdep *wavefront_synth; + struct snd_rawmidi *ics2115_internal_rmidi = NULL; + struct snd_rawmidi *ics2115_external_rmidi = NULL; + struct snd_hwdep *fx_processor; + int hw_dev = 0, midi_dev = 0, err; /* --------- PCM --------------- */ @@ -470,52 +427,46 @@ snd_wavefront_probe (int dev, struct pnp_card_link *pcard, dma1[dev], dma2[dev], CS4231_HW_DETECT, 0, &chip)) < 0) { - snd_card_free(card); - snd_printk ("can't allocate CS4231 device\n"); + snd_printk (KERN_ERR "can't allocate CS4231 device\n"); return err; } - if ((err = snd_cs4231_pcm (chip, 0, NULL)) < 0) { - snd_card_free(card); + if ((err = snd_cs4231_pcm (chip, 0, NULL)) < 0) return err; - } - if ((err = snd_cs4231_timer (chip, 0, NULL)) < 0) { - snd_card_free(card); + + if ((err = snd_cs4231_timer (chip, 0, NULL)) < 0) return err; - } /* ---------- OPL3 synth --------- */ if (fm_port[dev] > 0 && fm_port[dev] != SNDRV_AUTO_PORT) { - opl3_t *opl3; + struct snd_opl3 *opl3; if ((err = snd_opl3_create(card, fm_port[dev], fm_port[dev] + 2, OPL3_HW_OPL3_CS, 0, &opl3)) < 0) { - snd_printk ("can't allocate or detect OPL3 synth\n"); - snd_card_free(card); + snd_printk (KERN_ERR "can't allocate or detect OPL3 synth\n"); return err; } - if ((err = snd_opl3_hwdep_new(opl3, hw_dev, 1, NULL)) < 0) { - snd_card_free(card); + if ((err = snd_opl3_hwdep_new(opl3, hw_dev, 1, NULL)) < 0) return err; - } hw_dev++; } /* ------- ICS2115 Wavetable synth ------- */ - if ((acard->wavefront.res_base = request_region(ics2115_port[dev], 16, "ICS2115")) == NULL) { - snd_printk("unable to grab ICS2115 i/o region 0x%lx-0x%lx\n", ics2115_port[dev], ics2115_port[dev] + 16 - 1); - snd_card_free(card); + if ((acard->wavefront.res_base = request_region(ics2115_port[dev], 16, + "ICS2115")) == NULL) { + snd_printk(KERN_ERR "unable to grab ICS2115 i/o region 0x%lx-0x%lx\n", + ics2115_port[dev], ics2115_port[dev] + 16 - 1); return -EBUSY; } - if (request_irq(ics2115_irq[dev], snd_wavefront_ics2115_interrupt, SA_INTERRUPT, "ICS2115", (void *)acard)) { - snd_printk("unable to use ICS2115 IRQ %d\n", ics2115_irq[dev]); - snd_card_free(card); + if (request_irq(ics2115_irq[dev], snd_wavefront_ics2115_interrupt, + IRQF_DISABLED, "ICS2115", acard)) { + snd_printk(KERN_ERR "unable to use ICS2115 IRQ %d\n", ics2115_irq[dev]); return -EBUSY; } @@ -523,8 +474,7 @@ snd_wavefront_probe (int dev, struct pnp_card_link *pcard, acard->wavefront.base = ics2115_port[dev]; if ((wavefront_synth = snd_wavefront_new_synth (card, hw_dev, acard)) == NULL) { - snd_printk ("can't create WaveFront synth device\n"); - snd_card_free(card); + snd_printk (KERN_ERR "can't create WaveFront synth device\n"); return -ENOMEM; } @@ -535,8 +485,7 @@ snd_wavefront_probe (int dev, struct pnp_card_link *pcard, /* --------- Mixer ------------ */ if ((err = snd_cs4231_mixer(chip)) < 0) { - snd_printk ("can't allocate mixer device\n"); - snd_card_free(card); + snd_printk (KERN_ERR "can't allocate mixer device\n"); return err; } @@ -546,10 +495,9 @@ snd_wavefront_probe (int dev, struct pnp_card_link *pcard, if ((err = snd_mpu401_uart_new(card, midi_dev, MPU401_HW_CS4232, cs4232_mpu_port[dev], 0, cs4232_mpu_irq[dev], - SA_INTERRUPT, + IRQF_DISABLED, NULL)) < 0) { - snd_printk ("can't allocate CS4232 MPU-401 device\n"); - snd_card_free(card); + snd_printk (KERN_ERR "can't allocate CS4232 MPU-401 device\n"); return err; } midi_dev++; @@ -565,8 +513,7 @@ snd_wavefront_probe (int dev, struct pnp_card_link *pcard, ics2115_port[dev], internal_mpu); if (ics2115_internal_rmidi == NULL) { - snd_printk ("can't setup ICS2115 internal MIDI device\n"); - snd_card_free(card); + snd_printk (KERN_ERR "can't setup ICS2115 internal MIDI device\n"); return -ENOMEM; } midi_dev++; @@ -582,8 +529,7 @@ snd_wavefront_probe (int dev, struct pnp_card_link *pcard, ics2115_port[dev], external_mpu); if (ics2115_external_rmidi == NULL) { - snd_printk ("can't setup ICS2115 external MIDI device\n"); - snd_card_free(card); + snd_printk (KERN_ERR "can't setup ICS2115 external MIDI device\n"); return -ENOMEM; } midi_dev++; @@ -597,8 +543,7 @@ snd_wavefront_probe (int dev, struct pnp_card_link *pcard, acard, ics2115_port[dev]); if (fx_processor == NULL) { - snd_printk ("can't setup FX device\n"); - snd_card_free(card); + snd_printk (KERN_ERR "can't setup FX device\n"); return -ENOMEM; } @@ -639,44 +584,99 @@ snd_wavefront_probe (int dev, struct pnp_card_link *pcard, ics2115_port[dev], ics2115_irq[dev]); - if ((err = snd_card_register(card)) < 0) { + return snd_card_register(card); +} + +static int __devinit snd_wavefront_nonpnp_probe(struct platform_device *pdev) +{ + int dev = pdev->id; + struct snd_card *card; + int err; + + if (cs4232_pcm_port[dev] == SNDRV_AUTO_PORT) { + snd_printk("specify CS4232 port\n"); + return -EINVAL; + } + if (ics2115_port[dev] == SNDRV_AUTO_PORT) { + snd_printk("specify ICS2115 port\n"); + return -ENODEV; + } + + card = snd_wavefront_card_new(dev); + if (! card) + return -ENOMEM; + snd_card_set_dev(card, &pdev->dev); + if ((err = snd_wavefront_probe(card, dev)) < 0) { snd_card_free(card); return err; } - if (pcard) - pnp_set_card_drvdata(pcard, card); - else - snd_wavefront_legacy[dev] = card; + + platform_set_drvdata(pdev, card); return 0; -} +} + +static int __devexit snd_wavefront_nonpnp_remove(struct platform_device *devptr) +{ + snd_card_free(platform_get_drvdata(devptr)); + platform_set_drvdata(devptr, NULL); + return 0; +} + +#define WAVEFRONT_DRIVER "snd_wavefront" + +static struct platform_driver snd_wavefront_driver = { + .probe = snd_wavefront_nonpnp_probe, + .remove = __devexit_p(snd_wavefront_nonpnp_remove), + /* FIXME: suspend, resume */ + .driver = { + .name = WAVEFRONT_DRIVER + }, +}; + #ifdef CONFIG_PNP +static unsigned int __devinitdata wavefront_pnp_devices; -static int __devinit snd_wavefront_pnp_detect(struct pnp_card_link *card, - const struct pnp_card_device_id *id) +static int __devinit snd_wavefront_pnp_detect(struct pnp_card_link *pcard, + const struct pnp_card_device_id *pid) { - static int dev; - int res; - - for ( ; dev < SNDRV_CARDS; dev++) { - if (!enable[dev] || !isapnp[dev]) - continue; - res = snd_wavefront_probe(dev, card, id); - if (res < 0) - return res; - dev++; - return 0; - } - - return -ENODEV; + static int dev; + struct snd_card *card; + int res; + + for ( ; dev < SNDRV_CARDS; dev++) { + if (enable[dev] && isapnp[dev]) + break; + } + if (dev >= SNDRV_CARDS) + return -ENODEV; + + card = snd_wavefront_card_new(dev); + if (! card) + return -ENOMEM; + + if (snd_wavefront_pnp (dev, card->private_data, pcard, pid) < 0) { + if (cs4232_pcm_port[dev] == SNDRV_AUTO_PORT) { + snd_printk (KERN_ERR "isapnp detection failed\n"); + snd_card_free (card); + return -ENODEV; + } + } + snd_card_set_dev(card, &pcard->card->dev); + + if ((res = snd_wavefront_probe(card, dev)) < 0) + return res; + + pnp_set_card_drvdata(pcard, card); + dev++; + wavefront_pnp_devices++; + return 0; } static void __devexit snd_wavefront_pnp_remove(struct pnp_card_link * pcard) { - snd_card_t *card = (snd_card_t *) pnp_get_card_drvdata(pcard); - - snd_card_disconnect(card); - snd_card_free_in_thread(card); + snd_card_free(pnp_get_card_drvdata(pcard)); + pnp_set_card_drvdata(pcard, NULL); } static struct pnp_card_driver wavefront_pnpc_driver = { @@ -685,34 +685,64 @@ static struct pnp_card_driver wavefront_pnpc_driver = { .id_table = snd_wavefront_pnpids, .probe = snd_wavefront_pnp_detect, .remove = __devexit_p(snd_wavefront_pnp_remove), + /* FIXME: suspend,resume */ }; #endif /* CONFIG_PNP */ +static void __init_or_module snd_wavefront_unregister_all(void) +{ + int i; + +#ifdef CONFIG_PNP + if (pnp_registered) + pnp_unregister_card_driver(&wavefront_pnpc_driver); +#endif + for (i = 0; i < ARRAY_SIZE(platform_devices); ++i) + platform_device_unregister(platform_devices[i]); + platform_driver_unregister(&snd_wavefront_driver); +} + static int __init alsa_card_wavefront_init(void) { - int cards = 0; - int dev; - for (dev = 0; dev < SNDRV_CARDS; dev++) { - if (!enable[dev]) + int i, err, cards = 0; + + if ((err = platform_driver_register(&snd_wavefront_driver)) < 0) + return err; + + for (i = 0; i < SNDRV_CARDS; i++) { + struct platform_device *device; + if (! enable[i]) continue; #ifdef CONFIG_PNP - if (isapnp[dev]) + if (isapnp[i]) continue; #endif - if (snd_wavefront_probe(dev, NULL, NULL) >= 0) - cards++; + device = platform_device_register_simple(WAVEFRONT_DRIVER, + i, NULL, 0); + if (IS_ERR(device)) + continue; + if (!platform_get_drvdata(device)) { + platform_device_unregister(device); + continue; + } + platform_devices[i] = device; + cards++; } + #ifdef CONFIG_PNP - cards += pnp_register_card_driver(&wavefront_pnpc_driver); + err = pnp_register_card_driver(&wavefront_pnpc_driver); + if (!err) { + pnp_registered = 1; + cards += wavefront_pnp_devices; + } #endif + if (!cards) { -#ifdef CONFIG_PNP - pnp_unregister_card_driver(&wavefront_pnpc_driver); -#endif #ifdef MODULE printk (KERN_ERR "No WaveFront cards found or devices busy\n"); #endif + snd_wavefront_unregister_all(); return -ENODEV; } return 0; @@ -720,52 +750,8 @@ static int __init alsa_card_wavefront_init(void) static void __exit alsa_card_wavefront_exit(void) { - int idx; - -#ifdef CONFIG_PNP - pnp_unregister_card_driver(&wavefront_pnpc_driver); -#endif - for (idx = 0; idx < SNDRV_CARDS; idx++) - snd_card_free(snd_wavefront_legacy[idx]); + snd_wavefront_unregister_all(); } module_init(alsa_card_wavefront_init) module_exit(alsa_card_wavefront_exit) - -#ifndef MODULE - -/* format is: snd-wavefront=enable,index,id,isapnp, - cs4232_pcm_port,cs4232_pcm_irq, - cs4232_mpu_port,cs4232_mpu_irq, - ics2115_port,ics2115_irq, - fm_port, - dma1,dma2, - use_cs4232_midi */ - -static int __init alsa_card_wavefront_setup(char *str) -{ - static unsigned __initdata nr_dev = 0; - - if (nr_dev >= SNDRV_CARDS) - return 0; - (void)(get_option(&str,&enable[nr_dev]) == 2 && - get_option(&str,&index[nr_dev]) == 2 && - get_id(&str,&id[nr_dev]) == 2 && - get_option(&str,&isapnp[nr_dev]) == 2 && - get_option_long(&str,&cs4232_pcm_port[nr_dev]) == 2 && - get_option(&str,&cs4232_pcm_irq[nr_dev]) == 2 && - get_option_long(&str,&cs4232_mpu_port[nr_dev]) == 2 && - get_option(&str,&cs4232_mpu_irq[nr_dev]) == 2 && - get_option_long(&str,&ics2115_port[nr_dev]) == 2 && - get_option(&str,&ics2115_irq[nr_dev]) == 2 && - get_option_long(&str,&fm_port[nr_dev]) == 2 && - get_option(&str,&dma1[nr_dev]) == 2 && - get_option(&str,&dma2[nr_dev]) == 2 && - get_option(&str,&use_cs4232_midi[nr_dev]) == 2); - nr_dev++; - return 1; -} - -__setup("snd-wavefront=", alsa_card_wavefront_setup); - -#endif /* ifndef MODULE */