diff options
author | Takashi Iwai <tiwai@suse.de> | 2005-09-05 11:19:20 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2005-09-12 04:42:01 -0400 |
commit | 43bcd973d6d05d16b876e09dcc49a09d3e48e88d (patch) | |
tree | 8c8493b66c417402f6188051c57e55099bbd156d /sound/isa/sb | |
parent | 16dab54b8cbac39bd3f639db5d7d0fd8300a6cb0 (diff) |
[ALSA] Add snd_card_set_generic_dev() call to ISA drivers
ISA,CMI8330 driver,ES18xx driver,OPL3SA2 driver,Sound Galaxy driver
Sound Scape driver,AD1848 driver,CS4231 driver,CS4236+ driver
ES1688 driver,GUS Classic driver,GUS Extreme driver,GUS MAX driver
AMD InterWave driver,Opti9xx drivers,SB16/AWE driver,SB8 driver
Wavefront drivers
- Added snd_card_set_generic_dev() call.
- Added SND_GENERIC_DRIVER to Kconfig.
- Clean up the error path in probe if necessary.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/isa/sb')
-rw-r--r-- | sound/isa/sb/sb16.c | 144 | ||||
-rw-r--r-- | sound/isa/sb/sb8.c | 62 |
2 files changed, 97 insertions, 109 deletions
diff --git a/sound/isa/sb/sb16.c b/sound/isa/sb/sb16.c index 60e2c53c49fc..7888783d68f5 100644 --- a/sound/isa/sb/sb16.c +++ b/sound/isa/sb/sb16.c | |||
@@ -351,6 +351,12 @@ static void snd_sb16_free(snd_card_t *card) | |||
351 | } | 351 | } |
352 | } | 352 | } |
353 | 353 | ||
354 | #ifdef CONFIG_PNP | ||
355 | #define is_isapnp_selected(dev) isapnp[dev] | ||
356 | #else | ||
357 | #define is_isapnp_selected(dev) 0 | ||
358 | #endif | ||
359 | |||
354 | static int __init snd_sb16_probe(int dev, | 360 | static int __init snd_sb16_probe(int dev, |
355 | struct pnp_card_link *pcard, | 361 | struct pnp_card_link *pcard, |
356 | const struct pnp_card_device_id *pid) | 362 | const struct pnp_card_device_id *pid) |
@@ -378,10 +384,8 @@ static int __init snd_sb16_probe(int dev, | |||
378 | card->private_free = snd_sb16_free; | 384 | card->private_free = snd_sb16_free; |
379 | #ifdef CONFIG_PNP | 385 | #ifdef CONFIG_PNP |
380 | if (isapnp[dev]) { | 386 | if (isapnp[dev]) { |
381 | if ((err = snd_card_sb16_pnp(dev, acard, pcard, pid))) { | 387 | if ((err = snd_card_sb16_pnp(dev, acard, pcard, pid))) |
382 | snd_card_free(card); | 388 | goto _err; |
383 | return err; | ||
384 | } | ||
385 | snd_card_set_dev(card, &pcard->card->dev); | 389 | snd_card_set_dev(card, &pcard->card->dev); |
386 | } | 390 | } |
387 | #endif | 391 | #endif |
@@ -389,41 +393,37 @@ static int __init snd_sb16_probe(int dev, | |||
389 | xirq = irq[dev]; | 393 | xirq = irq[dev]; |
390 | xdma8 = dma8[dev]; | 394 | xdma8 = dma8[dev]; |
391 | xdma16 = dma16[dev]; | 395 | xdma16 = dma16[dev]; |
392 | #ifdef CONFIG_PNP | 396 | if (! is_isapnp_selected(dev)) { |
393 | if (!isapnp[dev]) { | 397 | if (xirq == SNDRV_AUTO_IRQ) { |
394 | #endif | 398 | if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) { |
395 | if (xirq == SNDRV_AUTO_IRQ) { | 399 | snd_printk(KERN_ERR PFX "unable to find a free IRQ\n"); |
396 | if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) { | 400 | err = -EBUSY; |
397 | snd_card_free(card); | 401 | goto _err; |
398 | snd_printk(KERN_ERR PFX "unable to find a free IRQ\n"); | 402 | } |
399 | return -EBUSY; | ||
400 | } | 403 | } |
401 | } | 404 | if (xdma8 == SNDRV_AUTO_DMA) { |
402 | if (xdma8 == SNDRV_AUTO_DMA) { | 405 | if ((xdma8 = snd_legacy_find_free_dma(possible_dmas8)) < 0) { |
403 | if ((xdma8 = snd_legacy_find_free_dma(possible_dmas8)) < 0) { | 406 | snd_printk(KERN_ERR PFX "unable to find a free 8-bit DMA\n"); |
404 | snd_card_free(card); | 407 | err = -EBUSY; |
405 | snd_printk(KERN_ERR PFX "unable to find a free 8-bit DMA\n"); | 408 | goto _err; |
406 | return -EBUSY; | 409 | } |
407 | } | 410 | } |
408 | } | 411 | if (xdma16 == SNDRV_AUTO_DMA) { |
409 | if (xdma16 == SNDRV_AUTO_DMA) { | 412 | if ((xdma16 = snd_legacy_find_free_dma(possible_dmas16)) < 0) { |
410 | if ((xdma16 = snd_legacy_find_free_dma(possible_dmas16)) < 0) { | 413 | snd_printk(KERN_ERR PFX "unable to find a free 16-bit DMA\n"); |
411 | snd_card_free(card); | 414 | err = -EBUSY; |
412 | snd_printk(KERN_ERR PFX "unable to find a free 16-bit DMA\n"); | 415 | goto _err; |
413 | return -EBUSY; | 416 | } |
414 | } | 417 | } |
415 | } | 418 | /* non-PnP FM port address is hardwired with base port address */ |
416 | /* non-PnP FM port address is hardwired with base port address */ | 419 | fm_port[dev] = port[dev]; |
417 | fm_port[dev] = port[dev]; | 420 | /* block the 0x388 port to avoid PnP conflicts */ |
418 | /* block the 0x388 port to avoid PnP conflicts */ | 421 | acard->fm_res = request_region(0x388, 4, "SoundBlaster FM"); |
419 | acard->fm_res = request_region(0x388, 4, "SoundBlaster FM"); | ||
420 | #ifdef SNDRV_SBAWE_EMU8000 | 422 | #ifdef SNDRV_SBAWE_EMU8000 |
421 | /* non-PnP AWE port address is hardwired with base port address */ | 423 | /* non-PnP AWE port address is hardwired with base port address */ |
422 | awe_port[dev] = port[dev] + 0x400; | 424 | awe_port[dev] = port[dev] + 0x400; |
423 | #endif | 425 | #endif |
424 | #ifdef CONFIG_PNP | ||
425 | } | 426 | } |
426 | #endif | ||
427 | 427 | ||
428 | if ((err = snd_sbdsp_create(card, | 428 | if ((err = snd_sbdsp_create(card, |
429 | port[dev], | 429 | port[dev], |
@@ -432,28 +432,20 @@ static int __init snd_sb16_probe(int dev, | |||
432 | xdma8, | 432 | xdma8, |
433 | xdma16, | 433 | xdma16, |
434 | SB_HW_AUTO, | 434 | SB_HW_AUTO, |
435 | &chip)) < 0) { | 435 | &chip)) < 0) |
436 | snd_card_free(card); | 436 | goto _err; |
437 | return err; | 437 | |
438 | } | ||
439 | if (chip->hardware != SB_HW_16) { | 438 | if (chip->hardware != SB_HW_16) { |
440 | snd_card_free(card); | 439 | snd_printk(KERN_ERR PFX "SB 16 chip was not detected at 0x%lx\n", port[dev]); |
441 | snd_printdd("SB 16 chip was not detected at 0x%lx\n", port[dev]); | 440 | err = -ENODEV; |
442 | return -ENODEV; | 441 | goto _err; |
443 | } | 442 | } |
444 | chip->mpu_port = mpu_port[dev]; | 443 | chip->mpu_port = mpu_port[dev]; |
445 | #ifdef CONFIG_PNP | 444 | if (! is_isapnp_selected(dev) && (err = snd_sb16dsp_configure(chip)) < 0) |
446 | if (!isapnp[dev] && (err = snd_sb16dsp_configure(chip)) < 0) { | 445 | goto _err; |
447 | #else | 446 | |
448 | if ((err = snd_sb16dsp_configure(chip)) < 0) { | 447 | if ((err = snd_sb16dsp_pcm(chip, 0, NULL)) < 0) |
449 | #endif | 448 | goto _err; |
450 | snd_card_free(card); | ||
451 | return -ENXIO; | ||
452 | } | ||
453 | if ((err = snd_sb16dsp_pcm(chip, 0, NULL)) < 0) { | ||
454 | snd_card_free(card); | ||
455 | return -ENXIO; | ||
456 | } | ||
457 | 449 | ||
458 | strcpy(card->driver, | 450 | strcpy(card->driver, |
459 | #ifdef SNDRV_SBAWE_EMU8000 | 451 | #ifdef SNDRV_SBAWE_EMU8000 |
@@ -474,10 +466,8 @@ static int __init snd_sb16_probe(int dev, | |||
474 | if (chip->mpu_port > 0 && chip->mpu_port != SNDRV_AUTO_PORT) { | 466 | if (chip->mpu_port > 0 && chip->mpu_port != SNDRV_AUTO_PORT) { |
475 | if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_SB, | 467 | if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_SB, |
476 | chip->mpu_port, 0, | 468 | chip->mpu_port, 0, |
477 | xirq, 0, &chip->rmidi)) < 0) { | 469 | xirq, 0, &chip->rmidi)) < 0) |
478 | snd_card_free(card); | 470 | goto _err; |
479 | return -ENXIO; | ||
480 | } | ||
481 | chip->rmidi_callback = snd_mpu401_uart_interrupt; | 471 | chip->rmidi_callback = snd_mpu401_uart_interrupt; |
482 | } | 472 | } |
483 | 473 | ||
@@ -499,17 +489,13 @@ static int __init snd_sb16_probe(int dev, | |||
499 | #else | 489 | #else |
500 | int seqdev = 1; | 490 | int seqdev = 1; |
501 | #endif | 491 | #endif |
502 | if ((err = snd_opl3_hwdep_new(opl3, 0, seqdev, &synth)) < 0) { | 492 | if ((err = snd_opl3_hwdep_new(opl3, 0, seqdev, &synth)) < 0) |
503 | snd_card_free(card); | 493 | goto _err; |
504 | return -ENXIO; | ||
505 | } | ||
506 | } | 494 | } |
507 | } | 495 | } |
508 | 496 | ||
509 | if ((err = snd_sbmixer_new(chip)) < 0) { | 497 | if ((err = snd_sbmixer_new(chip)) < 0) |
510 | snd_card_free(card); | 498 | goto _err; |
511 | return -ENXIO; | ||
512 | } | ||
513 | 499 | ||
514 | #ifdef CONFIG_SND_SB16_CSP | 500 | #ifdef CONFIG_SND_SB16_CSP |
515 | /* CSP chip on SB16ASP/AWE32 */ | 501 | /* CSP chip on SB16ASP/AWE32 */ |
@@ -525,11 +511,11 @@ static int __init snd_sb16_probe(int dev, | |||
525 | #endif | 511 | #endif |
526 | #ifdef SNDRV_SBAWE_EMU8000 | 512 | #ifdef SNDRV_SBAWE_EMU8000 |
527 | if (awe_port[dev] > 0) { | 513 | if (awe_port[dev] > 0) { |
528 | if (snd_emu8000_new(card, 1, awe_port[dev], | 514 | if ((err = snd_emu8000_new(card, 1, awe_port[dev], |
529 | seq_ports[dev], NULL) < 0) { | 515 | seq_ports[dev], NULL)) < 0) { |
530 | snd_printk(KERN_ERR PFX "fatal error - EMU-8000 synthesizer not detected at 0x%lx\n", awe_port[dev]); | 516 | snd_printk(KERN_ERR PFX "fatal error - EMU-8000 synthesizer not detected at 0x%lx\n", awe_port[dev]); |
531 | snd_card_free(card); | 517 | |
532 | return -ENXIO; | 518 | goto _err; |
533 | } | 519 | } |
534 | } | 520 | } |
535 | #endif | 521 | #endif |
@@ -541,15 +527,21 @@ static int __init snd_sb16_probe(int dev, | |||
541 | (mic_agc[dev] ? 0x00 : 0x01)); | 527 | (mic_agc[dev] ? 0x00 : 0x01)); |
542 | spin_unlock_irqrestore(&chip->mixer_lock, flags); | 528 | spin_unlock_irqrestore(&chip->mixer_lock, flags); |
543 | 529 | ||
544 | if ((err = snd_card_register(card)) < 0) { | 530 | if ((err = snd_card_set_generic_dev(card)) < 0) |
545 | snd_card_free(card); | 531 | goto _err; |
546 | return err; | 532 | |
547 | } | 533 | if ((err = snd_card_register(card)) < 0) |
534 | goto _err; | ||
535 | |||
548 | if (pcard) | 536 | if (pcard) |
549 | pnp_set_card_drvdata(pcard, card); | 537 | pnp_set_card_drvdata(pcard, card); |
550 | else | 538 | else |
551 | snd_sb16_legacy[dev] = card; | 539 | snd_sb16_legacy[dev] = card; |
552 | return 0; | 540 | return 0; |
541 | |||
542 | _err: | ||
543 | snd_card_free(card); | ||
544 | return err; | ||
553 | } | 545 | } |
554 | 546 | ||
555 | static int __init snd_sb16_probe_legacy_port(unsigned long xport) | 547 | static int __init snd_sb16_probe_legacy_port(unsigned long xport) |
@@ -560,10 +552,8 @@ static int __init snd_sb16_probe_legacy_port(unsigned long xport) | |||
560 | for ( ; dev < SNDRV_CARDS; dev++) { | 552 | for ( ; dev < SNDRV_CARDS; dev++) { |
561 | if (!enable[dev] || port[dev] != SNDRV_AUTO_PORT) | 553 | if (!enable[dev] || port[dev] != SNDRV_AUTO_PORT) |
562 | continue; | 554 | continue; |
563 | #ifdef CONFIG_PNP | 555 | if (is_isapnp_selected(dev)) |
564 | if (isapnp[dev]) | ||
565 | continue; | 556 | continue; |
566 | #endif | ||
567 | port[dev] = xport; | 557 | port[dev] = xport; |
568 | res = snd_sb16_probe(dev, NULL, NULL); | 558 | res = snd_sb16_probe(dev, NULL, NULL); |
569 | if (res < 0) | 559 | if (res < 0) |
@@ -621,10 +611,8 @@ static int __init alsa_card_sb16_init(void) | |||
621 | for (dev = 0; dev < SNDRV_CARDS; dev++) { | 611 | for (dev = 0; dev < SNDRV_CARDS; dev++) { |
622 | if (!enable[dev] || port[dev] == SNDRV_AUTO_PORT) | 612 | if (!enable[dev] || port[dev] == SNDRV_AUTO_PORT) |
623 | continue; | 613 | continue; |
624 | #ifdef CONFIG_PNP | 614 | if (is_isapnp_selected(dev)) |
625 | if (isapnp[dev]) | ||
626 | continue; | 615 | continue; |
627 | #endif | ||
628 | if (!snd_sb16_probe(dev, NULL, NULL)) { | 616 | if (!snd_sb16_probe(dev, NULL, NULL)) { |
629 | cards++; | 617 | cards++; |
630 | continue; | 618 | continue; |
diff --git a/sound/isa/sb/sb8.c b/sound/isa/sb/sb8.c index e2cbc4202b3d..c41ac25e85ca 100644 --- a/sound/isa/sb/sb8.c +++ b/sound/isa/sb/sb8.c | |||
@@ -107,54 +107,47 @@ static int __init snd_sb8_probe(int dev) | |||
107 | dma8[dev], | 107 | dma8[dev], |
108 | -1, | 108 | -1, |
109 | SB_HW_AUTO, | 109 | SB_HW_AUTO, |
110 | &chip)) < 0) { | 110 | &chip)) < 0) |
111 | snd_card_free(card); | 111 | goto _err; |
112 | return err; | 112 | |
113 | } | ||
114 | if (chip->hardware >= SB_HW_16) { | 113 | if (chip->hardware >= SB_HW_16) { |
115 | snd_card_free(card); | ||
116 | if (chip->hardware == SB_HW_ALS100) | 114 | if (chip->hardware == SB_HW_ALS100) |
117 | snd_printdd("ALS100 chip detected at 0x%lx, try snd-als100 module\n", | 115 | snd_printk(KERN_WARNING "ALS100 chip detected at 0x%lx, try snd-als100 module\n", |
118 | port[dev]); | 116 | port[dev]); |
119 | else | 117 | else |
120 | snd_printdd("SB 16 chip detected at 0x%lx, try snd-sb16 module\n", | 118 | snd_printk(KERN_WARNING "SB 16 chip detected at 0x%lx, try snd-sb16 module\n", |
121 | port[dev]); | 119 | port[dev]); |
122 | return -ENODEV; | 120 | err = -ENODEV; |
121 | goto _err; | ||
123 | } | 122 | } |
124 | 123 | ||
125 | if ((err = snd_sb8dsp_pcm(chip, 0, NULL)) < 0) { | 124 | if ((err = snd_sb8dsp_pcm(chip, 0, NULL)) < 0) |
126 | snd_card_free(card); | 125 | goto _err; |
127 | return err; | 126 | |
128 | } | 127 | if ((err = snd_sbmixer_new(chip)) < 0) |
129 | if ((err = snd_sbmixer_new(chip)) < 0) { | 128 | goto _err; |
130 | snd_card_free(card); | 129 | |
131 | return err; | ||
132 | } | ||
133 | if (chip->hardware == SB_HW_10 || chip->hardware == SB_HW_20) { | 130 | if (chip->hardware == SB_HW_10 || chip->hardware == SB_HW_20) { |
134 | if ((err = snd_opl3_create(card, chip->port + 8, 0, | 131 | if ((err = snd_opl3_create(card, chip->port + 8, 0, |
135 | OPL3_HW_AUTO, 1, | 132 | OPL3_HW_AUTO, 1, |
136 | &opl3)) < 0) { | 133 | &opl3)) < 0) { |
137 | snd_printk(KERN_ERR "sb8: no OPL device at 0x%lx\n", chip->port + 8); | 134 | snd_printk(KERN_WARNING "sb8: no OPL device at 0x%lx\n", chip->port + 8); |
138 | } | 135 | } |
139 | } else { | 136 | } else { |
140 | if ((err = snd_opl3_create(card, chip->port, chip->port + 2, | 137 | if ((err = snd_opl3_create(card, chip->port, chip->port + 2, |
141 | OPL3_HW_AUTO, 1, | 138 | OPL3_HW_AUTO, 1, |
142 | &opl3)) < 0) { | 139 | &opl3)) < 0) { |
143 | snd_printk(KERN_ERR "sb8: no OPL device at 0x%lx-0x%lx\n", | 140 | snd_printk(KERN_WARNING "sb8: no OPL device at 0x%lx-0x%lx\n", |
144 | chip->port, chip->port + 2); | 141 | chip->port, chip->port + 2); |
145 | } | 142 | } |
146 | } | 143 | } |
147 | if (err >= 0) { | 144 | if (err >= 0) { |
148 | if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) { | 145 | if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) |
149 | snd_card_free(card); | 146 | goto _err; |
150 | return err; | ||
151 | } | ||
152 | } | 147 | } |
153 | 148 | ||
154 | if ((err = snd_sb8dsp_midi(chip, 0, NULL)) < 0) { | 149 | if ((err = snd_sb8dsp_midi(chip, 0, NULL)) < 0) |
155 | snd_card_free(card); | 150 | goto _err; |
156 | return err; | ||
157 | } | ||
158 | 151 | ||
159 | strcpy(card->driver, chip->hardware == SB_HW_PRO ? "SB Pro" : "SB8"); | 152 | strcpy(card->driver, chip->hardware == SB_HW_PRO ? "SB Pro" : "SB8"); |
160 | strcpy(card->shortname, chip->name); | 153 | strcpy(card->shortname, chip->name); |
@@ -162,12 +155,19 @@ static int __init snd_sb8_probe(int dev) | |||
162 | chip->name, | 155 | chip->name, |
163 | chip->port, | 156 | chip->port, |
164 | irq[dev], dma8[dev]); | 157 | irq[dev], dma8[dev]); |
165 | if ((err = snd_card_register(card)) < 0) { | 158 | |
166 | snd_card_free(card); | 159 | if ((err = snd_card_set_generic_dev(card)) < 0) |
167 | return err; | 160 | goto _err; |
168 | } | 161 | |
162 | if ((err = snd_card_register(card)) < 0) | ||
163 | goto _err; | ||
164 | |||
169 | snd_sb8_cards[dev] = card; | 165 | snd_sb8_cards[dev] = card; |
170 | return 0; | 166 | return 0; |
167 | |||
168 | _err: | ||
169 | snd_card_free(card); | ||
170 | return err; | ||
171 | } | 171 | } |
172 | 172 | ||
173 | static int __init snd_card_sb8_legacy_auto_probe(unsigned long xport) | 173 | static int __init snd_card_sb8_legacy_auto_probe(unsigned long xport) |