Please apply,
	Zwane Mwaikambo
--- linux-2.4.19-pre-ac/drivers/sound/opl3sa2.c.orig	Mon Apr 29 15:14:17 2002
+++ linux-2.4.19-pre-ac/drivers/sound/opl3sa2.c	Mon Apr 29 15:28:52 2002
@@ -57,6 +57,8 @@
  *                         (Jan 7, 2001)
  * Zwane Mwaikambo	   Added PM support. (Dec 4 2001)
  * Zwane Mwaikambo	   Code, data structure cleanups. (Feb 15 2002)
+ * Zwane Mwaikambo	   Free resources during auxiliary device probe
+ * 			   failures (Apr 29 2002)
  *
  */
 
@@ -142,7 +144,7 @@
 	unsigned int	card;
 	int		chipset;	/* What's my version(s)? */
 	char		*chipset_name;
-
+	
 	/* mixer data */
 	int		mixer;
 	unsigned int	volume_l;
@@ -236,7 +238,6 @@
 	*data = inb(port + 1);
 }
 
-
 /*
  * All of the mixer functions...
  */
@@ -584,9 +585,9 @@
 }
 
 
-static inline void __init attach_opl3sa2_mpu(struct address_info* hw_config)
+static inline int __init attach_opl3sa2_mpu(struct address_info* hw_config)
 {
-	attach_mpu401(hw_config, THIS_MODULE);
+	return attach_mpu401(hw_config, THIS_MODULE);
 }
 
 
@@ -641,7 +642,7 @@
 	if(!request_region(hw_config->io_base, 2, OPL3SA2_MODULE_NAME)) {
 		printk(KERN_ERR PFX "Control I/O port %#x not free\n",
 		       hw_config->io_base);
-		return 0;
+		goto out_nodev;
 	}
 
 	/*
@@ -654,7 +655,7 @@
 	if(tmp != misc) {
 		printk(KERN_ERR PFX "Control I/O port %#x is not a YMF7xx chipset!\n",
 		       hw_config->io_base);
-		return 0;
+		goto out_region;
 	}
 
 	/*
@@ -667,7 +668,7 @@
 		printk(KERN_ERR
 		       PFX "Control I/O port %#x is not a YMF7xx chipset!\n",
 		       hw_config->io_base);
-		return 0;
+		goto out_region;
 	}
 	opl3sa2_write(hw_config->io_base, OPL3SA2_MIC, tmp);
 
@@ -714,9 +715,13 @@
 	if(opl3sa2_state[card].chipset != CHIPSET_UNKNOWN) {
 		/* Generate a pretty name */
 		opl3sa2_state[card].chipset_name = (char *)CHIPSET_TABLE[opl3sa2_state[card].chipset];
-		return 1;
+		return 0;
 	}
-	return 0;
+
+out_region:
+	release_region(hw_config->io_base, 2);
+out_nodev:
+	return -ENODEV;
 }
 
 
@@ -914,7 +919,7 @@
 
 #ifdef CONFIG_PM
 /* Power Management support functions */
-static int opl3sa2_suspend(struct pm_dev *pdev, unsigned char pm_mode)
+static int opl3sa2_suspend(struct pm_dev *pdev, unsigned int pm_mode)
 {
 	unsigned long flags;
 	opl3sa2_state_t *p;
@@ -975,11 +980,9 @@
 
 static int opl3sa2_pm_callback(struct pm_dev *pdev, pm_request_t rqst, void *data)
 {
-	unsigned char mode = (unsigned  char)data;
-
 	switch (rqst) {
 		case PM_SUSPEND:
-			return opl3sa2_suspend(pdev, mode);
+			return opl3sa2_suspend(pdev, (unsigned int)data);
 
 		case PM_RESUME:
 			return opl3sa2_resume(pdev);
@@ -995,8 +998,7 @@
  */
 static int __init init_opl3sa2(void)
 {
-        int card;
-	int max;
+        int card, max;
 
 	/* Sanitize isapnp and multiple settings */
 	isapnp = isapnp != 0 ? 1 : 0;
@@ -1060,15 +1062,19 @@
 			opl3sa2_clear_slots(&opl3sa2_state[card].cfg_mss);
 			opl3sa2_clear_slots(&opl3sa2_state[card].cfg_mpu);
 		}
+		
+		if (probe_opl3sa2(&opl3sa2_state[card].cfg, card))
+			return -ENODEV;
 
-		if(!probe_opl3sa2(&opl3sa2_state[card].cfg, card) ||
-		   !probe_opl3sa2_mss(&opl3sa2_state[card].cfg_mss)) {
+		if(!probe_opl3sa2_mss(&opl3sa2_state[card].cfg_mss)) {
 			/*
 			 * If one or more cards are already registered, don't
 			 * return an error but print a warning.  Note, this
 			 * should never really happen unless the hardware or
 			 * ISA PnP screwed up.
 			 */
+			release_region(opl3sa2_state[card].cfg.io_base, 2);
+
 			if(opl3sa2_cards_num) {
 				printk(KERN_WARNING
 				       PFX "There was a problem probing one "
@@ -1114,10 +1120,13 @@
 			opl3sa2_set_loopback(&opl3sa2_state[card].cfg, loopback);
 		}
 		
-		/* Attach MPU if we've been asked to do so */
+		/* Attach MPU if we've been asked to do so, failure isn't fatal */
 		if(opl3sa2_state[card].cfg_mpu.io_base != -1) {
 			if(probe_opl3sa2_mpu(&opl3sa2_state[card].cfg_mpu)) {
-				attach_opl3sa2_mpu(&opl3sa2_state[card].cfg_mpu);
+				if (attach_opl3sa2_mpu(&opl3sa2_state[card].cfg_mpu)) {
+					printk(KERN_ERR PFX "failed to attach MPU401\n");
+					opl3sa2_state[card].cfg_mpu.slots[1] = -1;
+				}
 			}
 		}
 	}
-- http://function.linuxpower.ca- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/