From: Bartlomiej Zolnierkiewicz <B.Zolnierkiewicz@elka.pw.edu.pl>

[IDE] update ali14xx driver

- common ali14xx_init() for built-in and module
- do not call findPort() twice
- touch hwifs only if chipset was found and initialized
- release hwif only if hwif->chipset == ide_ali14xx
- when releasing hwif, restore hwif->channel to the default value
- mark exit functions with __exit
- do not use ide_hwifs[] directly
- minor cleanups



 25-akpm/drivers/ide/ide.c            |    4 -
 25-akpm/drivers/ide/legacy/ali14xx.c |  109 +++++++++++++----------------------
 2 files changed, 44 insertions(+), 69 deletions(-)

diff -puN drivers/ide/ide.c~ali14xx-update drivers/ide/ide.c
--- 25/drivers/ide/ide.c~ali14xx-update	Thu Sep 11 13:58:43 2003
+++ 25-akpm/drivers/ide/ide.c	Thu Sep 11 13:58:43 2003
@@ -1803,7 +1803,7 @@ static int __initdata probe_pdc4030;
 #endif
 #ifdef CONFIG_BLK_DEV_ALI14XX
 static int __initdata probe_ali14xx;
-extern void init_ali14xx(void);
+extern int ali14xx_init(void);
 #endif
 #ifdef CONFIG_BLK_DEV_UMC8672
 static int __initdata probe_umc8672;
@@ -2597,7 +2597,7 @@ int __init ide_init (void)
 
 #ifdef CONFIG_BLK_DEV_ALI14XX
 	if (probe_ali14xx)
-		init_ali14xx();
+		(void)ali14xx_init();
 #endif
 #ifdef CONFIG_BLK_DEV_UMC8672
 	if (probe_umc8672)
diff -puN drivers/ide/legacy/ali14xx.c~ali14xx-update drivers/ide/legacy/ali14xx.c
--- 25/drivers/ide/legacy/ali14xx.c~ali14xx-update	Thu Sep 11 13:58:43 2003
+++ 25-akpm/drivers/ide/legacy/ali14xx.c	Thu Sep 11 13:58:43 2003
@@ -198,22 +198,12 @@ static int __init initRegisters (void) {
 	return t;
 }
 
-int __init probe_ali14xx (void)
+static int __init ali14xx_probe(void)
 {
-	/* auto-detect IDE controller port */
-	if (!findPort()) {
-		printk(KERN_ERR "ali14xx: not found.\n");
-		return 1;
-	}
+	ide_hwif_t *hwif, *mate;
 
-	printk(KERN_DEBUG "ali14xx: base= 0x%03x, regOn = 0x%02x.\n", basePort, regOn);
-	ide_hwifs[0].chipset = ide_ali14xx;
-	ide_hwifs[1].chipset = ide_ali14xx;
-	ide_hwifs[0].tuneproc = &ali14xx_tune_drive;
-	ide_hwifs[1].tuneproc = &ali14xx_tune_drive;
-	ide_hwifs[0].mate = &ide_hwifs[1];
-	ide_hwifs[1].mate = &ide_hwifs[0];
-	ide_hwifs[1].channel = 1;
+	printk(KERN_DEBUG "ali14xx: base=0x%03x, regOn=0x%02x.\n",
+			  basePort, regOn);
 
 	/* initialize controller registers */
 	if (!initRegisters()) {
@@ -221,74 +211,59 @@ int __init probe_ali14xx (void)
 		return 1;
 	}
 
-	probe_hwif_init(&ide_hwifs[0]);
-	probe_hwif_init(&ide_hwifs[1]);
+	hwif = &ide_hwifs[0];
+	mate = &ide_hwifs[1];
 
-	return 0;
-}
+	hwif->chipset = ide_ali14xx;
+	hwif->tuneproc = &ali14xx_tune_drive;
+	hwif->mate = mate;
+
+	mate->chipset = ide_ali14xx;
+	mate->tuneproc = &ali14xx_tune_drive;
+	mate->mate = hwif;
+	mate->channel = 1;
 
-static void ali14xx_release (void)
-{
-	if (ide_hwifs[0].chipset != ide_ali14xx &&
-	    ide_hwifs[1].chipset != ide_ali14xx)
-		return;
+	probe_hwif_init(hwif);
+	probe_hwif_init(mate);
 
-	ide_hwifs[0].chipset = ide_unknown;
-	ide_hwifs[1].chipset = ide_unknown;
-	ide_hwifs[0].tuneproc = NULL;
-	ide_hwifs[1].tuneproc = NULL;
-	ide_hwifs[0].mate = NULL;
-	ide_hwifs[1].mate = NULL;
+	return 0;
 }
 
-#ifndef MODULE
-/*
- * init_ali14xx:
- *
- * called by ide.c when parsing command line
- */
-
-void __init init_ali14xx (void)
+/* Can be called directly from ide.c. */
+int __init ali14xx_init(void)
 {
 	/* auto-detect IDE controller port */
-        if (findPort())
-		if (probe_ali14xx())
-			goto no_detect;
-	return;
-
-no_detect:
+	if (findPort()) {
+		if (ali14xx_probe())
+			return -ENODEV;
+		return 0;
+	}
 	printk(KERN_ERR "ali14xx: not found.\n");
-	ali14xx_release();
+	return -ENODEV;
 }
 
-#else
-
-MODULE_AUTHOR("see local file");
-MODULE_DESCRIPTION("support of ALI 14XX IDE chipsets");
-MODULE_LICENSE("GPL");
-
-static int __init ali14xx_mod_init(void)
+#ifdef MODULE
+static void __exit ali14xx_release_hwif(ide_hwif_t *hwif)
 {
-	/* auto-detect IDE controller port */
-	if (findPort())
-		if (probe_ali14xx()) {
-			ali14xx_release();
-			return -ENODEV;
-		}
+	if (hwif->chipset != ide_ali14xx)
+		return;
 
-	if (ide_hwifs[0].chipset != ide_ali14xx &&
-	    ide_hwifs[1].chipset != ide_ali14xx) {
-		ali14xx_release();
-		return -ENODEV;
-	}
-	return 0;
+	hwif->chipset = ide_unknown;
+	hwif->tuneproc = NULL;
+	hwif->mate = NULL;
+	hwif->channel = 0;
 }
-module_init(ali14xx_mod_init);
 
-static void __exit ali14xx_mod_exit(void)
+static void __exit ali14xx_exit(void)
 {
-	ali14xx_release();
+	ali14xx_release_hwif(&ide_hwifs[0]);
+	ali14xx_release_hwif(&ide_hwifs[1]);
 }
-module_exit(ali14xx_mod_exit);
+
+module_init(ali14xx_init);
+module_exit(ali14xx_exit);
 #endif
 
+MODULE_AUTHOR("see local file");
+MODULE_DESCRIPTION("support of ALI 14XX IDE chipsets");
+MODULE_LICENSE("GPL");

_