Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / sound / oss / wavfront.c
index cce1278..b1a4eeb 100644 (file)
@@ -151,11 +151,11 @@ static int (*midi_load_patch) (int devno, int format, const char __user *addr,
 
 /*** Module-accessible parameters ***************************************/
 
-int wf_raw;     /* we normally check for "raw state" to firmware
-                  loading. if set, then during driver loading, the
-                  state of the board is ignored, and we reset the
-                  board and load the firmware anyway.
-               */
+static int wf_raw;     /* we normally check for "raw state" to firmware
+                          loading. if set, then during driver loading, the
+                          state of the board is ignored, and we reset the
+                          board and load the firmware anyway.
+                       */
                   
 static int fx_raw = 1; /* if this is zero, we'll leave the FX processor in
                          whatever state it is when the driver is loaded.
@@ -2434,7 +2434,7 @@ static int __init detect_wavefront (int irq, int io_base)
           consumes 16.
        */
 
-       if (check_region (io_base, 16)) {
+       if (!request_region (io_base, 16, "wavfront")) {
                printk (KERN_ERR LOGNAME "IO address range 0x%x - 0x%x "
                        "already in use - ignored\n", dev.base,
                        dev.base+15);
@@ -2466,10 +2466,13 @@ static int __init detect_wavefront (int irq, int io_base)
                } else {
                        printk (KERN_WARNING LOGNAME "not raw, but no "
                                "hardware version!\n");
+                       release_region (io_base, 16);
                        return 0;
                }
 
                if (!wf_raw) {
+                       /* will re-acquire region in install_wavefront() */
+                       release_region (io_base, 16);
                        return 1;
                } else {
                        printk (KERN_INFO LOGNAME
@@ -2489,6 +2492,7 @@ static int __init detect_wavefront (int irq, int io_base)
 
        if (wavefront_hw_reset ()) {
                printk (KERN_WARNING LOGNAME "hardware reset failed\n");
+               release_region (io_base, 16);
                return 0;
        }
 
@@ -2496,6 +2500,8 @@ static int __init detect_wavefront (int irq, int io_base)
 
        dev.has_fx = (detect_wffx () == 0);
 
+       /* will re-acquire region in install_wavefront() */
+       release_region (io_base, 16);
        return 1;
 }
 
@@ -2804,17 +2810,27 @@ static int __init wavefront_init (int atboot)
 }
 
 static int __init install_wavefront (void)
-
 {
+       if (!request_region (dev.base+2, 6, "wavefront synth"))
+               return -1;
+
+       if (dev.has_fx) {
+               if (!request_region (dev.base+8, 8, "wavefront fx")) {
+                       release_region (dev.base+2, 6);
+                       return -1;
+               }
+       }
+
        if ((dev.synth_dev = register_sound_synth (&wavefront_fops, -1)) < 0) {
                printk (KERN_ERR LOGNAME "cannot register raw synth\n");
-               return -1;
+               goto err_out;
        }
 
 #if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
        if ((dev.oss_dev = sound_alloc_synthdev()) == -1) {
                printk (KERN_ERR LOGNAME "Too many sequencers\n");
-               return -1;
+               /* FIXME: leak: should unregister sound synth */
+               goto err_out;
        } else {
                synth_devs[dev.oss_dev] = &wavefront_operations;
        }
@@ -2827,20 +2843,20 @@ static int __init install_wavefront (void)
                sound_unload_synthdev (dev.oss_dev);
 #endif /* OSS_SUPPORT_SEQ */ 
 
-               return -1;
+               goto err_out;
        }
     
-       request_region (dev.base+2, 6, "wavefront synth");
-
-       if (dev.has_fx) {
-               request_region (dev.base+8, 8, "wavefront fx");
-       }
-
        if (wavefront_config_midi ()) {
                printk (KERN_WARNING LOGNAME "could not initialize MIDI.\n");
        }
 
        return dev.oss_dev;
+
+err_out:
+       release_region (dev.base+2, 6);
+       if (dev.has_fx)
+               release_region (dev.base+8, 8);
+       return -1;
 }
 
 static void __exit uninstall_wavefront (void)
@@ -2911,7 +2927,7 @@ int __init detect_wffx (void)
        return 0;
 }      
 
-void
+static void
 wffx_mute (int onoff)
     
 {