aboutsummaryrefslogtreecommitdiffstats
path: root/sound/isa/gus
diff options
context:
space:
mode:
Diffstat (limited to 'sound/isa/gus')
-rw-r--r--sound/isa/gus/gusclassic.c16
-rw-r--r--sound/isa/gus/gusextreme.c16
-rw-r--r--sound/isa/gus/gusmax.c16
-rw-r--r--sound/isa/gus/interwave.c34
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.");
71module_param_array(pcm_channels, int, NULL, 0444); 71module_param_array(pcm_channels, int, NULL, 0444);
72MODULE_PARM_DESC(pcm_channels, "Reserved PCM channels for GUS Classic driver."); 72MODULE_PARM_DESC(pcm_channels, "Reserved PCM channels for GUS Classic driver.");
73 73
74static 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
232static 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
230static int __init alsa_card_gusclassic_init(void) 241static 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
263static void __exit alsa_card_gusclassic_exit(void) 275static 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
268module_init(alsa_card_gusclassic_init) 280module_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.");
87module_param_array(pcm_channels, int, NULL, 0444); 87module_param_array(pcm_channels, int, NULL, 0444);
88MODULE_PARM_DESC(pcm_channels, "Reserved PCM channels for GUS Extreme driver."); 88MODULE_PARM_DESC(pcm_channels, "Reserved PCM channels for GUS Extreme driver.");
89 89
90struct 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
342static 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
340static int __init alsa_card_gusextreme_init(void) 351static 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
373static void __exit alsa_card_gusextreme_exit(void) 385static 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
378module_init(alsa_card_gusextreme_init) 390module_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.");
72module_param_array(pcm_channels, int, NULL, 0444); 72module_param_array(pcm_channels, int, NULL, 0444);
73MODULE_PARM_DESC(pcm_channels, "Reserved PCM channels for GUS MAX driver."); 73MODULE_PARM_DESC(pcm_channels, "Reserved PCM channels for GUS MAX driver.");
74 74
75static struct platform_device *devices[SNDRV_CARDS];
76
75struct snd_gusmax { 77struct 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
369static 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
367static int __init alsa_card_gusmax_init(void) 378static 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
400static void __exit alsa_card_gusmax_exit(void) 412static 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
405module_init(alsa_card_gusmax_init) 417module_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.");
115module_param_array(effect, int, NULL, 0444); 115module_param_array(effect, int, NULL, 0444);
116MODULE_PARM_DESC(effect, "Effects enable for InterWave driver."); 116MODULE_PARM_DESC(effect, "Effects enable for InterWave driver.");
117 117
118static struct platform_device *platform_devices[SNDRV_CARDS];
119static int pnp_registered;
120
118struct snd_interwave { 121struct 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
920static 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
917static int __init alsa_card_interwave_init(void) 931static 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
956static void __exit alsa_card_interwave_exit(void) 975static 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
962module_init(alsa_card_interwave_init) 980module_init(alsa_card_interwave_init)