diff options
Diffstat (limited to 'sound/isa/es18xx.c')
-rw-r--r-- | sound/isa/es18xx.c | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/sound/isa/es18xx.c b/sound/isa/es18xx.c index 34d47132f082..bf5de0782eb0 100644 --- a/sound/isa/es18xx.c +++ b/sound/isa/es18xx.c | |||
@@ -1877,6 +1877,9 @@ MODULE_PARM_DESC(dma1, "DMA 1 # for ES18xx driver."); | |||
1877 | module_param_array(dma2, int, NULL, 0444); | 1877 | module_param_array(dma2, int, NULL, 0444); |
1878 | MODULE_PARM_DESC(dma2, "DMA 2 # for ES18xx driver."); | 1878 | MODULE_PARM_DESC(dma2, "DMA 2 # for ES18xx driver."); |
1879 | 1879 | ||
1880 | static struct platform_device *platform_devices[SNDRV_CARDS]; | ||
1881 | static int pnp_registered; | ||
1882 | |||
1880 | #ifdef CONFIG_PNP | 1883 | #ifdef CONFIG_PNP |
1881 | 1884 | ||
1882 | static struct pnp_card_device_id snd_audiodrive_pnpids[] = { | 1885 | static struct pnp_card_device_id snd_audiodrive_pnpids[] = { |
@@ -2202,6 +2205,17 @@ static struct pnp_card_driver es18xx_pnpc_driver = { | |||
2202 | }; | 2205 | }; |
2203 | #endif /* CONFIG_PNP */ | 2206 | #endif /* CONFIG_PNP */ |
2204 | 2207 | ||
2208 | static void __init_or_module snd_es18xx_unregister_all(void) | ||
2209 | { | ||
2210 | int i; | ||
2211 | |||
2212 | if (pnp_registered) | ||
2213 | pnp_unregister_card_driver(&es18xx_pnpc_driver); | ||
2214 | for (i = 0; i < ARRAY_SIZE(platform_devices); ++i) | ||
2215 | platform_device_unregister(platform_devices[i]); | ||
2216 | platform_driver_unregister(&snd_es18xx_nonpnp_driver); | ||
2217 | } | ||
2218 | |||
2205 | static int __init alsa_card_es18xx_init(void) | 2219 | static int __init alsa_card_es18xx_init(void) |
2206 | { | 2220 | { |
2207 | int i, err, cards = 0; | 2221 | int i, err, cards = 0; |
@@ -2217,31 +2231,35 @@ static int __init alsa_card_es18xx_init(void) | |||
2217 | i, NULL, 0); | 2231 | i, NULL, 0); |
2218 | if (IS_ERR(device)) { | 2232 | if (IS_ERR(device)) { |
2219 | err = PTR_ERR(device); | 2233 | err = PTR_ERR(device); |
2220 | platform_driver_unregister(&snd_es18xx_nonpnp_driver); | 2234 | goto errout; |
2221 | return err; | ||
2222 | } | 2235 | } |
2236 | platform_devices[i] = device; | ||
2223 | cards++; | 2237 | cards++; |
2224 | } | 2238 | } |
2225 | 2239 | ||
2226 | i = pnp_register_card_driver(&es18xx_pnpc_driver); | 2240 | i = pnp_register_card_driver(&es18xx_pnpc_driver); |
2227 | if (i > 0) | 2241 | if (i >= 0) { |
2242 | pnp_registered = 1; | ||
2228 | cards += i; | 2243 | cards += i; |
2244 | } | ||
2229 | 2245 | ||
2230 | if(!cards) { | 2246 | if(!cards) { |
2231 | pnp_unregister_card_driver(&es18xx_pnpc_driver); | ||
2232 | platform_driver_unregister(&snd_es18xx_nonpnp_driver); | ||
2233 | #ifdef MODULE | 2247 | #ifdef MODULE |
2234 | snd_printk(KERN_ERR "ESS AudioDrive ES18xx soundcard not found or device busy\n"); | 2248 | snd_printk(KERN_ERR "ESS AudioDrive ES18xx soundcard not found or device busy\n"); |
2235 | #endif | 2249 | #endif |
2236 | return -ENODEV; | 2250 | err = -ENODEV; |
2251 | goto errout; | ||
2237 | } | 2252 | } |
2238 | return 0; | 2253 | return 0; |
2254 | |||
2255 | errout: | ||
2256 | snd_es18xx_unregister_all(); | ||
2257 | return err; | ||
2239 | } | 2258 | } |
2240 | 2259 | ||
2241 | static void __exit alsa_card_es18xx_exit(void) | 2260 | static void __exit alsa_card_es18xx_exit(void) |
2242 | { | 2261 | { |
2243 | pnp_unregister_card_driver(&es18xx_pnpc_driver); | 2262 | snd_es18xx_unregister_all(); |
2244 | platform_driver_unregister(&snd_es18xx_nonpnp_driver); | ||
2245 | } | 2263 | } |
2246 | 2264 | ||
2247 | module_init(alsa_card_es18xx_init) | 2265 | module_init(alsa_card_es18xx_init) |