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

[IDE] update qd65xx driver

- common qd65xx_init() for built-in and module
- release hwif only if hwif->chipset == ide_qd65xx
- 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/qd65xx.c |   98 +++++++++++++++++-------------------
 2 files changed, 50 insertions(+), 52 deletions(-)

diff -puN drivers/ide/ide.c~qd65xx-update drivers/ide/ide.c
--- 25/drivers/ide/ide.c~qd65xx-update	Thu Sep 11 13:58:49 2003
+++ 25-akpm/drivers/ide/ide.c	Thu Sep 11 13:58:49 2003
@@ -1819,7 +1819,7 @@ extern int ht6560b_init(void);
 #endif
 #ifdef CONFIG_BLK_DEV_QD65XX
 static int __initdata probe_qd65xx;
-extern void init_qd65xx(void);
+extern int qd65xx_init(void);
 #endif
 
 static int __initdata is_chipset_set[MAX_HWIFS];
@@ -2613,7 +2613,7 @@ int __init ide_init (void)
 #endif
 #ifdef CONFIG_BLK_DEV_QD65XX
 	if (probe_qd65xx)
-		init_qd65xx();
+		(void)qd65xx_init();
 #endif
 
 	initializing = 1;
diff -puN drivers/ide/legacy/qd65xx.c~qd65xx-update drivers/ide/legacy/qd65xx.c
--- 25/drivers/ide/legacy/qd65xx.c~qd65xx-update	Thu Sep 11 13:58:49 2003
+++ 25-akpm/drivers/ide/legacy/qd65xx.c	Thu Sep 11 13:58:49 2003
@@ -338,12 +338,12 @@ static int __init qd_testreg(int port)
  * called to setup an ata channel : adjusts attributes & links for tuning
  */
 
-void __init qd_setup (int unit, int base, int config, unsigned int data0, unsigned int data1, void (*tuneproc) (ide_drive_t *, u8 pio))
+static void __init qd_setup(ide_hwif_t *hwif, int base, int config,
+			    unsigned int data0, unsigned int data1,
+			    void (*tuneproc) (ide_drive_t *, u8 pio))
 {
-	ide_hwif_t *hwif = &ide_hwifs[unit];
-
 	hwif->chipset = ide_qd65xx;
-	hwif->channel = unit;
+	hwif->channel = hwif->index;
 	hwif->select_data = base;
 	hwif->config_data = config;
 	hwif->drives[0].drive_data = data0;
@@ -354,19 +354,20 @@ void __init qd_setup (int unit, int base
 	probe_hwif_init(hwif);
 }
 
+#ifdef MODULE
 /*
  * qd_unsetup:
  *
  * called to unsetup an ata channel : back to default values, unlinks tuning
  */
-static void __exit qd_unsetup (int unit)
+static void __exit qd_unsetup(ide_hwif_t *hwif)
 {
-	ide_hwif_t *hwif = &ide_hwifs[unit];
 	u8 config = hwif->config_data;
 	int base = hwif->select_data;
 	void *tuneproc = (void *) hwif->tuneproc;
 
-	if (!(hwif->chipset == ide_qd65xx)) return;
+	if (hwif->chipset != ide_qd65xx)
+		return;
 
 	printk(KERN_NOTICE "%s: back to defaults\n", hwif->name);
 
@@ -381,13 +382,14 @@ static void __exit qd_unsetup (int unit)
 			qd_write_reg(QD6580_DEF_DATA, QD_TIMREG(&hwif->drives[0]));
 			qd_write_reg(QD6580_DEF_DATA2, QD_TIMREG(&hwif->drives[1]));
 		} else {
-			qd_write_reg(unit?QD6580_DEF_DATA2:QD6580_DEF_DATA, QD_TIMREG(&hwif->drives[0]));
+			qd_write_reg(hwif->channel ? QD6580_DEF_DATA2 : QD6580_DEF_DATA, QD_TIMREG(&hwif->drives[0]));
 		}
 	} else {
 		printk(KERN_WARNING "Unknown qd65xx tuning fonction !\n");
 		printk(KERN_WARNING "keeping settings !\n");
 	}
 }
+#endif
 
 /*
  * qd_probe:
@@ -396,8 +398,9 @@ static void __exit qd_unsetup (int unit)
  * return 1 if another qd may be probed
  */
 
-int __init qd_probe (int base)
+static int __init qd_probe(int base)
 {
+	ide_hwif_t *hwif;
 	u8 config;
 	u8 unit;
 
@@ -414,9 +417,8 @@ int __init qd_probe (int base)
 
 		/* qd6500 found */
 
-		printk(KERN_NOTICE "%s: qd6500 at %#x\n",
-			ide_hwifs[unit].name, base);
-		
+		hwif = &ide_hwifs[unit];
+		printk(KERN_NOTICE "%s: qd6500 at %#x\n", hwif->name, base);
 		printk(KERN_DEBUG "qd6500: config=%#x, ID3=%u\n",
 			config, QD_ID3);
 		
@@ -425,8 +427,8 @@ int __init qd_probe (int base)
 			return 1;
 		}
 
-		qd_setup(unit, base, config, QD6500_DEF_DATA,
-			QD6500_DEF_DATA, &qd6500_tune_drive);
+		qd_setup(hwif, base, config, QD6500_DEF_DATA, QD6500_DEF_DATA,
+			 &qd6500_tune_drive);
 		return 1;
 	}
 
@@ -448,25 +450,31 @@ int __init qd_probe (int base)
 
 		if (control & QD_CONTR_SEC_DISABLED) {
 			/* secondary disabled */
+
+			hwif = &ide_hwifs[unit];
 			printk(KERN_INFO "%s: qd6580: single IDE board\n",
-					ide_hwifs[unit].name);
-			qd_setup(unit, base, config | (control << 8),
-				QD6580_DEF_DATA, QD6580_DEF_DATA2,
-				&qd6580_tune_drive);
+					 hwif->name);
+			qd_setup(hwif, base, config | (control << 8),
+				 QD6580_DEF_DATA, QD6580_DEF_DATA2,
+				 &qd6580_tune_drive);
 			qd_write_reg(QD_DEF_CONTR,QD_CONTROL_PORT);
 
 			return 1;
 		} else {
+			ide_hwif_t *mate;
+
+			hwif = &ide_hwifs[0];
+			mate = &ide_hwifs[1];
 			/* secondary enabled */
 			printk(KERN_INFO "%s&%s: qd6580: dual IDE board\n",
-					ide_hwifs[0].name,ide_hwifs[1].name);
+					hwif->name, mate->name);
 
-			qd_setup(0, base, config | (control << 8),
-				QD6580_DEF_DATA, QD6580_DEF_DATA,
-				&qd6580_tune_drive);
-			qd_setup(1, base, config | (control << 8),
-				QD6580_DEF_DATA2, QD6580_DEF_DATA2,
-				&qd6580_tune_drive);
+			qd_setup(hwif, base, config | (control << 8),
+				 QD6580_DEF_DATA, QD6580_DEF_DATA,
+				 &qd6580_tune_drive);
+			qd_setup(mate, base, config | (control << 8),
+				 QD6580_DEF_DATA2, QD6580_DEF_DATA2,
+				 &qd6580_tune_drive);
 			qd_write_reg(QD_DEF_CONTR,QD_CONTROL_PORT);
 
 			return 0; /* no other qd65xx possible */
@@ -476,38 +484,28 @@ int __init qd_probe (int base)
 	return 1;
 }
 
-#ifndef MODULE
-/*
- * init_qd65xx:
- *
- * called by ide.c when parsing command line
- */
-
-void __init init_qd65xx (void)
-{
-	if (qd_probe(0x30)) qd_probe(0xb0);
-}
-
-#else
-
-MODULE_AUTHOR("Samuel Thibault");
-MODULE_DESCRIPTION("support of qd65xx vlb ide chipset");
-MODULE_LICENSE("GPL");
-
-static int __init qd65xx_mod_init(void)
+/* Can be called directly from ide.c. */
+int __init qd65xx_init(void)
 {
-	if (qd_probe(0x30)) qd_probe(0xb0);
+	if (qd_probe(0x30))
+		qd_probe(0xb0);
 	if (ide_hwifs[0].chipset != ide_qd65xx &&
 	    ide_hwifs[1].chipset != ide_qd65xx)
 		return -ENODEV;
 	return 0;
 }
-module_init(qd65xx_mod_init);
 
-static void __exit qd65xx_mod_exit(void)
+#ifdef MODULE
+static void __exit qd65xx_exit(void)
 {
-	qd_unsetup(0);
-	qd_unsetup(1);
+	qd_unsetup(&ide_hwifs[0]);
+	qd_unsetup(&ide_hwifs[1]);
 }
-module_exit(qd65xx_mod_exit);
+
+module_init(qd65xx_init);
+module_exit(qd65xx_exit);
 #endif
+
+MODULE_AUTHOR("Samuel Thibault");
+MODULE_DESCRIPTION("support of qd65xx vlb ide chipset");
+MODULE_LICENSE("GPL");

_