diff options
author | Clemens Ladisch <clemens@ladisch.de> | 2005-12-07 03:13:42 -0500 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2006-01-03 06:30:39 -0500 |
commit | f7a9275d949cb0bf1f259a1546e52a0bf518151c (patch) | |
tree | 4d96d9b6196d43684903857ba676dc51bbde4026 /sound/isa/cs423x | |
parent | 416c1079d30f1a52399b96f6772e993274b774ae (diff) |
[ALSA] unregister platform devices
Call platform_device_unregister() for all platform devices that we've
registered.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Diffstat (limited to 'sound/isa/cs423x')
-rw-r--r-- | sound/isa/cs423x/cs4231.c | 16 | ||||
-rw-r--r-- | sound/isa/cs423x/cs4236.c | 51 |
2 files changed, 50 insertions, 17 deletions
diff --git a/sound/isa/cs423x/cs4231.c b/sound/isa/cs423x/cs4231.c index b5252a5d741..ab67b5c2590 100644 --- a/sound/isa/cs423x/cs4231.c +++ b/sound/isa/cs423x/cs4231.c | |||
@@ -66,6 +66,8 @@ MODULE_PARM_DESC(dma1, "DMA1 # for CS4231 driver."); | |||
66 | module_param_array(dma2, int, NULL, 0444); | 66 | module_param_array(dma2, int, NULL, 0444); |
67 | MODULE_PARM_DESC(dma2, "DMA2 # for CS4231 driver."); | 67 | MODULE_PARM_DESC(dma2, "DMA2 # for CS4231 driver."); |
68 | 68 | ||
69 | static struct platform_device *devices[SNDRV_CARDS]; | ||
70 | |||
69 | 71 | ||
70 | static int __init snd_cs4231_probe(struct platform_device *pdev) | 72 | static int __init snd_cs4231_probe(struct platform_device *pdev) |
71 | { | 73 | { |
@@ -183,6 +185,15 @@ static struct platform_driver snd_cs4231_driver = { | |||
183 | }, | 185 | }, |
184 | }; | 186 | }; |
185 | 187 | ||
188 | static void __init_or_module snd_cs4231_unregister_all(void) | ||
189 | { | ||
190 | int i; | ||
191 | |||
192 | for (i = 0; i < ARRAY_SIZE(devices); ++i) | ||
193 | platform_device_unregister(devices[i]); | ||
194 | platform_driver_unregister(&snd_cs4231_driver); | ||
195 | } | ||
196 | |||
186 | static int __init alsa_card_cs4231_init(void) | 197 | static int __init alsa_card_cs4231_init(void) |
187 | { | 198 | { |
188 | int i, cards, err; | 199 | int i, cards, err; |
@@ -200,6 +211,7 @@ static int __init alsa_card_cs4231_init(void) | |||
200 | err = PTR_ERR(device); | 211 | err = PTR_ERR(device); |
201 | goto errout; | 212 | goto errout; |
202 | } | 213 | } |
214 | devices[i] = device; | ||
203 | cards++; | 215 | cards++; |
204 | } | 216 | } |
205 | if (!cards) { | 217 | if (!cards) { |
@@ -212,13 +224,13 @@ static int __init alsa_card_cs4231_init(void) | |||
212 | return 0; | 224 | return 0; |
213 | 225 | ||
214 | errout: | 226 | errout: |
215 | platform_driver_unregister(&snd_cs4231_driver); | 227 | snd_cs4231_unregister_all(); |
216 | return err; | 228 | return err; |
217 | } | 229 | } |
218 | 230 | ||
219 | static void __exit alsa_card_cs4231_exit(void) | 231 | static void __exit alsa_card_cs4231_exit(void) |
220 | { | 232 | { |
221 | platform_driver_unregister(&snd_cs4231_driver); | 233 | snd_cs4231_unregister_all(); |
222 | } | 234 | } |
223 | 235 | ||
224 | module_init(alsa_card_cs4231_init) | 236 | module_init(alsa_card_cs4231_init) |
diff --git a/sound/isa/cs423x/cs4236.c b/sound/isa/cs423x/cs4236.c index 9e399b6e6ed..e1683337e6c 100644 --- a/sound/isa/cs423x/cs4236.c +++ b/sound/isa/cs423x/cs4236.c | |||
@@ -124,6 +124,12 @@ MODULE_PARM_DESC(dma1, "DMA1 # for " IDENT " driver."); | |||
124 | module_param_array(dma2, int, NULL, 0444); | 124 | module_param_array(dma2, int, NULL, 0444); |
125 | MODULE_PARM_DESC(dma2, "DMA2 # for " IDENT " driver."); | 125 | MODULE_PARM_DESC(dma2, "DMA2 # for " IDENT " driver."); |
126 | 126 | ||
127 | static struct platform_device *platform_devices[SNDRV_CARDS]; | ||
128 | static int pnpc_registered; | ||
129 | #ifdef CS4232 | ||
130 | static int pnp_registered; | ||
131 | #endif | ||
132 | |||
127 | struct snd_card_cs4236 { | 133 | struct snd_card_cs4236 { |
128 | struct snd_cs4231 *chip; | 134 | struct snd_cs4231 *chip; |
129 | struct resource *res_sb_port; | 135 | struct resource *res_sb_port; |
@@ -737,6 +743,21 @@ static struct pnp_card_driver cs423x_pnpc_driver = { | |||
737 | }; | 743 | }; |
738 | #endif /* CONFIG_PNP */ | 744 | #endif /* CONFIG_PNP */ |
739 | 745 | ||
746 | static void __init_or_module snd_cs423x_unregister_all(void) | ||
747 | { | ||
748 | int i; | ||
749 | |||
750 | if (pnpc_registered) | ||
751 | pnp_unregister_card_driver(&cs423x_pnpc_driver); | ||
752 | #ifdef CS4232 | ||
753 | if (pnp_registered) | ||
754 | pnp_unregister_driver(&cs4232_pnp_driver); | ||
755 | #endif | ||
756 | for (i = 0; i < ARRAY_SIZE(platform_devices); ++i) | ||
757 | platform_device_unregister(platform_devices[i]); | ||
758 | platform_driver_unregister(&cs423x_nonpnp_driver); | ||
759 | } | ||
760 | |||
740 | static int __init alsa_card_cs423x_init(void) | 761 | static int __init alsa_card_cs423x_init(void) |
741 | { | 762 | { |
742 | int i, err, cards = 0; | 763 | int i, err, cards = 0; |
@@ -752,40 +773,40 @@ static int __init alsa_card_cs423x_init(void) | |||
752 | i, NULL, 0); | 773 | i, NULL, 0); |
753 | if (IS_ERR(device)) { | 774 | if (IS_ERR(device)) { |
754 | err = PTR_ERR(device); | 775 | err = PTR_ERR(device); |
755 | platform_driver_unregister(&cs423x_nonpnp_driver); | 776 | goto errout; |
756 | return err; | ||
757 | } | 777 | } |
778 | platform_devices[i] = device; | ||
758 | cards++; | 779 | cards++; |
759 | } | 780 | } |
760 | #ifdef CS4232 | 781 | #ifdef CS4232 |
761 | i = pnp_register_driver(&cs4232_pnp_driver); | 782 | i = pnp_register_driver(&cs4232_pnp_driver); |
762 | if (i > 0) | 783 | if (i >= 0) { |
784 | pnp_registered = 1; | ||
763 | cards += i; | 785 | cards += i; |
786 | } | ||
764 | #endif | 787 | #endif |
765 | i = pnp_register_card_driver(&cs423x_pnpc_driver); | 788 | i = pnp_register_card_driver(&cs423x_pnpc_driver); |
766 | if (i > 0) | 789 | if (i >= 0) { |
790 | pnpc_registered = 1; | ||
767 | cards += i; | 791 | cards += i; |
792 | } | ||
768 | if (!cards) { | 793 | if (!cards) { |
769 | #ifdef CS4232 | ||
770 | pnp_unregister_driver(&cs4232_pnp_driver); | ||
771 | #endif | ||
772 | pnp_unregister_card_driver(&cs423x_pnpc_driver); | ||
773 | platform_driver_unregister(&cs423x_nonpnp_driver); | ||
774 | #ifdef MODULE | 794 | #ifdef MODULE |
775 | printk(KERN_ERR IDENT " soundcard not found or device busy\n"); | 795 | printk(KERN_ERR IDENT " soundcard not found or device busy\n"); |
776 | #endif | 796 | #endif |
777 | return -ENODEV; | 797 | err = -ENODEV; |
798 | goto errout; | ||
778 | } | 799 | } |
779 | return 0; | 800 | return 0; |
801 | |||
802 | errout: | ||
803 | snd_cs423x_unregister_all(); | ||
804 | return err; | ||
780 | } | 805 | } |
781 | 806 | ||
782 | static void __exit alsa_card_cs423x_exit(void) | 807 | static void __exit alsa_card_cs423x_exit(void) |
783 | { | 808 | { |
784 | #ifdef CS4232 | 809 | snd_cs423x_unregister_all(); |
785 | pnp_unregister_driver(&cs4232_pnp_driver); | ||
786 | #endif | ||
787 | pnp_unregister_card_driver(&cs423x_pnpc_driver); | ||
788 | platform_driver_unregister(&cs423x_nonpnp_driver); | ||
789 | } | 810 | } |
790 | 811 | ||
791 | module_init(alsa_card_cs423x_init) | 812 | module_init(alsa_card_cs423x_init) |