diff options
Diffstat (limited to 'sound/isa/cmi8330.c')
-rw-r--r-- | sound/isa/cmi8330.c | 77 |
1 files changed, 38 insertions, 39 deletions
diff --git a/sound/isa/cmi8330.c b/sound/isa/cmi8330.c index 1fce8b9f37cf..5252206ea388 100644 --- a/sound/isa/cmi8330.c +++ b/sound/isa/cmi8330.c | |||
@@ -438,33 +438,37 @@ static int __devinit snd_cmi8330_pcm(snd_card_t *card, struct snd_cmi8330 *chip) | |||
438 | /* | 438 | /* |
439 | */ | 439 | */ |
440 | 440 | ||
441 | #ifdef CONFIG_PNP | ||
442 | #define is_isapnp_selected(dev) isapnp[dev] | ||
443 | #else | ||
444 | #define is_isapnp_selected(dev) 0 | ||
445 | #endif | ||
446 | |||
447 | #define PFX "cmi8330: " | ||
448 | |||
441 | static int __devinit snd_cmi8330_probe(int dev, | 449 | static int __devinit snd_cmi8330_probe(int dev, |
442 | struct pnp_card_link *pcard, | 450 | struct pnp_card_link *pcard, |
443 | const struct pnp_card_device_id *pid) | 451 | const struct pnp_card_device_id *pid) |
444 | { | 452 | { |
445 | snd_card_t *card; | 453 | snd_card_t *card; |
446 | struct snd_cmi8330 *acard; | 454 | struct snd_cmi8330 *acard; |
447 | unsigned long flags; | ||
448 | int i, err; | 455 | int i, err; |
449 | 456 | ||
450 | #ifdef CONFIG_PNP | 457 | if (! is_isapnp_selected(dev)) { |
451 | if (!isapnp[dev]) { | ||
452 | #endif | ||
453 | if (wssport[dev] == SNDRV_AUTO_PORT) { | 458 | if (wssport[dev] == SNDRV_AUTO_PORT) { |
454 | snd_printk("specify wssport\n"); | 459 | snd_printk(KERN_ERR PFX "specify wssport\n"); |
455 | return -EINVAL; | 460 | return -EINVAL; |
456 | } | 461 | } |
457 | if (sbport[dev] == SNDRV_AUTO_PORT) { | 462 | if (sbport[dev] == SNDRV_AUTO_PORT) { |
458 | snd_printk("specify sbport\n"); | 463 | snd_printk(KERN_ERR PFX "specify sbport\n"); |
459 | return -EINVAL; | 464 | return -EINVAL; |
460 | } | 465 | } |
461 | #ifdef CONFIG_PNP | ||
462 | } | 466 | } |
463 | #endif | 467 | |
464 | card = snd_card_new(index[dev], id[dev], THIS_MODULE, | 468 | card = snd_card_new(index[dev], id[dev], THIS_MODULE, |
465 | sizeof(struct snd_cmi8330)); | 469 | sizeof(struct snd_cmi8330)); |
466 | if (card == NULL) { | 470 | if (card == NULL) { |
467 | snd_printk("could not get a new card\n"); | 471 | snd_printk(KERN_ERR PFX "could not get a new card\n"); |
468 | return -ENOMEM; | 472 | return -ENOMEM; |
469 | } | 473 | } |
470 | acard = (struct snd_cmi8330 *)card->private_data; | 474 | acard = (struct snd_cmi8330 *)card->private_data; |
@@ -473,9 +477,8 @@ static int __devinit snd_cmi8330_probe(int dev, | |||
473 | #ifdef CONFIG_PNP | 477 | #ifdef CONFIG_PNP |
474 | if (isapnp[dev]) { | 478 | if (isapnp[dev]) { |
475 | if ((err = snd_cmi8330_pnp(dev, acard, pcard, pid)) < 0) { | 479 | if ((err = snd_cmi8330_pnp(dev, acard, pcard, pid)) < 0) { |
476 | snd_printk("PnP detection failed\n"); | 480 | snd_printk(KERN_ERR PFX "PnP detection failed\n"); |
477 | snd_card_free(card); | 481 | goto _err; |
478 | return err; | ||
479 | } | 482 | } |
480 | snd_card_set_dev(card, &pcard->card->dev); | 483 | snd_card_set_dev(card, &pcard->card->dev); |
481 | } | 484 | } |
@@ -487,14 +490,13 @@ static int __devinit snd_cmi8330_probe(int dev, | |||
487 | wssdma[dev], | 490 | wssdma[dev], |
488 | AD1848_HW_DETECT, | 491 | AD1848_HW_DETECT, |
489 | &acard->wss)) < 0) { | 492 | &acard->wss)) < 0) { |
490 | snd_printk("(AD1848) device busy??\n"); | 493 | snd_printk(KERN_ERR PFX "(AD1848) device busy??\n"); |
491 | snd_card_free(card); | 494 | goto _err; |
492 | return err; | ||
493 | } | 495 | } |
494 | if (acard->wss->hardware != AD1848_HW_CMI8330) { | 496 | if (acard->wss->hardware != AD1848_HW_CMI8330) { |
495 | snd_printk("(AD1848) not found during probe\n"); | 497 | snd_printk(KERN_ERR PFX "(AD1848) not found during probe\n"); |
496 | snd_card_free(card); | 498 | err = -ENODEV; |
497 | return -ENODEV; | 499 | goto _err; |
498 | } | 500 | } |
499 | 501 | ||
500 | if ((err = snd_sbdsp_create(card, sbport[dev], | 502 | if ((err = snd_sbdsp_create(card, sbport[dev], |
@@ -503,32 +505,26 @@ static int __devinit snd_cmi8330_probe(int dev, | |||
503 | sbdma8[dev], | 505 | sbdma8[dev], |
504 | sbdma16[dev], | 506 | sbdma16[dev], |
505 | SB_HW_AUTO, &acard->sb)) < 0) { | 507 | SB_HW_AUTO, &acard->sb)) < 0) { |
506 | snd_printk("(SB16) device busy??\n"); | 508 | snd_printk(KERN_ERR PFX "(SB16) device busy??\n"); |
507 | snd_card_free(card); | 509 | goto _err; |
508 | return err; | ||
509 | } | 510 | } |
510 | if (acard->sb->hardware != SB_HW_16) { | 511 | if (acard->sb->hardware != SB_HW_16) { |
511 | snd_printk("(SB16) not found during probe\n"); | 512 | snd_printk(KERN_ERR PFX "(SB16) not found during probe\n"); |
512 | snd_card_free(card); | 513 | goto _err; |
513 | return -ENODEV; | ||
514 | } | 514 | } |
515 | 515 | ||
516 | spin_lock_irqsave(&acard->wss->reg_lock, flags); | ||
517 | snd_ad1848_out(acard->wss, AD1848_MISC_INFO, 0x40); /* switch on MODE2 */ | 516 | snd_ad1848_out(acard->wss, AD1848_MISC_INFO, 0x40); /* switch on MODE2 */ |
518 | for (i = CMI8330_RMUX3D; i <= CMI8330_CDINGAIN; i++) | 517 | for (i = CMI8330_RMUX3D; i <= CMI8330_CDINGAIN; i++) |
519 | snd_ad1848_out(acard->wss, i, snd_cmi8330_image[i - CMI8330_RMUX3D]); | 518 | snd_ad1848_out(acard->wss, i, snd_cmi8330_image[i - CMI8330_RMUX3D]); |
520 | spin_unlock_irqrestore(&acard->wss->reg_lock, flags); | ||
521 | 519 | ||
522 | if ((err = snd_cmi8330_mixer(card, acard)) < 0) { | 520 | if ((err = snd_cmi8330_mixer(card, acard)) < 0) { |
523 | snd_printk("failed to create mixers\n"); | 521 | snd_printk(KERN_ERR PFX "failed to create mixers\n"); |
524 | snd_card_free(card); | 522 | goto _err; |
525 | return err; | ||
526 | } | 523 | } |
527 | 524 | ||
528 | if ((err = snd_cmi8330_pcm(card, acard)) < 0) { | 525 | if ((err = snd_cmi8330_pcm(card, acard)) < 0) { |
529 | snd_printk("failed to create pcms\n"); | 526 | snd_printk(KERN_ERR PFX "failed to create pcms\n"); |
530 | snd_card_free(card); | 527 | goto _err; |
531 | return err; | ||
532 | } | 528 | } |
533 | 529 | ||
534 | strcpy(card->driver, "CMI8330/C3D"); | 530 | strcpy(card->driver, "CMI8330/C3D"); |
@@ -539,16 +535,21 @@ static int __devinit snd_cmi8330_probe(int dev, | |||
539 | wssirq[dev], | 535 | wssirq[dev], |
540 | wssdma[dev]); | 536 | wssdma[dev]); |
541 | 537 | ||
542 | if ((err = snd_card_register(card)) < 0) { | 538 | if ((err = snd_card_set_generic_dev(card)) < 0) |
543 | snd_card_free(card); | 539 | goto _err; |
544 | return err; | 540 | |
545 | } | 541 | if ((err = snd_card_register(card)) < 0) |
542 | goto _err; | ||
546 | 543 | ||
547 | if (pcard) | 544 | if (pcard) |
548 | pnp_set_card_drvdata(pcard, card); | 545 | pnp_set_card_drvdata(pcard, card); |
549 | else | 546 | else |
550 | snd_cmi8330_legacy[dev] = card; | 547 | snd_cmi8330_legacy[dev] = card; |
551 | return 0; | 548 | return 0; |
549 | |||
550 | _err: | ||
551 | snd_card_free(card); | ||
552 | return err; | ||
552 | } | 553 | } |
553 | 554 | ||
554 | #ifdef CONFIG_PNP | 555 | #ifdef CONFIG_PNP |
@@ -594,10 +595,8 @@ static int __init alsa_card_cmi8330_init(void) | |||
594 | for (dev = 0; dev < SNDRV_CARDS; dev++) { | 595 | for (dev = 0; dev < SNDRV_CARDS; dev++) { |
595 | if (!enable[dev]) | 596 | if (!enable[dev]) |
596 | continue; | 597 | continue; |
597 | #ifdef CONFIG_PNP | 598 | if (is_isapnp_selected(dev)) |
598 | if (isapnp[dev]) | ||
599 | continue; | 599 | continue; |
600 | #endif | ||
601 | if (snd_cmi8330_probe(dev, NULL, NULL) >= 0) | 600 | if (snd_cmi8330_probe(dev, NULL, NULL) >= 0) |
602 | cards++; | 601 | cards++; |
603 | } | 602 | } |