diff options
Diffstat (limited to 'sound/isa/gus')
-rw-r--r-- | sound/isa/gus/gusclassic.c | 16 | ||||
-rw-r--r-- | sound/isa/gus/gusextreme.c | 16 | ||||
-rw-r--r-- | sound/isa/gus/gusmax.c | 16 | ||||
-rw-r--r-- | sound/isa/gus/interwave.c | 34 |
4 files changed, 68 insertions, 14 deletions
diff --git a/sound/isa/gus/gusclassic.c b/sound/isa/gus/gusclassic.c index 57beb74f5b9d..d1165b96fa3f 100644 --- a/sound/isa/gus/gusclassic.c +++ b/sound/isa/gus/gusclassic.c | |||
@@ -71,6 +71,8 @@ MODULE_PARM_DESC(channels, "GF1 channels for GUS Classic driver."); | |||
71 | module_param_array(pcm_channels, int, NULL, 0444); | 71 | module_param_array(pcm_channels, int, NULL, 0444); |
72 | MODULE_PARM_DESC(pcm_channels, "Reserved PCM channels for GUS Classic driver."); | 72 | MODULE_PARM_DESC(pcm_channels, "Reserved PCM channels for GUS Classic driver."); |
73 | 73 | ||
74 | static struct platform_device *devices[SNDRV_CARDS]; | ||
75 | |||
74 | 76 | ||
75 | #define PFX "gusclassic: " | 77 | #define PFX "gusclassic: " |
76 | 78 | ||
@@ -227,6 +229,15 @@ static struct platform_driver snd_gusclassic_driver = { | |||
227 | }, | 229 | }, |
228 | }; | 230 | }; |
229 | 231 | ||
232 | static void __init_or_module snd_gusclassic_unregister_all(void) | ||
233 | { | ||
234 | int i; | ||
235 | |||
236 | for (i = 0; i < ARRAY_SIZE(devices); ++i) | ||
237 | platform_device_unregister(devices[i]); | ||
238 | platform_driver_unregister(&snd_gusclassic_driver); | ||
239 | } | ||
240 | |||
230 | static int __init alsa_card_gusclassic_init(void) | 241 | static int __init alsa_card_gusclassic_init(void) |
231 | { | 242 | { |
232 | int i, cards, err; | 243 | int i, cards, err; |
@@ -244,6 +255,7 @@ static int __init alsa_card_gusclassic_init(void) | |||
244 | err = PTR_ERR(device); | 255 | err = PTR_ERR(device); |
245 | goto errout; | 256 | goto errout; |
246 | } | 257 | } |
258 | devices[i] = device; | ||
247 | cards++; | 259 | cards++; |
248 | } | 260 | } |
249 | if (!cards) { | 261 | if (!cards) { |
@@ -256,13 +268,13 @@ static int __init alsa_card_gusclassic_init(void) | |||
256 | return 0; | 268 | return 0; |
257 | 269 | ||
258 | errout: | 270 | errout: |
259 | platform_driver_unregister(&snd_gusclassic_driver); | 271 | snd_gusclassic_unregister_all(); |
260 | return err; | 272 | return err; |
261 | } | 273 | } |
262 | 274 | ||
263 | static void __exit alsa_card_gusclassic_exit(void) | 275 | static void __exit alsa_card_gusclassic_exit(void) |
264 | { | 276 | { |
265 | platform_driver_unregister(&snd_gusclassic_driver); | 277 | snd_gusclassic_unregister_all(); |
266 | } | 278 | } |
267 | 279 | ||
268 | module_init(alsa_card_gusclassic_init) | 280 | module_init(alsa_card_gusclassic_init) |
diff --git a/sound/isa/gus/gusextreme.c b/sound/isa/gus/gusextreme.c index 6fad9734a853..239f16e6b9ee 100644 --- a/sound/isa/gus/gusextreme.c +++ b/sound/isa/gus/gusextreme.c | |||
@@ -87,6 +87,8 @@ MODULE_PARM_DESC(channels, "GF1 channels for GUS Extreme driver."); | |||
87 | module_param_array(pcm_channels, int, NULL, 0444); | 87 | module_param_array(pcm_channels, int, NULL, 0444); |
88 | MODULE_PARM_DESC(pcm_channels, "Reserved PCM channels for GUS Extreme driver."); | 88 | MODULE_PARM_DESC(pcm_channels, "Reserved PCM channels for GUS Extreme driver."); |
89 | 89 | ||
90 | struct platform_device *devices[SNDRV_CARDS]; | ||
91 | |||
90 | 92 | ||
91 | #define PFX "gusextreme: " | 93 | #define PFX "gusextreme: " |
92 | 94 | ||
@@ -337,6 +339,15 @@ static struct platform_driver snd_gusextreme_driver = { | |||
337 | }, | 339 | }, |
338 | }; | 340 | }; |
339 | 341 | ||
342 | static void __init_or_module snd_gusextreme_unregister_all(void) | ||
343 | { | ||
344 | int i; | ||
345 | |||
346 | for (i = 0; i < ARRAY_SIZE(devices); ++i) | ||
347 | platform_device_unregister(devices[i]); | ||
348 | platform_driver_unregister(&snd_gusextreme_driver); | ||
349 | } | ||
350 | |||
340 | static int __init alsa_card_gusextreme_init(void) | 351 | static int __init alsa_card_gusextreme_init(void) |
341 | { | 352 | { |
342 | int i, cards, err; | 353 | int i, cards, err; |
@@ -354,6 +365,7 @@ static int __init alsa_card_gusextreme_init(void) | |||
354 | err = PTR_ERR(device); | 365 | err = PTR_ERR(device); |
355 | goto errout; | 366 | goto errout; |
356 | } | 367 | } |
368 | devices[i] = device; | ||
357 | cards++; | 369 | cards++; |
358 | } | 370 | } |
359 | if (!cards) { | 371 | if (!cards) { |
@@ -366,13 +378,13 @@ static int __init alsa_card_gusextreme_init(void) | |||
366 | return 0; | 378 | return 0; |
367 | 379 | ||
368 | errout: | 380 | errout: |
369 | platform_driver_unregister(&snd_gusextreme_driver); | 381 | snd_gusextreme_unregister_all(); |
370 | return err; | 382 | return err; |
371 | } | 383 | } |
372 | 384 | ||
373 | static void __exit alsa_card_gusextreme_exit(void) | 385 | static void __exit alsa_card_gusextreme_exit(void) |
374 | { | 386 | { |
375 | platform_driver_unregister(&snd_gusextreme_driver); | 387 | snd_gusextreme_unregister_all(); |
376 | } | 388 | } |
377 | 389 | ||
378 | module_init(alsa_card_gusextreme_init) | 390 | module_init(alsa_card_gusextreme_init) |
diff --git a/sound/isa/gus/gusmax.c b/sound/isa/gus/gusmax.c index d1b70ee9b039..d4d2b2a517d5 100644 --- a/sound/isa/gus/gusmax.c +++ b/sound/isa/gus/gusmax.c | |||
@@ -72,6 +72,8 @@ MODULE_PARM_DESC(channels, "Used GF1 channels for GUS MAX driver."); | |||
72 | module_param_array(pcm_channels, int, NULL, 0444); | 72 | module_param_array(pcm_channels, int, NULL, 0444); |
73 | MODULE_PARM_DESC(pcm_channels, "Reserved PCM channels for GUS MAX driver."); | 73 | MODULE_PARM_DESC(pcm_channels, "Reserved PCM channels for GUS MAX driver."); |
74 | 74 | ||
75 | static struct platform_device *devices[SNDRV_CARDS]; | ||
76 | |||
75 | struct snd_gusmax { | 77 | struct snd_gusmax { |
76 | int irq; | 78 | int irq; |
77 | struct snd_card *card; | 79 | struct snd_card *card; |
@@ -364,6 +366,15 @@ static struct platform_driver snd_gusmax_driver = { | |||
364 | }, | 366 | }, |
365 | }; | 367 | }; |
366 | 368 | ||
369 | static void __init_or_module snd_gusmax_unregister_all(void) | ||
370 | { | ||
371 | int i; | ||
372 | |||
373 | for (i = 0; i < ARRAY_SIZE(devices); ++i) | ||
374 | platform_device_unregister(devices[i]); | ||
375 | platform_driver_unregister(&snd_gusmax_driver); | ||
376 | } | ||
377 | |||
367 | static int __init alsa_card_gusmax_init(void) | 378 | static int __init alsa_card_gusmax_init(void) |
368 | { | 379 | { |
369 | int i, cards, err; | 380 | int i, cards, err; |
@@ -381,6 +392,7 @@ static int __init alsa_card_gusmax_init(void) | |||
381 | err = PTR_ERR(device); | 392 | err = PTR_ERR(device); |
382 | goto errout; | 393 | goto errout; |
383 | } | 394 | } |
395 | devices[i] = device; | ||
384 | cards++; | 396 | cards++; |
385 | } | 397 | } |
386 | if (!cards) { | 398 | if (!cards) { |
@@ -393,13 +405,13 @@ static int __init alsa_card_gusmax_init(void) | |||
393 | return 0; | 405 | return 0; |
394 | 406 | ||
395 | errout: | 407 | errout: |
396 | platform_driver_unregister(&snd_gusmax_driver); | 408 | snd_gusmax_unregister_all(); |
397 | return err; | 409 | return err; |
398 | } | 410 | } |
399 | 411 | ||
400 | static void __exit alsa_card_gusmax_exit(void) | 412 | static void __exit alsa_card_gusmax_exit(void) |
401 | { | 413 | { |
402 | platform_driver_unregister(&snd_gusmax_driver); | 414 | snd_gusmax_unregister_all(); |
403 | } | 415 | } |
404 | 416 | ||
405 | module_init(alsa_card_gusmax_init) | 417 | module_init(alsa_card_gusmax_init) |
diff --git a/sound/isa/gus/interwave.c b/sound/isa/gus/interwave.c index 67a5f7402453..9838d992b101 100644 --- a/sound/isa/gus/interwave.c +++ b/sound/isa/gus/interwave.c | |||
@@ -115,6 +115,9 @@ MODULE_PARM_DESC(pcm_channels, "Reserved PCM channels for InterWave driver."); | |||
115 | module_param_array(effect, int, NULL, 0444); | 115 | module_param_array(effect, int, NULL, 0444); |
116 | MODULE_PARM_DESC(effect, "Effects enable for InterWave driver."); | 116 | MODULE_PARM_DESC(effect, "Effects enable for InterWave driver."); |
117 | 117 | ||
118 | static struct platform_device *platform_devices[SNDRV_CARDS]; | ||
119 | static int pnp_registered; | ||
120 | |||
118 | struct snd_interwave { | 121 | struct snd_interwave { |
119 | int irq; | 122 | int irq; |
120 | struct snd_card *card; | 123 | struct snd_card *card; |
@@ -914,6 +917,17 @@ static struct pnp_card_driver interwave_pnpc_driver = { | |||
914 | 917 | ||
915 | #endif /* CONFIG_PNP */ | 918 | #endif /* CONFIG_PNP */ |
916 | 919 | ||
920 | static void __init_or_module snd_interwave_unregister_all(void) | ||
921 | { | ||
922 | int i; | ||
923 | |||
924 | if (pnp_registered) | ||
925 | pnp_unregister_card_driver(&interwave_pnpc_driver); | ||
926 | for (i = 0; i < ARRAY_SIZE(platform_devices); ++i) | ||
927 | platform_device_unregister(platform_devices[i]); | ||
928 | platform_driver_unregister(&snd_interwave_driver); | ||
929 | } | ||
930 | |||
917 | static int __init alsa_card_interwave_init(void) | 931 | static int __init alsa_card_interwave_init(void) |
918 | { | 932 | { |
919 | int i, err, cards = 0; | 933 | int i, err, cards = 0; |
@@ -931,32 +945,36 @@ static int __init alsa_card_interwave_init(void) | |||
931 | i, NULL, 0); | 945 | i, NULL, 0); |
932 | if (IS_ERR(device)) { | 946 | if (IS_ERR(device)) { |
933 | err = PTR_ERR(device); | 947 | err = PTR_ERR(device); |
934 | platform_driver_unregister(&snd_interwave_driver); | 948 | goto errout; |
935 | return err; | ||
936 | } | 949 | } |
950 | platform_devices[i] = device; | ||
937 | cards++; | 951 | cards++; |
938 | } | 952 | } |
939 | 953 | ||
940 | /* ISA PnP cards */ | 954 | /* ISA PnP cards */ |
941 | i = pnp_register_card_driver(&interwave_pnpc_driver); | 955 | i = pnp_register_card_driver(&interwave_pnpc_driver); |
942 | if (i > 0) | 956 | if (i >= 0) { |
957 | pnp_registered = 1; | ||
943 | cards += i; | 958 | cards += i; |
959 | } | ||
944 | 960 | ||
945 | if (!cards) { | 961 | if (!cards) { |
946 | pnp_unregister_card_driver(&interwave_pnpc_driver); | ||
947 | platform_driver_unregister(&snd_interwave_driver); | ||
948 | #ifdef MODULE | 962 | #ifdef MODULE |
949 | printk(KERN_ERR "InterWave soundcard not found or device busy\n"); | 963 | printk(KERN_ERR "InterWave soundcard not found or device busy\n"); |
950 | #endif | 964 | #endif |
951 | return -ENODEV; | 965 | err = -ENODEV; |
966 | goto errout; | ||
952 | } | 967 | } |
953 | return 0; | 968 | return 0; |
969 | |||
970 | errout: | ||
971 | snd_interwave_unregister_all(); | ||
972 | return err; | ||
954 | } | 973 | } |
955 | 974 | ||
956 | static void __exit alsa_card_interwave_exit(void) | 975 | static void __exit alsa_card_interwave_exit(void) |
957 | { | 976 | { |
958 | pnp_unregister_card_driver(&interwave_pnpc_driver); | 977 | snd_interwave_unregister_all(); |
959 | platform_driver_unregister(&snd_interwave_driver); | ||
960 | } | 978 | } |
961 | 979 | ||
962 | module_init(alsa_card_interwave_init) | 980 | module_init(alsa_card_interwave_init) |