]> git.karo-electronics.de Git - linux-beck.git/commitdiff
ide: add ide-4drives host driver (take 3)
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Thu, 17 Apr 2008 22:46:34 +0000 (00:46 +0200)
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Thu, 17 Apr 2008 22:46:34 +0000 (00:46 +0200)
CONFIG_BLK_DEV_4DRIVES deserves its own host driver:

* Add drivers/ide/legacy/ide-4drives.c and move "4drives" support there.

* Add ide-4drives.o in the link order after all other legacy host
  drivers enabled by "ide0=" options (they all are mutually exclusive).

* Make ide-4drives host driver probe itself for IDE devices instead of
  indirectly depending on ide_generic host driver.

* Add "probe" module parameter to ide-4drives and update documentation.

v2:
* s/paramater/parameter/ in ide.txt. (Noticed by Randy Dunlap)

v3:
* s/ide_4drives.probe/ide-4drives.probe/ in help entry.
  (Noticed by Sergei Shtylyov)

Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Documentation/ide/ide.txt
drivers/ide/Kconfig
drivers/ide/ide.c
drivers/ide/legacy/Makefile
drivers/ide/legacy/ide-4drives.c [new file with mode: 0644]

index 18c02df2f78f839c5efaecb8c2ff8ccf967ad588..486c699f4aea4722bb822a7af7ad12053f5c321c 100644 (file)
@@ -222,8 +222,6 @@ Summary of ide driver parameters for kernel command line
                          both the respective primary and secondary channel
                          to take effect.
 
                          both the respective primary and secondary channel
                          to take effect.
 
- "idex=four"           : four drives on idex and ide(x^1) share same ports
-
  "idex=reset"          : reset interface after probe
 
  "idex=ata66"          : informs the interface that it has an 80c cable
  "idex=reset"          : reset interface after probe
 
  "idex=ata66"          : informs the interface that it has an 80c cable
@@ -250,6 +248,9 @@ Also for legacy CMD640 host driver (cmd640) you need to use "probe_vlb"
 kernel paremeter to enable probing for VLB version of the chipset (PCI ones
 are detected automatically).
 
 kernel paremeter to enable probing for VLB version of the chipset (PCI ones
 are detected automatically).
 
+You also need to use "probe" kernel parameter for ide-4drives driver
+(support for IDE generic chipset with four drives on one port).
+
 ================================================================================
 
 Some Terminology
 ================================================================================
 
 Some Terminology
index 29dd99caaf50ed4d70e44c26165488cfb70bbc95..ec6b4a80e333f477af3a0012cab82d882c857908 100644 (file)
@@ -1035,8 +1035,8 @@ config BLK_DEV_4DRIVES
          Certain older chipsets, including the Tekram 690CD, use a single set
          of I/O ports at 0x1f0 to control up to four drives, instead of the
          customary two drives per port. Support for this can be enabled at
          Certain older chipsets, including the Tekram 690CD, use a single set
          of I/O ports at 0x1f0 to control up to four drives, instead of the
          customary two drives per port. Support for this can be enabled at
-         runtime using the "ide0=four" kernel boot parameter if you say Y
-         here.
+         runtime using the "ide-4drives.probe" kernel boot parameter if you
+         say Y here.
 
 config BLK_DEV_ALI14XX
        tristate "ALI M14xx support"
 
 config BLK_DEV_ALI14XX
        tristate "ALI M14xx support"
index adecf45a08490257b162196b1b2cc6c740d31196..690b5ff4d88ff9491f26b989292391545015375a 100644 (file)
@@ -976,6 +976,7 @@ extern int probe_dtc2278;
 extern int probe_ht6560b;
 extern int probe_qd65xx;
 extern int cmd640_vlb;
 extern int probe_ht6560b;
 extern int probe_qd65xx;
 extern int cmd640_vlb;
+extern int probe_4drives;
 
 static int __initdata is_chipset_set;
 
 
 static int __initdata is_chipset_set;
 
@@ -1187,19 +1188,9 @@ static int __init ide_setup(char *s)
 #endif
 #ifdef CONFIG_BLK_DEV_4DRIVES
                        case -11: /* "four" drives on one set of ports */
 #endif
 #ifdef CONFIG_BLK_DEV_4DRIVES
                        case -11: /* "four" drives on one set of ports */
-                       {
-                               ide_hwif_t *mate = &ide_hwifs[hw^1];
-                               mate->drives[0].select.all ^= 0x20;
-                               mate->drives[1].select.all ^= 0x20;
-                               hwif->chipset = mate->chipset = ide_4drives;
-                               mate->irq = hwif->irq;
-                               memcpy(mate->io_ports, hwif->io_ports, sizeof(hwif->io_ports));
-                               hwif->mate = mate;
-                               mate->mate = hwif;
-                               hwif->serialized = mate->serialized = 1;
+                               probe_4drives = 1;
                                goto obsolete_option;
                                goto obsolete_option;
-                       }
-#endif /* CONFIG_BLK_DEV_4DRIVES */
+#endif
                        case -10: /* minus10 */
                        case -9: /* minus9 */
                        case -8: /* minus8 */
                        case -10: /* minus10 */
                        case -9: /* minus9 */
                        case -8: /* minus8 */
index 7043ec7d1e056455eda8f7cbf2bdbf9e927fa44d..6939329f89e88e0dbe56adcb2aa55e41358ad97f 100644 (file)
@@ -6,6 +6,7 @@ obj-$(CONFIG_BLK_DEV_UMC8672)           += umc8672.o
 obj-$(CONFIG_BLK_DEV_DTC2278)          += dtc2278.o
 obj-$(CONFIG_BLK_DEV_HT6560B)          += ht6560b.o
 obj-$(CONFIG_BLK_DEV_QD65XX)           += qd65xx.o
 obj-$(CONFIG_BLK_DEV_DTC2278)          += dtc2278.o
 obj-$(CONFIG_BLK_DEV_HT6560B)          += ht6560b.o
 obj-$(CONFIG_BLK_DEV_QD65XX)           += qd65xx.o
+obj-$(CONFIG_BLK_DEV_4DRIVES)          += ide-4drives.o
 
 obj-$(CONFIG_BLK_DEV_GAYLE)            += gayle.o
 obj-$(CONFIG_BLK_DEV_FALCON_IDE)       += falconide.o
 
 obj-$(CONFIG_BLK_DEV_GAYLE)            += gayle.o
 obj-$(CONFIG_BLK_DEV_FALCON_IDE)       += falconide.o
diff --git a/drivers/ide/legacy/ide-4drives.c b/drivers/ide/legacy/ide-4drives.c
new file mode 100644 (file)
index 0000000..5aa7e93
--- /dev/null
@@ -0,0 +1,46 @@
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/ide.h>
+
+int probe_4drives = 0;
+
+module_param_named(probe, probe_4drives, bool, 0);
+MODULE_PARM_DESC(probe, "probe for generic IDE chipset with 4 drives/port");
+
+static int __init ide_4drives_init(void)
+{
+       ide_hwif_t *hwif, *mate;
+       u8 idx[4] = { 0, 1, 0xff, 0xff };
+
+       if (probe_4drives == 0)
+               return -ENODEV;
+
+       hwif = &ide_hwifs[0];
+       mate = &ide_hwifs[1];
+
+       memcpy(mate->io_ports, hwif->io_ports, sizeof(hwif->io_ports));
+
+       mate->irq = hwif->irq;
+
+       mate->chipset = hwif->chipset = ide_4drives;
+
+       mate->drives[0].select.all ^= 0x20;
+       mate->drives[1].select.all ^= 0x20;
+
+       hwif->mate = mate;
+       mate->mate = hwif;
+
+       hwif->serialized = mate->serialized = 1;
+
+       ide_device_add(idx, NULL);
+
+       return 0;
+}
+
+module_init(ide_4drives_init);
+
+MODULE_AUTHOR("Bartlomiej Zolnierkiewicz");
+MODULE_DESCRIPTION("generic IDE chipset with 4 drives/port support");
+MODULE_LICENSE("GPL");