Browse Source

ide: fix host drivers depending on ide_generic to probe for interfaces (take 2)

* Add mpc8xx_ide_probe() to mpc8xx.c and call it from probe_for_hwifs().

* Convert ide_arm, ide-cris, ide-h8300, ide-pnp, buddha, falconide, gayle,
  macide, q40ide, cmd640 and mpc8xx host drivers to use ide_device_add().

  This removes dependency on ide_generic for these drivers so update
  ide/Kconfig accordingly.

v2:
* ide_arm build fix (s/ide_device_idx/ide_device_add/)
  (Thanks to Christoph Lameter <clameter@sgi.com> for reporting the problem).

Cc: Mikael Starvik <starvik@axis.com>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Roman Zippel <zippel@linux-m68k.org>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Bartlomiej Zolnierkiewicz 18 years ago
parent
commit
8ac4ce742c

+ 0 - 11
drivers/ide/Kconfig

@@ -327,7 +327,6 @@ config BLK_DEV_PLATFORM
 config BLK_DEV_CMD640
 config BLK_DEV_CMD640
 	bool "CMD640 chipset bugfix/support"
 	bool "CMD640 chipset bugfix/support"
 	depends on X86
 	depends on X86
-	select IDE_GENERIC
 	---help---
 	---help---
 	  The CMD-Technologies CMD640 IDE chip is used on many common 486 and
 	  The CMD-Technologies CMD640 IDE chip is used on many common 486 and
 	  Pentium motherboards, usually in combination with a "Neptune" or
 	  Pentium motherboards, usually in combination with a "Neptune" or
@@ -362,7 +361,6 @@ config BLK_DEV_CMD640_ENHANCED
 config BLK_DEV_IDEPNP
 config BLK_DEV_IDEPNP
 	bool "PNP EIDE support"
 	bool "PNP EIDE support"
 	depends on PNP
 	depends on PNP
-	select IDE_GENERIC
 	help
 	help
 	  If you have a PnP (Plug and Play) compatible EIDE card and
 	  If you have a PnP (Plug and Play) compatible EIDE card and
 	  would like the kernel to automatically detect and activate
 	  would like the kernel to automatically detect and activate
@@ -845,7 +843,6 @@ config BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ
 
 
 config IDE_ARM
 config IDE_ARM
 	def_bool ARM && (ARCH_CLPS7500 || ARCH_RPC || ARCH_SHARK)
 	def_bool ARM && (ARCH_CLPS7500 || ARCH_RPC || ARCH_SHARK)
-	select IDE_GENERIC
 
 
 config BLK_DEV_IDE_ICSIDE
 config BLK_DEV_IDE_ICSIDE
 	tristate "ICS IDE interface support"
 	tristate "ICS IDE interface support"
@@ -880,7 +877,6 @@ config ETRAX_IDE
 	bool "ETRAX IDE support"
 	bool "ETRAX IDE support"
 	depends on CRIS && BROKEN
 	depends on CRIS && BROKEN
 	select BLK_DEV_IDEDMA
 	select BLK_DEV_IDEDMA
-	select IDE_GENERIC
 	help
 	help
 	  Enables the ETRAX IDE driver.
 	  Enables the ETRAX IDE driver.
 
 
@@ -914,7 +910,6 @@ endchoice
 config IDE_H8300
 config IDE_H8300
 	bool "H8300 IDE support"
 	bool "H8300 IDE support"
 	depends on H8300
 	depends on H8300
-	select IDE_GENERIC
 	default y
 	default y
 	help
 	help
 	  Enables the H8300 IDE driver.
 	  Enables the H8300 IDE driver.
@@ -922,7 +917,6 @@ config IDE_H8300
 config BLK_DEV_GAYLE
 config BLK_DEV_GAYLE
 	bool "Amiga Gayle IDE interface support"
 	bool "Amiga Gayle IDE interface support"
 	depends on AMIGA
 	depends on AMIGA
-	select IDE_GENERIC
 	help
 	help
 	  This is the IDE driver for the Amiga Gayle IDE interface. It supports
 	  This is the IDE driver for the Amiga Gayle IDE interface. It supports
 	  both the `A1200 style' and `A4000 style' of the Gayle IDE interface,
 	  both the `A1200 style' and `A4000 style' of the Gayle IDE interface,
@@ -954,7 +948,6 @@ config BLK_DEV_IDEDOUBLER
 config BLK_DEV_BUDDHA
 config BLK_DEV_BUDDHA
 	bool "Buddha/Catweasel/X-Surf IDE interface support (EXPERIMENTAL)"
 	bool "Buddha/Catweasel/X-Surf IDE interface support (EXPERIMENTAL)"
 	depends on ZORRO && EXPERIMENTAL
 	depends on ZORRO && EXPERIMENTAL
-	select IDE_GENERIC
 	help
 	help
 	  This is the IDE driver for the IDE interfaces on the Buddha, 
 	  This is the IDE driver for the IDE interfaces on the Buddha, 
 	  Catweasel and X-Surf expansion boards.  It supports up to two interfaces 
 	  Catweasel and X-Surf expansion boards.  It supports up to two interfaces 
@@ -967,7 +960,6 @@ config BLK_DEV_BUDDHA
 config BLK_DEV_FALCON_IDE
 config BLK_DEV_FALCON_IDE
 	bool "Falcon IDE interface support"
 	bool "Falcon IDE interface support"
 	depends on ATARI
 	depends on ATARI
-	select IDE_GENERIC
 	help
 	help
 	  This is the IDE driver for the builtin IDE interface on the Atari
 	  This is the IDE driver for the builtin IDE interface on the Atari
 	  Falcon. Say Y if you have a Falcon and want to use IDE devices (hard
 	  Falcon. Say Y if you have a Falcon and want to use IDE devices (hard
@@ -977,7 +969,6 @@ config BLK_DEV_FALCON_IDE
 config BLK_DEV_MAC_IDE
 config BLK_DEV_MAC_IDE
 	bool "Macintosh Quadra/Powerbook IDE interface support"
 	bool "Macintosh Quadra/Powerbook IDE interface support"
 	depends on MAC
 	depends on MAC
-	select IDE_GENERIC
 	help
 	help
 	  This is the IDE driver for the builtin IDE interface on some m68k
 	  This is the IDE driver for the builtin IDE interface on some m68k
 	  Macintosh models. It supports both the `Quadra style' (used in
 	  Macintosh models. It supports both the `Quadra style' (used in
@@ -991,7 +982,6 @@ config BLK_DEV_MAC_IDE
 config BLK_DEV_Q40IDE
 config BLK_DEV_Q40IDE
 	bool "Q40/Q60 IDE interface support"
 	bool "Q40/Q60 IDE interface support"
 	depends on Q40
 	depends on Q40
-	select IDE_GENERIC
 	help
 	help
 	  Enable the on-board IDE controller in the Q40/Q60.  This should
 	  Enable the on-board IDE controller in the Q40/Q60.  This should
 	  normally be on; disable it only if you are running a custom hard
 	  normally be on; disable it only if you are running a custom hard
@@ -1000,7 +990,6 @@ config BLK_DEV_Q40IDE
 config BLK_DEV_MPC8xx_IDE
 config BLK_DEV_MPC8xx_IDE
 	bool "MPC8xx IDE support"
 	bool "MPC8xx IDE support"
 	depends on 8xx && (LWMON || IVMS8 || IVML24 || TQM8xxL) && IDE=y && BLK_DEV_IDE=y && !PPC_MERGE
 	depends on 8xx && (LWMON || IVMS8 || IVML24 || TQM8xxL) && IDE=y && BLK_DEV_IDE=y && !PPC_MERGE
-	select IDE_GENERIC
 	help
 	help
 	  This option provides support for IDE on Motorola MPC8xx Systems.
 	  This option provides support for IDE on Motorola MPC8xx Systems.
 	  Please see 'Type of MPC8xx IDE interface' for details.
 	  Please see 'Type of MPC8xx IDE interface' for details.

+ 4 - 0
drivers/ide/arm/ide_arm.c

@@ -28,6 +28,7 @@ void __init ide_arm_init(void)
 {
 {
 	ide_hwif_t *hwif;
 	ide_hwif_t *hwif;
 	hw_regs_t hw;
 	hw_regs_t hw;
+	u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
 
 
 	memset(&hw, 0, sizeof(hw));
 	memset(&hw, 0, sizeof(hw));
 	ide_std_init_ports(&hw, IDE_ARM_IO, IDE_ARM_IO + 0x206);
 	ide_std_init_ports(&hw, IDE_ARM_IO, IDE_ARM_IO + 0x206);
@@ -36,5 +37,8 @@ void __init ide_arm_init(void)
 	hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]);
 	hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]);
 	if (hwif) {
 	if (hwif) {
 		ide_init_port_hw(hwif, &hw);
 		ide_init_port_hw(hwif, &hw);
+		idx[0] = hwif->index;
+
+		ide_device_add(idx);
 	}
 	}
 }
 }

+ 6 - 3
drivers/ide/cris/ide-cris.c

@@ -758,9 +758,8 @@ void __init
 init_e100_ide (void)
 init_e100_ide (void)
 {
 {
 	hw_regs_t hw;
 	hw_regs_t hw;
-	int ide_offsets[IDE_NR_PORTS];
-	int h;
-	int i;
+	int ide_offsets[IDE_NR_PORTS], h, i;
+	u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
 
 
 	printk("ide: ETRAX FS built-in ATA DMA controller\n");
 	printk("ide: ETRAX FS built-in ATA DMA controller\n");
 
 
@@ -808,6 +807,8 @@ init_e100_ide (void)
 		hwif->drives[1].autotune = 1;
 		hwif->drives[1].autotune = 1;
 		hwif->ultra_mask = cris_ultra_mask;
 		hwif->ultra_mask = cris_ultra_mask;
 		hwif->mwdma_mask = 0x07; /* Multiword DMA 0-2 */
 		hwif->mwdma_mask = 0x07; /* Multiword DMA 0-2 */
+
+		idx[h] = hwif->index;
 	}
 	}
 
 
 	/* Reset pulse */
 	/* Reset pulse */
@@ -820,6 +821,8 @@ init_e100_ide (void)
 	cris_ide_set_speed(TYPE_PIO, ATA_PIO4_SETUP, ATA_PIO4_STROBE, ATA_PIO4_HOLD);
 	cris_ide_set_speed(TYPE_PIO, ATA_PIO4_SETUP, ATA_PIO4_STROBE, ATA_PIO4_HOLD);
 	cris_ide_set_speed(TYPE_DMA, 0, ATA_DMA2_STROBE, ATA_DMA2_HOLD);
 	cris_ide_set_speed(TYPE_DMA, 0, ATA_DMA2_STROBE, ATA_DMA2_HOLD);
 	cris_ide_set_speed(TYPE_UDMA, ATA_UDMA2_CYC, ATA_UDMA2_DVS, 0);
 	cris_ide_set_speed(TYPE_UDMA, ATA_UDMA2_CYC, ATA_UDMA2_DVS, 0);
+
+	ide_device_add(idx);
 }
 }
 
 
 static cris_dma_descr_type mydescr __attribute__ ((__aligned__(16)));
 static cris_dma_descr_type mydescr __attribute__ ((__aligned__(16)));

+ 6 - 0
drivers/ide/h8300/ide-h8300.c

@@ -89,6 +89,7 @@ void __init h8300_ide_init(void)
 	hw_regs_t hw;
 	hw_regs_t hw;
 	ide_hwif_t *hwif;
 	ide_hwif_t *hwif;
 	int index;
 	int index;
+	u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
 
 
 	if (!request_region(CONFIG_H8300_IDE_BASE, H8300_IDE_GAP*8, "ide-h8300"))
 	if (!request_region(CONFIG_H8300_IDE_BASE, H8300_IDE_GAP*8, "ide-h8300"))
 		goto out_busy;
 		goto out_busy;
@@ -111,6 +112,11 @@ void __init h8300_ide_init(void)
 	ide_init_port_hw(hwif, &hw);
 	ide_init_port_hw(hwif, &hw);
 	hwif_setup(hwif);
 	hwif_setup(hwif);
 	printk(KERN_INFO "ide%d: H8/300 generic IDE interface\n", index);
 	printk(KERN_INFO "ide%d: H8/300 generic IDE interface\n", index);
+
+	idx[0] = index;
+
+	ide_device_add(idx);
+
 	return;
 	return;
 
 
 out_busy:
 out_busy:

+ 4 - 0
drivers/ide/ide-pnp.c

@@ -43,12 +43,16 @@ static int idepnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id
 	hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]);
 	hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]);
 	if (hwif) {
 	if (hwif) {
 		u8 index = hwif->index;
 		u8 index = hwif->index;
+		u8 idx[4] = { index, 0xff, 0xff, 0xff };
 
 
 		ide_init_port_data(hwif, index);
 		ide_init_port_data(hwif, index);
 		ide_init_port_hw(hwif, &hw);
 		ide_init_port_hw(hwif, &hw);
 
 
 		printk(KERN_INFO "ide%d: generic PnP IDE interface\n", index);
 		printk(KERN_INFO "ide%d: generic PnP IDE interface\n", index);
 		pnp_set_drvdata(dev,hwif);
 		pnp_set_drvdata(dev,hwif);
+
+		ide_device_add(idx);
+
 		return 0;
 		return 0;
 	}
 	}
 
 

+ 4 - 0
drivers/ide/ide.c

@@ -1555,6 +1555,7 @@ done:
 extern void __init pnpide_init(void);
 extern void __init pnpide_init(void);
 extern void __exit pnpide_exit(void);
 extern void __exit pnpide_exit(void);
 extern void __init h8300_ide_init(void);
 extern void __init h8300_ide_init(void);
+extern void __init mpc8xx_ide_probe(void);
 
 
 /*
 /*
  * probe_for_hwifs() finds/initializes "known" IDE interfaces
  * probe_for_hwifs() finds/initializes "known" IDE interfaces
@@ -1619,6 +1620,9 @@ static void __init probe_for_hwifs (void)
 #ifdef CONFIG_H8300
 #ifdef CONFIG_H8300
 	h8300_ide_init();
 	h8300_ide_init();
 #endif
 #endif
+#ifdef BLK_DEV_MPC8xx_IDE
+	mpc8xx_ide_probe();
+#endif
 }
 }
 
 
 /*
 /*

+ 8 - 2
drivers/ide/legacy/buddha.c

@@ -156,6 +156,8 @@ void __init buddha_init(void)
 
 
 	while ((z = zorro_find_device(ZORRO_WILDCARD, z))) {
 	while ((z = zorro_find_device(ZORRO_WILDCARD, z))) {
 		unsigned long board;
 		unsigned long board;
+		u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
+
 		if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_BUDDHA) {
 		if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_BUDDHA) {
 			buddha_num_hwifs = BUDDHA_NUM_HWIFS;
 			buddha_num_hwifs = BUDDHA_NUM_HWIFS;
 			type=BOARD_BUDDHA;
 			type=BOARD_BUDDHA;
@@ -233,8 +235,12 @@ fail_base2:
 					printk("X-Surf");
 					printk("X-Surf");
 					break;
 					break;
 				}
 				}
-				printk(" IDE interface\n");	    
-			}		      
+				printk(" IDE interface\n");
+
+				idx[i] = index;
+			}
 		}
 		}
+
+		ide_device_add(idx);
 	}
 	}
 }
 }

+ 3 - 0
drivers/ide/legacy/falconide.c

@@ -75,10 +75,13 @@ void __init falconide_init(void)
 	hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]);
 	hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]);
 	if (hwif) {
 	if (hwif) {
 		u8 index = hwif->index;
 		u8 index = hwif->index;
+		u8 idx[4] = { index, 0xff, 0xff, 0xff };
 
 
 		ide_init_port_data(hwif, index);
 		ide_init_port_data(hwif, index);
 		ide_init_port_hw(hwif, &hw);
 		ide_init_port_hw(hwif, &hw);
 
 
 		printk("ide%d: Falcon IDE interface\n", index);
 		printk("ide%d: Falcon IDE interface\n", index);
+
+		ide_device_add(idx);
 	}
 	}
 }
 }

+ 5 - 0
drivers/ide/legacy/gayle.c

@@ -113,6 +113,7 @@ static int gayle_ack_intr_a1200(ide_hwif_t *hwif)
 void __init gayle_init(void)
 void __init gayle_init(void)
 {
 {
     int a4000, i;
     int a4000, i;
+    u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
 
 
     if (!MACH_IS_AMIGA)
     if (!MACH_IS_AMIGA)
 	return;
 	return;
@@ -183,7 +184,11 @@ found:
 		    break;
 		    break;
 #endif /* CONFIG_BLK_DEV_IDEDOUBLER */
 #endif /* CONFIG_BLK_DEV_IDEDOUBLER */
 	    }
 	    }
+
+	    idx[i] = index;
 	} else
 	} else
 	    release_mem_region(res_start, res_n);
 	    release_mem_region(res_start, res_n);
     }
     }
+
+    ide_device_add(idx);
 }
 }

+ 3 - 0
drivers/ide/legacy/macide.c

@@ -112,6 +112,7 @@ void __init macide_init(void)
 	hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]);
 	hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]);
 	if (hwif) {
 	if (hwif) {
 		u8 index = hwif->index;
 		u8 index = hwif->index;
+		u8 idx[4] = { index, 0xff, 0xff, 0xff };
 
 
 		ide_init_port_data(hwif, index);
 		ide_init_port_data(hwif, index);
 		ide_init_port_hw(hwif, &hw);
 		ide_init_port_hw(hwif, &hw);
@@ -135,5 +136,7 @@ void __init macide_init(void)
 			printk(KERN_INFO "ide%d: Macintosh Powerbook Baboon IDE interface\n", index);
 			printk(KERN_INFO "ide%d: Macintosh Powerbook Baboon IDE interface\n", index);
 		else
 		else
 			printk(KERN_INFO "ide%d: Unknown Macintosh IDE interface\n", index);
 			printk(KERN_INFO "ide%d: Unknown Macintosh IDE interface\n", index);
+
+		ide_device_add(idx);
 	}
 	}
 }
 }

+ 5 - 0
drivers/ide/legacy/q40ide.c

@@ -116,6 +116,7 @@ void __init q40ide_init(void)
     int i;
     int i;
     ide_hwif_t *hwif;
     ide_hwif_t *hwif;
     const char *name;
     const char *name;
+    u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
 
 
     if (!MACH_IS_Q40)
     if (!MACH_IS_Q40)
       return ;
       return ;
@@ -146,7 +147,11 @@ void __init q40ide_init(void)
 		ide_init_port_data(hwif, hwif->index);
 		ide_init_port_data(hwif, hwif->index);
 		ide_init_port_hw(hwif, &hw);
 		ide_init_port_hw(hwif, &hw);
 		hwif->mmio = 1;
 		hwif->mmio = 1;
+
+		idx[i] = hwif->index;
 	}
 	}
     }
     }
+
+    ide_device_add(idx);
 }
 }
 
 

+ 8 - 0
drivers/ide/pci/cmd640.c

@@ -717,6 +717,7 @@ int __init ide_probe_for_cmd640x (void)
 	const char *bus_type, *port2;
 	const char *bus_type, *port2;
 	unsigned int index;
 	unsigned int index;
 	u8 b, cfr;
 	u8 b, cfr;
+	u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
 
 
 	if (cmd640_vlb && probe_for_cmd640_vlb()) {
 	if (cmd640_vlb && probe_for_cmd640_vlb()) {
 		bus_type = "VLB";
 		bus_type = "VLB";
@@ -769,6 +770,8 @@ int __init ide_probe_for_cmd640x (void)
 	cmd_hwif0->set_pio_mode = &cmd640_set_pio_mode;
 	cmd_hwif0->set_pio_mode = &cmd640_set_pio_mode;
 #endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */
 #endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */
 
 
+	idx[0] = cmd_hwif0->index;
+
 	/*
 	/*
 	 * Ensure compatibility by always using the slowest timings
 	 * Ensure compatibility by always using the slowest timings
 	 * for access to the drive's command register block,
 	 * for access to the drive's command register block,
@@ -826,6 +829,8 @@ int __init ide_probe_for_cmd640x (void)
 		cmd_hwif1->pio_mask = ATA_PIO5;
 		cmd_hwif1->pio_mask = ATA_PIO5;
 		cmd_hwif1->set_pio_mode = &cmd640_set_pio_mode;
 		cmd_hwif1->set_pio_mode = &cmd640_set_pio_mode;
 #endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */
 #endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */
+
+		idx[1] = cmd_hwif1->index;
 	}
 	}
 	printk(KERN_INFO "%s: %sserialized, secondary interface %s\n", cmd_hwif1->name,
 	printk(KERN_INFO "%s: %sserialized, secondary interface %s\n", cmd_hwif1->name,
 		cmd_hwif0->serialized ? "" : "not ", port2);
 		cmd_hwif0->serialized ? "" : "not ", port2);
@@ -872,6 +877,9 @@ int __init ide_probe_for_cmd640x (void)
 #ifdef CMD640_DUMP_REGS
 #ifdef CMD640_DUMP_REGS
 	cmd640_dump_regs();
 	cmd640_dump_regs();
 #endif
 #endif
+
+	ide_device_add(idx);
+
 	return 1;
 	return 1;
 }
 }
 
 

+ 14 - 0
drivers/ide/ppc/mpc8xx.c

@@ -838,3 +838,17 @@ void m8xx_ide_init(void)
 	ppc_ide_md.default_io_base      = m8xx_ide_default_io_base;
 	ppc_ide_md.default_io_base      = m8xx_ide_default_io_base;
 	ppc_ide_md.ide_init_hwif        = m8xx_ide_init_hwif_ports;
 	ppc_ide_md.ide_init_hwif        = m8xx_ide_init_hwif_ports;
 }
 }
+
+void __init mpc8xx_ide_probe(void)
+{
+	u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
+
+#ifdef IDE0_BASE_OFFSET
+	idx[0] = 0;
+#ifdef IDE1_BASE_OFFSET
+	idx[1] = 1;
+#endif
+#endif
+
+	ide_device_add(idx);
+}