From ffd4f6f0eed0423652826f3775077d11918b4180 Mon Sep 17 00:00:00 2001 From: Bartlomiej Zolnierkiewicz Date: Fri, 18 Apr 2008 00:46:34 +0200 Subject: ide: add ide-4drives host driver (take 3) 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 --- drivers/ide/Kconfig | 4 ++-- drivers/ide/ide.c | 15 +++---------- drivers/ide/legacy/Makefile | 1 + drivers/ide/legacy/ide-4drives.c | 46 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 14 deletions(-) create mode 100644 drivers/ide/legacy/ide-4drives.c (limited to 'drivers/ide') diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index 29dd99caaf5..ec6b4a80e33 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig @@ -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 - 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" diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index adecf45a084..690b5ff4d88 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c @@ -976,6 +976,7 @@ extern int probe_dtc2278; extern int probe_ht6560b; extern int probe_qd65xx; extern int cmd640_vlb; +extern int probe_4drives; 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 */ - { - 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; - } -#endif /* CONFIG_BLK_DEV_4DRIVES */ +#endif case -10: /* minus10 */ case -9: /* minus9 */ case -8: /* minus8 */ diff --git a/drivers/ide/legacy/Makefile b/drivers/ide/legacy/Makefile index 7043ec7d1e0..6939329f89e 100644 --- a/drivers/ide/legacy/Makefile +++ b/drivers/ide/legacy/Makefile @@ -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_4DRIVES) += ide-4drives.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 index 00000000000..5aa7e93cfd3 --- /dev/null +++ b/drivers/ide/legacy/ide-4drives.c @@ -0,0 +1,46 @@ + +#include +#include +#include +#include + +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"); -- cgit v1.2.3-70-g09d2