aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-04-17 18:46:34 -0400
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-04-17 18:46:34 -0400
commitffd4f6f0eed0423652826f3775077d11918b4180 (patch)
treef574449a3fa0da029d42b401336adefa42bca06b /drivers
parent26d799b729003220c0f3e5d9e046e1588c011897 (diff)
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 <bzolnier@gmail.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/ide/Kconfig4
-rw-r--r--drivers/ide/ide.c15
-rw-r--r--drivers/ide/legacy/Makefile1
-rw-r--r--drivers/ide/legacy/ide-4drives.c46
4 files changed, 52 insertions, 14 deletions
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig
index 29dd99caaf50..ec6b4a80e333 100644
--- a/drivers/ide/Kconfig
+++ b/drivers/ide/Kconfig
@@ -1035,8 +1035,8 @@ config BLK_DEV_4DRIVES
1035 Certain older chipsets, including the Tekram 690CD, use a single set 1035 Certain older chipsets, including the Tekram 690CD, use a single set
1036 of I/O ports at 0x1f0 to control up to four drives, instead of the 1036 of I/O ports at 0x1f0 to control up to four drives, instead of the
1037 customary two drives per port. Support for this can be enabled at 1037 customary two drives per port. Support for this can be enabled at
1038 runtime using the "ide0=four" kernel boot parameter if you say Y 1038 runtime using the "ide-4drives.probe" kernel boot parameter if you
1039 here. 1039 say Y here.
1040 1040
1041config BLK_DEV_ALI14XX 1041config BLK_DEV_ALI14XX
1042 tristate "ALI M14xx support" 1042 tristate "ALI M14xx support"
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c
index adecf45a0849..690b5ff4d88f 100644
--- a/drivers/ide/ide.c
+++ b/drivers/ide/ide.c
@@ -976,6 +976,7 @@ extern int probe_dtc2278;
976extern int probe_ht6560b; 976extern int probe_ht6560b;
977extern int probe_qd65xx; 977extern int probe_qd65xx;
978extern int cmd640_vlb; 978extern int cmd640_vlb;
979extern int probe_4drives;
979 980
980static int __initdata is_chipset_set; 981static int __initdata is_chipset_set;
981 982
@@ -1187,19 +1188,9 @@ static int __init ide_setup(char *s)
1187#endif 1188#endif
1188#ifdef CONFIG_BLK_DEV_4DRIVES 1189#ifdef CONFIG_BLK_DEV_4DRIVES
1189 case -11: /* "four" drives on one set of ports */ 1190 case -11: /* "four" drives on one set of ports */
1190 { 1191 probe_4drives = 1;
1191 ide_hwif_t *mate = &ide_hwifs[hw^1];
1192 mate->drives[0].select.all ^= 0x20;
1193 mate->drives[1].select.all ^= 0x20;
1194 hwif->chipset = mate->chipset = ide_4drives;
1195 mate->irq = hwif->irq;
1196 memcpy(mate->io_ports, hwif->io_ports, sizeof(hwif->io_ports));
1197 hwif->mate = mate;
1198 mate->mate = hwif;
1199 hwif->serialized = mate->serialized = 1;
1200 goto obsolete_option; 1192 goto obsolete_option;
1201 } 1193#endif
1202#endif /* CONFIG_BLK_DEV_4DRIVES */
1203 case -10: /* minus10 */ 1194 case -10: /* minus10 */
1204 case -9: /* minus9 */ 1195 case -9: /* minus9 */
1205 case -8: /* minus8 */ 1196 case -8: /* minus8 */
diff --git a/drivers/ide/legacy/Makefile b/drivers/ide/legacy/Makefile
index 7043ec7d1e05..6939329f89e8 100644
--- a/drivers/ide/legacy/Makefile
+++ b/drivers/ide/legacy/Makefile
@@ -6,6 +6,7 @@ obj-$(CONFIG_BLK_DEV_UMC8672) += umc8672.o
6obj-$(CONFIG_BLK_DEV_DTC2278) += dtc2278.o 6obj-$(CONFIG_BLK_DEV_DTC2278) += dtc2278.o
7obj-$(CONFIG_BLK_DEV_HT6560B) += ht6560b.o 7obj-$(CONFIG_BLK_DEV_HT6560B) += ht6560b.o
8obj-$(CONFIG_BLK_DEV_QD65XX) += qd65xx.o 8obj-$(CONFIG_BLK_DEV_QD65XX) += qd65xx.o
9obj-$(CONFIG_BLK_DEV_4DRIVES) += ide-4drives.o
9 10
10obj-$(CONFIG_BLK_DEV_GAYLE) += gayle.o 11obj-$(CONFIG_BLK_DEV_GAYLE) += gayle.o
11obj-$(CONFIG_BLK_DEV_FALCON_IDE) += falconide.o 12obj-$(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 000000000000..5aa7e93cfd31
--- /dev/null
+++ b/drivers/ide/legacy/ide-4drives.c
@@ -0,0 +1,46 @@
1
2#include <linux/kernel.h>
3#include <linux/init.h>
4#include <linux/module.h>
5#include <linux/ide.h>
6
7int probe_4drives = 0;
8
9module_param_named(probe, probe_4drives, bool, 0);
10MODULE_PARM_DESC(probe, "probe for generic IDE chipset with 4 drives/port");
11
12static int __init ide_4drives_init(void)
13{
14 ide_hwif_t *hwif, *mate;
15 u8 idx[4] = { 0, 1, 0xff, 0xff };
16
17 if (probe_4drives == 0)
18 return -ENODEV;
19
20 hwif = &ide_hwifs[0];
21 mate = &ide_hwifs[1];
22
23 memcpy(mate->io_ports, hwif->io_ports, sizeof(hwif->io_ports));
24
25 mate->irq = hwif->irq;
26
27 mate->chipset = hwif->chipset = ide_4drives;
28
29 mate->drives[0].select.all ^= 0x20;
30 mate->drives[1].select.all ^= 0x20;
31
32 hwif->mate = mate;
33 mate->mate = hwif;
34
35 hwif->serialized = mate->serialized = 1;
36
37 ide_device_add(idx, NULL);
38
39 return 0;
40}
41
42module_init(ide_4drives_init);
43
44MODULE_AUTHOR("Bartlomiej Zolnierkiewicz");
45MODULE_DESCRIPTION("generic IDE chipset with 4 drives/port support");
46MODULE_LICENSE("GPL");