diff options
Diffstat (limited to 'sound/isa/opl3sa2.c')
-rw-r--r-- | sound/isa/opl3sa2.c | 43 |
1 files changed, 32 insertions, 11 deletions
diff --git a/sound/isa/opl3sa2.c b/sound/isa/opl3sa2.c index aafe5565b6e5..ca359e0c674b 100644 --- a/sound/isa/opl3sa2.c +++ b/sound/isa/opl3sa2.c | |||
@@ -90,6 +90,10 @@ MODULE_PARM_DESC(dma2, "DMA2 # for OPL3-SA driver."); | |||
90 | module_param_array(opl3sa3_ymode, int, NULL, 0444); | 90 | module_param_array(opl3sa3_ymode, int, NULL, 0444); |
91 | MODULE_PARM_DESC(opl3sa3_ymode, "Speaker size selection for 3D Enhancement mode: Desktop/Large Notebook/Small Notebook/HiFi."); | 91 | MODULE_PARM_DESC(opl3sa3_ymode, "Speaker size selection for 3D Enhancement mode: Desktop/Large Notebook/Small Notebook/HiFi."); |
92 | 92 | ||
93 | static struct platform_device *platform_devices[SNDRV_CARDS]; | ||
94 | static int pnp_registered; | ||
95 | static int pnpc_registered; | ||
96 | |||
93 | /* control ports */ | 97 | /* control ports */ |
94 | #define OPL3SA2_PM_CTRL 0x01 | 98 | #define OPL3SA2_PM_CTRL 0x01 |
95 | #define OPL3SA2_SYS_CTRL 0x02 | 99 | #define OPL3SA2_SYS_CTRL 0x02 |
@@ -921,6 +925,19 @@ static struct platform_driver snd_opl3sa2_nonpnp_driver = { | |||
921 | }, | 925 | }, |
922 | }; | 926 | }; |
923 | 927 | ||
928 | static void __init_or_module snd_opl3sa2_unregister_all(void) | ||
929 | { | ||
930 | int i; | ||
931 | |||
932 | if (pnpc_registered) | ||
933 | pnp_unregister_card_driver(&opl3sa2_pnpc_driver); | ||
934 | if (pnp_registered) | ||
935 | pnp_unregister_driver(&opl3sa2_pnp_driver); | ||
936 | for (i = 0; i < ARRAY_SIZE(platform_devices); ++i) | ||
937 | platform_device_unregister(platform_devices[i]); | ||
938 | platform_driver_unregister(&snd_opl3sa2_nonpnp_driver); | ||
939 | } | ||
940 | |||
924 | static int __init alsa_card_opl3sa2_init(void) | 941 | static int __init alsa_card_opl3sa2_init(void) |
925 | { | 942 | { |
926 | int i, err, cards = 0; | 943 | int i, err, cards = 0; |
@@ -938,36 +955,40 @@ static int __init alsa_card_opl3sa2_init(void) | |||
938 | i, NULL, 0); | 955 | i, NULL, 0); |
939 | if (IS_ERR(device)) { | 956 | if (IS_ERR(device)) { |
940 | err = PTR_ERR(device); | 957 | err = PTR_ERR(device); |
941 | platform_driver_unregister(&snd_opl3sa2_nonpnp_driver); | 958 | goto errout; |
942 | return err; | ||
943 | } | 959 | } |
960 | platform_devices[i] = device; | ||
944 | cards++; | 961 | cards++; |
945 | } | 962 | } |
946 | 963 | ||
947 | err = pnp_register_driver(&opl3sa2_pnp_driver); | 964 | err = pnp_register_driver(&opl3sa2_pnp_driver); |
948 | if (err > 0) | 965 | if (err >= 0) { |
966 | pnp_registered = 1; | ||
949 | cards += err; | 967 | cards += err; |
968 | } | ||
950 | err = pnp_register_card_driver(&opl3sa2_pnpc_driver); | 969 | err = pnp_register_card_driver(&opl3sa2_pnpc_driver); |
951 | if (err > 0) | 970 | if (err >= 0) { |
971 | pnpc_registered = 1; | ||
952 | cards += err; | 972 | cards += err; |
973 | } | ||
953 | 974 | ||
954 | if (!cards) { | 975 | if (!cards) { |
955 | #ifdef MODULE | 976 | #ifdef MODULE |
956 | snd_printk(KERN_ERR "Yamaha OPL3-SA soundcard not found or device busy\n"); | 977 | snd_printk(KERN_ERR "Yamaha OPL3-SA soundcard not found or device busy\n"); |
957 | #endif | 978 | #endif |
958 | pnp_unregister_card_driver(&opl3sa2_pnpc_driver); | 979 | err = -ENODEV; |
959 | pnp_unregister_driver(&opl3sa2_pnp_driver); | 980 | goto errout; |
960 | platform_driver_unregister(&snd_opl3sa2_nonpnp_driver); | ||
961 | return -ENODEV; | ||
962 | } | 981 | } |
963 | return 0; | 982 | return 0; |
983 | |||
984 | errout: | ||
985 | snd_opl3sa2_unregister_all(); | ||
986 | return err; | ||
964 | } | 987 | } |
965 | 988 | ||
966 | static void __exit alsa_card_opl3sa2_exit(void) | 989 | static void __exit alsa_card_opl3sa2_exit(void) |
967 | { | 990 | { |
968 | pnp_unregister_card_driver(&opl3sa2_pnpc_driver); | 991 | snd_opl3sa2_unregister_all(); |
969 | pnp_unregister_driver(&opl3sa2_pnp_driver); | ||
970 | platform_driver_unregister(&snd_opl3sa2_nonpnp_driver); | ||
971 | } | 992 | } |
972 | 993 | ||
973 | module_init(alsa_card_opl3sa2_init) | 994 | module_init(alsa_card_opl3sa2_init) |