diff options
Diffstat (limited to 'sound/isa/cmi8330.c')
-rw-r--r-- | sound/isa/cmi8330.c | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/sound/isa/cmi8330.c b/sound/isa/cmi8330.c index ba0114ebafde..bd8e23818460 100644 --- a/sound/isa/cmi8330.c +++ b/sound/isa/cmi8330.c | |||
@@ -108,6 +108,9 @@ MODULE_PARM_DESC(wssirq, "IRQ # for CMI8330 WSS driver."); | |||
108 | module_param_array(wssdma, int, NULL, 0444); | 108 | module_param_array(wssdma, int, NULL, 0444); |
109 | MODULE_PARM_DESC(wssdma, "DMA for CMI8330 WSS driver."); | 109 | MODULE_PARM_DESC(wssdma, "DMA for CMI8330 WSS driver."); |
110 | 110 | ||
111 | static struct platform_device *platform_devices[SNDRV_CARDS]; | ||
112 | static int pnp_registered; | ||
113 | |||
111 | #define CMI8330_RMUX3D 16 | 114 | #define CMI8330_RMUX3D 16 |
112 | #define CMI8330_MUTEMUX 17 | 115 | #define CMI8330_MUTEMUX 17 |
113 | #define CMI8330_OUTPUTVOL 18 | 116 | #define CMI8330_OUTPUTVOL 18 |
@@ -665,6 +668,17 @@ static struct pnp_card_driver cmi8330_pnpc_driver = { | |||
665 | }; | 668 | }; |
666 | #endif /* CONFIG_PNP */ | 669 | #endif /* CONFIG_PNP */ |
667 | 670 | ||
671 | static void __init_or_module snd_cmi8330_unregister_all(void) | ||
672 | { | ||
673 | int i; | ||
674 | |||
675 | if (pnp_registered) | ||
676 | pnp_unregister_card_driver(&cmi8330_pnpc_driver); | ||
677 | for (i = 0; i < ARRAY_SIZE(platform_devices); ++i) | ||
678 | platform_device_unregister(platform_devices[i]); | ||
679 | platform_driver_unregister(&snd_cmi8330_driver); | ||
680 | } | ||
681 | |||
668 | static int __init alsa_card_cmi8330_init(void) | 682 | static int __init alsa_card_cmi8330_init(void) |
669 | { | 683 | { |
670 | int i, err, cards = 0; | 684 | int i, err, cards = 0; |
@@ -680,31 +694,35 @@ static int __init alsa_card_cmi8330_init(void) | |||
680 | i, NULL, 0); | 694 | i, NULL, 0); |
681 | if (IS_ERR(device)) { | 695 | if (IS_ERR(device)) { |
682 | err = PTR_ERR(device); | 696 | err = PTR_ERR(device); |
683 | platform_driver_unregister(&snd_cmi8330_driver); | 697 | goto errout; |
684 | return err; | ||
685 | } | 698 | } |
699 | platform_devices[i] = device; | ||
686 | cards++; | 700 | cards++; |
687 | } | 701 | } |
688 | 702 | ||
689 | err = pnp_register_card_driver(&cmi8330_pnpc_driver); | 703 | err = pnp_register_card_driver(&cmi8330_pnpc_driver); |
690 | if (err > 0) | 704 | if (err >= 0) { |
705 | pnp_registered = 1; | ||
691 | cards += err; | 706 | cards += err; |
707 | } | ||
692 | 708 | ||
693 | if (!cards) { | 709 | if (!cards) { |
694 | pnp_unregister_card_driver(&cmi8330_pnpc_driver); | ||
695 | platform_driver_unregister(&snd_cmi8330_driver); | ||
696 | #ifdef MODULE | 710 | #ifdef MODULE |
697 | snd_printk(KERN_ERR "CMI8330 not found or device busy\n"); | 711 | snd_printk(KERN_ERR "CMI8330 not found or device busy\n"); |
698 | #endif | 712 | #endif |
699 | return -ENODEV; | 713 | err = -ENODEV; |
714 | goto errout; | ||
700 | } | 715 | } |
701 | return 0; | 716 | return 0; |
717 | |||
718 | errout: | ||
719 | snd_cmi8330_unregister_all(); | ||
720 | return err; | ||
702 | } | 721 | } |
703 | 722 | ||
704 | static void __exit alsa_card_cmi8330_exit(void) | 723 | static void __exit alsa_card_cmi8330_exit(void) |
705 | { | 724 | { |
706 | pnp_unregister_card_driver(&cmi8330_pnpc_driver); | 725 | snd_cmi8330_unregister_all(); |
707 | platform_driver_unregister(&snd_cmi8330_driver); | ||
708 | } | 726 | } |
709 | 727 | ||
710 | module_init(alsa_card_cmi8330_init) | 728 | module_init(alsa_card_cmi8330_init) |