ide: make remaining built-in only IDE host drivers modular (take 2)

* Make remaining built-in only IDE host drivers modular, add ide-scan-pci.c
  file for probing PCI host drivers registered with IDE core (special case
  for built-in IDE and CONFIG_IDEPCI_PCIBUS_ORDER=y) and then take care of
  the ordering in which all IDE host drivers are probed when IDE is built-in
  during link time.

* Move probing of gayle, falconide, macide, q40ide and buddha (m68k arch
  specific) host drivers, before PCI ones (no PCI on m68k), ide-cris (cris
  arch specific), cmd640 (x86 arch specific) and pmac (ppc arch specific).

* Move probing of ide-cris (cris arch specific) host driver before cmd640
  (x86 arch specific).

* Move probing of mpc8xx (ppc specific) host driver before ide-pnp (depends
  on ISA and none of ppc platform that use mpc8xx supports ISA) and ide-h8300
  (h8300 arch specific).

* Add "probe_vlb" kernel parameter to cmd640 host driver and update
  Documentation/ide.txt accordingly.

* Make IDE_ARM config option visible so it can also be disabled if needed.

* Remove bogus comment from ide.c while at it.

v2:
* Fix two issues spotted by Sergei:
  - replace ENOMEM error value by ENOENT in ide-h8300 host driver
  - fix MODULE_PARM_DESC() in cmd640 host driver

Cc: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Cc: Mikael Starvik <starvik@axis.com>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Roman Zippel <zippel@linux-m68k.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 8ac4ce74
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
*** ***
*** The CMD640 is also used on some Vesa Local Bus (VLB) cards, and is *NOT* *** The CMD640 is also used on some Vesa Local Bus (VLB) cards, and is *NOT*
*** automatically detected by Linux. For safe, reliable operation with such *** automatically detected by Linux. For safe, reliable operation with such
*** interfaces, one *MUST* use the "ide0=cmd640_vlb" kernel option. *** interfaces, one *MUST* use the "cmd640.probe_vlb" kernel option.
*** ***
*** Use of the "serialize" option is no longer necessary. *** Use of the "serialize" option is no longer necessary.
...@@ -292,9 +292,6 @@ The following are valid ONLY on ide0, which usually corresponds ...@@ -292,9 +292,6 @@ The following are valid ONLY on ide0, which usually corresponds
to the first ATA interface found on the particular host, and the defaults for to the first ATA interface found on the particular host, and the defaults for
the base,ctl ports must not be altered. the base,ctl ports must not be altered.
"ide0=cmd640_vlb" : *REQUIRED* for VLB cards with the CMD640 chip
(not for PCI -- automatically detected)
"ide=doubler" : probe/support IDE doublers on Amiga "ide=doubler" : probe/support IDE doublers on Amiga
There may be more options than shown -- use the source, Luke! There may be more options than shown -- use the source, Luke!
...@@ -310,6 +307,10 @@ i.e. to enable probing for ALI M14xx chipsets (ali14xx host driver) use: ...@@ -310,6 +307,10 @@ i.e. to enable probing for ALI M14xx chipsets (ali14xx host driver) use:
* "probe" module parameter when ali14xx driver is compiled as module * "probe" module parameter when ali14xx driver is compiled as module
("modprobe ali14xx probe") ("modprobe ali14xx probe")
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).
================================================================================ ================================================================================
IDE ATAPI streaming tape driver IDE ATAPI streaming tape driver
......
...@@ -325,7 +325,7 @@ config BLK_DEV_PLATFORM ...@@ -325,7 +325,7 @@ config BLK_DEV_PLATFORM
If unsure, say N. If unsure, say N.
config BLK_DEV_CMD640 config BLK_DEV_CMD640
bool "CMD640 chipset bugfix/support" tristate "CMD640 chipset bugfix/support"
depends on X86 depends on X86
---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
...@@ -359,7 +359,7 @@ config BLK_DEV_CMD640_ENHANCED ...@@ -359,7 +359,7 @@ config BLK_DEV_CMD640_ENHANCED
Otherwise say N. Otherwise say N.
config BLK_DEV_IDEPNP config BLK_DEV_IDEPNP
bool "PNP EIDE support" tristate "PNP EIDE support"
depends on PNP depends on PNP
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
...@@ -788,7 +788,7 @@ config BLK_DEV_CELLEB ...@@ -788,7 +788,7 @@ config BLK_DEV_CELLEB
endif endif
config BLK_DEV_IDE_PMAC config BLK_DEV_IDE_PMAC
bool "Builtin PowerMac IDE support" tristate "Builtin PowerMac IDE support"
depends on PPC_PMAC && IDE=y && BLK_DEV_IDE=y depends on PPC_PMAC && IDE=y && BLK_DEV_IDE=y
help help
This driver provides support for the built-in IDE controller on This driver provides support for the built-in IDE controller on
...@@ -842,7 +842,9 @@ config BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ ...@@ -842,7 +842,9 @@ config BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ
depends on BLK_DEV_IDE_AU1XXX depends on BLK_DEV_IDE_AU1XXX
config IDE_ARM config IDE_ARM
def_bool ARM && (ARCH_CLPS7500 || ARCH_RPC || ARCH_SHARK) tristate "ARM IDE support"
depends on ARM && (ARCH_CLPS7500 || ARCH_RPC || ARCH_SHARK)
default y
config BLK_DEV_IDE_ICSIDE config BLK_DEV_IDE_ICSIDE
tristate "ICS IDE interface support" tristate "ICS IDE interface support"
...@@ -874,7 +876,7 @@ config BLK_DEV_IDE_BAST ...@@ -874,7 +876,7 @@ config BLK_DEV_IDE_BAST
Simtec BAST or the Thorcom VR1000 Simtec BAST or the Thorcom VR1000
config ETRAX_IDE config ETRAX_IDE
bool "ETRAX IDE support" tristate "ETRAX IDE support"
depends on CRIS && BROKEN depends on CRIS && BROKEN
select BLK_DEV_IDEDMA select BLK_DEV_IDEDMA
help help
...@@ -908,14 +910,14 @@ config ETRAX_IDE_G27_RESET ...@@ -908,14 +910,14 @@ config ETRAX_IDE_G27_RESET
endchoice endchoice
config IDE_H8300 config IDE_H8300
bool "H8300 IDE support" tristate "H8300 IDE support"
depends on H8300 depends on H8300
default y default y
help help
Enables the H8300 IDE driver. Enables the H8300 IDE driver.
config BLK_DEV_GAYLE config BLK_DEV_GAYLE
bool "Amiga Gayle IDE interface support" tristate "Amiga Gayle IDE interface support"
depends on AMIGA depends on AMIGA
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
...@@ -946,7 +948,7 @@ config BLK_DEV_IDEDOUBLER ...@@ -946,7 +948,7 @@ config BLK_DEV_IDEDOUBLER
runtime using the "ide=doubler" kernel boot parameter. runtime using the "ide=doubler" kernel boot parameter.
config BLK_DEV_BUDDHA config BLK_DEV_BUDDHA
bool "Buddha/Catweasel/X-Surf IDE interface support (EXPERIMENTAL)" tristate "Buddha/Catweasel/X-Surf IDE interface support (EXPERIMENTAL)"
depends on ZORRO && EXPERIMENTAL depends on ZORRO && EXPERIMENTAL
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,
...@@ -958,7 +960,7 @@ config BLK_DEV_BUDDHA ...@@ -958,7 +960,7 @@ config BLK_DEV_BUDDHA
to one of its IDE interfaces. to one of its IDE interfaces.
config BLK_DEV_FALCON_IDE config BLK_DEV_FALCON_IDE
bool "Falcon IDE interface support" tristate "Falcon IDE interface support"
depends on ATARI depends on ATARI
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
...@@ -967,7 +969,7 @@ config BLK_DEV_FALCON_IDE ...@@ -967,7 +969,7 @@ config BLK_DEV_FALCON_IDE
interface. interface.
config BLK_DEV_MAC_IDE config BLK_DEV_MAC_IDE
bool "Macintosh Quadra/Powerbook IDE interface support" tristate "Macintosh Quadra/Powerbook IDE interface support"
depends on MAC depends on MAC
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
...@@ -980,7 +982,7 @@ config BLK_DEV_MAC_IDE ...@@ -980,7 +982,7 @@ config BLK_DEV_MAC_IDE
builtin IDE interface. builtin IDE interface.
config BLK_DEV_Q40IDE config BLK_DEV_Q40IDE
bool "Q40/Q60 IDE interface support" tristate "Q40/Q60 IDE interface support"
depends on Q40 depends on Q40
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
...@@ -988,7 +990,7 @@ config BLK_DEV_Q40IDE ...@@ -988,7 +990,7 @@ config BLK_DEV_Q40IDE
drive subsystem through an expansion card. drive subsystem through an expansion card.
config BLK_DEV_MPC8xx_IDE config BLK_DEV_MPC8xx_IDE
bool "MPC8xx IDE support" tristate "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
help help
This option provides support for IDE on Motorola MPC8xx Systems. This option provides support for IDE on Motorola MPC8xx Systems.
......
...@@ -7,41 +7,37 @@ ...@@ -7,41 +7,37 @@
# Note : at this point, these files are compiled on all systems. # Note : at this point, these files are compiled on all systems.
# In the future, some of these should be built conditionally. # In the future, some of these should be built conditionally.
# #
# First come modules that register themselves with the core # link order is important here
EXTRA_CFLAGS += -Idrivers/ide EXTRA_CFLAGS += -Idrivers/ide
obj-$(CONFIG_BLK_DEV_IDE) += pci/
ide-core-y += ide.o ide-io.o ide-iops.o ide-lib.o ide-probe.o ide-taskfile.o ide-core-y += ide.o ide-io.o ide-iops.o ide-lib.o ide-probe.o ide-taskfile.o
ide-core-$(CONFIG_BLK_DEV_CMD640) += pci/cmd640.o # core IDE code
# Core IDE code - must come before legacy
ide-core-$(CONFIG_BLK_DEV_IDEPCI) += setup-pci.o ide-core-$(CONFIG_BLK_DEV_IDEPCI) += setup-pci.o
ide-core-$(CONFIG_BLK_DEV_IDEDMA) += ide-dma.o ide-core-$(CONFIG_BLK_DEV_IDEDMA) += ide-dma.o
ide-core-$(CONFIG_IDE_PROC_FS) += ide-proc.o ide-core-$(CONFIG_IDE_PROC_FS) += ide-proc.o
ide-core-$(CONFIG_BLK_DEV_IDEPNP) += ide-pnp.o
ide-core-$(CONFIG_BLK_DEV_IDEACPI) += ide-acpi.o ide-core-$(CONFIG_BLK_DEV_IDEACPI) += ide-acpi.o
# built-in only drivers from arm/ obj-$(CONFIG_BLK_DEV_IDE) += ide-core.o
ide-core-$(CONFIG_IDE_ARM) += arm/ide_arm.o
# built-in only drivers from legacy/ ifeq ($(CONFIG_IDE_ARM), y)
ide-core-$(CONFIG_BLK_DEV_BUDDHA) += legacy/buddha.o ide-arm-core-y += arm/ide_arm.o
ide-core-$(CONFIG_BLK_DEV_FALCON_IDE) += legacy/falconide.o obj-y += ide-arm-core.o
ide-core-$(CONFIG_BLK_DEV_GAYLE) += legacy/gayle.o endif
ide-core-$(CONFIG_BLK_DEV_MAC_IDE) += legacy/macide.o
ide-core-$(CONFIG_BLK_DEV_Q40IDE) += legacy/q40ide.o
# built-in only drivers from ppc/ obj-$(CONFIG_BLK_DEV_IDE) += legacy/ pci/
ide-core-$(CONFIG_BLK_DEV_MPC8xx_IDE) += ppc/mpc8xx.o
ide-core-$(CONFIG_BLK_DEV_IDE_PMAC) += ppc/pmac.o
# built-in only drivers from h8300/ obj-$(CONFIG_IDEPCI_PCIBUS_ORDER) += ide-scan-pci.o
ide-core-$(CONFIG_IDE_H8300) += h8300/ide-h8300.o
obj-$(CONFIG_BLK_DEV_IDE) += ide-core.o ifeq ($(CONFIG_BLK_DEV_CMD640), y)
cmd640-core-y += pci/cmd640.o
obj-y += cmd640-core.o
endif
obj-$(CONFIG_BLK_DEV_IDE) += cris/ ppc/
obj-$(CONFIG_BLK_DEV_IDEPNP) += ide-pnp.o
obj-$(CONFIG_IDE_H8300) += h8300/
obj-$(CONFIG_IDE_GENERIC) += ide-generic.o obj-$(CONFIG_IDE_GENERIC) += ide-generic.o
obj-$(CONFIG_BLK_DEV_IDEDISK) += ide-disk.o obj-$(CONFIG_BLK_DEV_IDEDISK) += ide-disk.o
...@@ -49,6 +45,20 @@ obj-$(CONFIG_BLK_DEV_IDECD) += ide-cd.o ...@@ -49,6 +45,20 @@ obj-$(CONFIG_BLK_DEV_IDECD) += ide-cd.o
obj-$(CONFIG_BLK_DEV_IDETAPE) += ide-tape.o obj-$(CONFIG_BLK_DEV_IDETAPE) += ide-tape.o
obj-$(CONFIG_BLK_DEV_IDEFLOPPY) += ide-floppy.o obj-$(CONFIG_BLK_DEV_IDEFLOPPY) += ide-floppy.o
obj-$(CONFIG_BLK_DEV_IDE) += legacy/ arm/ mips/ ifeq ($(CONFIG_BLK_DEV_IDECS), y)
obj-$(CONFIG_BLK_DEV_HD) += legacy/ ide-cs-core-y += legacy/ide-cs.o
obj-$(CONFIG_ETRAX_IDE) += cris/ obj-y += ide-cs-core.o
endif
ifeq ($(CONFIG_BLK_DEV_PLATFORM), y)
ide-platform-core-y += legacy/ide_platform.o
obj-y += ide-platform-core.o
endif
obj-$(CONFIG_BLK_DEV_IDE) += arm/ mips/
# old hd driver must be last
ifeq ($(CONFIG_BLK_DEV_HD), y)
hd-core-y += legacy/hd.o
obj-y += hd-core.o
endif
...@@ -3,4 +3,8 @@ obj-$(CONFIG_BLK_DEV_IDE_ICSIDE) += icside.o ...@@ -3,4 +3,8 @@ obj-$(CONFIG_BLK_DEV_IDE_ICSIDE) += icside.o
obj-$(CONFIG_BLK_DEV_IDE_RAPIDE) += rapide.o obj-$(CONFIG_BLK_DEV_IDE_RAPIDE) += rapide.o
obj-$(CONFIG_BLK_DEV_IDE_BAST) += bast-ide.o obj-$(CONFIG_BLK_DEV_IDE_BAST) += bast-ide.o
ifeq ($(CONFIG_IDE_ARM), m)
obj-m += ide_arm.o
endif
EXTRA_CFLAGS := -Idrivers/ide EXTRA_CFLAGS := -Idrivers/ide
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
# define IDE_ARM_IRQ IRQ_HARDDISK # define IDE_ARM_IRQ IRQ_HARDDISK
#endif #endif
void __init ide_arm_init(void) static int __init ide_arm_init(void)
{ {
ide_hwif_t *hwif; ide_hwif_t *hwif;
hw_regs_t hw; hw_regs_t hw;
...@@ -41,4 +41,8 @@ void __init ide_arm_init(void) ...@@ -41,4 +41,8 @@ void __init ide_arm_init(void)
ide_device_add(idx); ide_device_add(idx);
} }
return 0;
} }
module_init(ide_arm_init);
EXTRA_CFLAGS += -Idrivers/ide EXTRA_CFLAGS += -Idrivers/ide
obj-y += ide-cris.o obj-$(CONFIG_IDE_ETRAX) += ide-cris.o
...@@ -754,8 +754,7 @@ static void cris_set_dma_mode(ide_drive_t *drive, const u8 speed) ...@@ -754,8 +754,7 @@ static void cris_set_dma_mode(ide_drive_t *drive, const u8 speed)
cris_ide_set_speed(TYPE_DMA, 0, strobe, hold); cris_ide_set_speed(TYPE_DMA, 0, strobe, hold);
} }
void __init static int __init init_e100_ide(void)
init_e100_ide (void)
{ {
hw_regs_t hw; hw_regs_t hw;
int ide_offsets[IDE_NR_PORTS], h, i; int ide_offsets[IDE_NR_PORTS], h, i;
...@@ -823,6 +822,8 @@ init_e100_ide (void) ...@@ -823,6 +822,8 @@ init_e100_ide (void)
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); ide_device_add(idx);
return 0;
} }
static cris_dma_descr_type mydescr __attribute__ ((__aligned__(16))); static cris_dma_descr_type mydescr __attribute__ ((__aligned__(16)));
...@@ -1056,3 +1057,5 @@ static void cris_dma_start(ide_drive_t *drive) ...@@ -1056,3 +1057,5 @@ static void cris_dma_start(ide_drive_t *drive)
LED_DISK_READ(1); LED_DISK_READ(1);
} }
} }
module_init(init_e100_ide);
obj-$(CONFIG_IDE_H8300) += ide-h8300.o
...@@ -84,7 +84,7 @@ static inline void hwif_setup(ide_hwif_t *hwif) ...@@ -84,7 +84,7 @@ static inline void hwif_setup(ide_hwif_t *hwif)
hwif->INSL = NULL; hwif->INSL = NULL;
} }
void __init h8300_ide_init(void) static int __init h8300_ide_init(void)
{ {
hw_regs_t hw; hw_regs_t hw;
ide_hwif_t *hwif; ide_hwif_t *hwif;
...@@ -104,7 +104,7 @@ void __init h8300_ide_init(void) ...@@ -104,7 +104,7 @@ void __init h8300_ide_init(void)
hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]); hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]);
if (hwif == NULL) { if (hwif == NULL) {
printk(KERN_ERR "ide-h8300: IDE I/F register failed\n"); printk(KERN_ERR "ide-h8300: IDE I/F register failed\n");
return; return -ENOENT;
} }
index = hwif->index; index = hwif->index;
...@@ -117,8 +117,12 @@ void __init h8300_ide_init(void) ...@@ -117,8 +117,12 @@ void __init h8300_ide_init(void)
ide_device_add(idx); ide_device_add(idx);
return; return 0;
out_busy: out_busy:
printk(KERN_ERR "ide-h8300: IDE I/F resource already used.\n"); printk(KERN_ERR "ide-h8300: IDE I/F resource already used.\n");
return -EBUSY;
} }
module_init(h8300_ide_init);
...@@ -75,12 +75,15 @@ static struct pnp_driver idepnp_driver = { ...@@ -75,12 +75,15 @@ static struct pnp_driver idepnp_driver = {
.remove = idepnp_remove, .remove = idepnp_remove,
}; };
void __init pnpide_init(void) static int __init pnpide_init(void)
{ {
pnp_register_driver(&idepnp_driver); return pnp_register_driver(&idepnp_driver);
} }
void __exit pnpide_exit(void) static void __exit pnpide_exit(void)
{ {
pnp_unregister_driver(&idepnp_driver); pnp_unregister_driver(&idepnp_driver);
} }
module_init(pnpide_init);
module_exit(pnpide_exit);
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/ide.h>
static int __init ide_scan_pci(void)
{
return ide_scan_pcibus();
}
module_init(ide_scan_pci);
...@@ -95,7 +95,7 @@ DEFINE_MUTEX(ide_cfg_mtx); ...@@ -95,7 +95,7 @@ DEFINE_MUTEX(ide_cfg_mtx);
__cacheline_aligned_in_smp DEFINE_SPINLOCK(ide_lock); __cacheline_aligned_in_smp DEFINE_SPINLOCK(ide_lock);
#ifdef CONFIG_IDEPCI_PCIBUS_ORDER #ifdef CONFIG_IDEPCI_PCIBUS_ORDER
static int ide_scan_direction; /* THIS was formerly 2.2.x pci=reverse */ int ide_scan_direction; /* THIS was formerly 2.2.x pci=reverse */
#endif #endif
int noautodma = 0; int noautodma = 0;
...@@ -178,8 +178,6 @@ static void init_hwif_default(ide_hwif_t *hwif, unsigned int index) ...@@ -178,8 +178,6 @@ static void init_hwif_default(ide_hwif_t *hwif, unsigned int index)
#endif #endif
} }
extern void ide_arm_init(void);
/* /*
* init_ide_data() sets reasonable default values into all fields * init_ide_data() sets reasonable default values into all fields
* of all instances of the hwifs and drives, but only on the first call. * of all instances of the hwifs and drives, but only on the first call.
...@@ -1223,26 +1221,12 @@ static int __init match_parm (char *s, const char *keywords[], int vals[], int m ...@@ -1223,26 +1221,12 @@ static int __init match_parm (char *s, const char *keywords[], int vals[], int m
return 0; /* zero = nothing matched */ return 0; /* zero = nothing matched */
} }
#ifdef CONFIG_BLK_DEV_ALI14XX
extern int probe_ali14xx; extern int probe_ali14xx;
extern int ali14xx_init(void);
#endif
#ifdef CONFIG_BLK_DEV_UMC8672
extern int probe_umc8672; extern int probe_umc8672;
extern int umc8672_init(void);
#endif
#ifdef CONFIG_BLK_DEV_DTC2278
extern int probe_dtc2278; extern int probe_dtc2278;
extern int dtc2278_init(void);
#endif
#ifdef CONFIG_BLK_DEV_HT6560B
extern int probe_ht6560b; extern int probe_ht6560b;
extern int ht6560b_init(void);
#endif
#ifdef CONFIG_BLK_DEV_QD65XX
extern int probe_qd65xx; extern int probe_qd65xx;
extern int qd65xx_init(void); extern int cmd640_vlb;
#endif
static int __initdata is_chipset_set[MAX_HWIFS]; static int __initdata is_chipset_set[MAX_HWIFS];
...@@ -1458,11 +1442,8 @@ static int __init ide_setup(char *s) ...@@ -1458,11 +1442,8 @@ static int __init ide_setup(char *s)
#endif #endif
#ifdef CONFIG_BLK_DEV_CMD640 #ifdef CONFIG_BLK_DEV_CMD640
case -14: /* "cmd640_vlb" */ case -14: /* "cmd640_vlb" */
{
extern int cmd640_vlb; /* flag for cmd640.c */
cmd640_vlb = 1; cmd640_vlb = 1;
goto done; goto done;
}
#endif #endif
#ifdef CONFIG_BLK_DEV_HT6560B #ifdef CONFIG_BLK_DEV_HT6560B
case -13: /* "ht6560b" */ case -13: /* "ht6560b" */
...@@ -1552,83 +1533,6 @@ done: ...@@ -1552,83 +1533,6 @@ done:
return 1; return 1;
} }
extern void __init pnpide_init(void);
extern void __exit pnpide_exit(void);
extern void __init h8300_ide_init(void);
extern void __init mpc8xx_ide_probe(void);
/*
* probe_for_hwifs() finds/initializes "known" IDE interfaces
*/
static void __init probe_for_hwifs (void)
{
#ifdef CONFIG_IDEPCI_PCIBUS_ORDER
ide_scan_pcibus(ide_scan_direction);
#endif
#ifdef CONFIG_ETRAX_IDE
{
extern void init_e100_ide(void);
init_e100_ide();
}
#endif /* CONFIG_ETRAX_IDE */
#ifdef CONFIG_BLK_DEV_CMD640
{
extern void ide_probe_for_cmd640x(void);
ide_probe_for_cmd640x();
}
#endif /* CONFIG_BLK_DEV_CMD640 */
#ifdef CONFIG_BLK_DEV_IDE_PMAC
{
extern int pmac_ide_probe(void);
(void)pmac_ide_probe();
}
#endif /* CONFIG_BLK_DEV_IDE_PMAC */
#ifdef CONFIG_BLK_DEV_GAYLE
{
extern void gayle_init(void);
gayle_init();
}
#endif /* CONFIG_BLK_DEV_GAYLE */
#ifdef CONFIG_BLK_DEV_FALCON_IDE
{
extern void falconide_init(void);
falconide_init();
}
#endif /* CONFIG_BLK_DEV_FALCON_IDE */
#ifdef CONFIG_BLK_DEV_MAC_IDE
{
extern void macide_init(void);
macide_init();
}
#endif /* CONFIG_BLK_DEV_MAC_IDE */
#ifdef CONFIG_BLK_DEV_Q40IDE
{
extern void q40ide_init(void);
q40ide_init();
}
#endif /* CONFIG_BLK_DEV_Q40IDE */
#ifdef CONFIG_BLK_DEV_BUDDHA
{
extern void buddha_init(void);
buddha_init();
}
#endif /* CONFIG_BLK_DEV_BUDDHA */
#ifdef CONFIG_BLK_DEV_IDEPNP
pnpide_init();
#endif
#ifdef CONFIG_H8300
h8300_ide_init();
#endif
#ifdef BLK_DEV_MPC8xx_IDE
mpc8xx_ide_probe();
#endif
}
/*
* Probe module
*/
EXPORT_SYMBOL(ide_lock); EXPORT_SYMBOL(ide_lock);
static int ide_bus_match(struct device *dev, struct device_driver *drv) static int ide_bus_match(struct device *dev, struct device_driver *drv)
...@@ -1775,33 +1679,6 @@ static int __init ide_init(void) ...@@ -1775,33 +1679,6 @@ static int __init ide_init(void)
proc_ide_create(); proc_ide_create();
#ifdef CONFIG_IDE_ARM
ide_arm_init();
#endif
#ifdef CONFIG_BLK_DEV_ALI14XX
if (probe_ali14xx)
(void)ali14xx_init();
#endif
#ifdef CONFIG_BLK_DEV_UMC8672
if (probe_umc8672)
(void)umc8672_init();
#endif
#ifdef CONFIG_BLK_DEV_DTC2278
if (probe_dtc2278)
(void)dtc2278_init();
#endif
#ifdef CONFIG_BLK_DEV_HT6560B
if (probe_ht6560b)
(void)ht6560b_init();
#endif
#ifdef CONFIG_BLK_DEV_QD65XX
if (probe_qd65xx)
(void)qd65xx_init();
#endif
/* Probe for special PCI and other "known" interface chipsets. */
probe_for_hwifs();
return 0; return 0;
} }
...@@ -1837,10 +1714,6 @@ void __exit cleanup_module (void) ...@@ -1837,10 +1714,6 @@ void __exit cleanup_module (void)
for (index = 0; index < MAX_HWIFS; ++index) for (index = 0; index < MAX_HWIFS; ++index)
ide_unregister(index); ide_unregister(index);
#ifdef CONFIG_BLK_DEV_IDEPNP
pnpide_exit();
#endif
proc_ide_destroy(); proc_ide_destroy();
bus_unregister(&ide_bus_type); bus_unregister(&ide_bus_type);
......
# link order is important here
obj-$(CONFIG_BLK_DEV_ALI14XX) += ali14xx.o obj-$(CONFIG_BLK_DEV_ALI14XX) += ali14xx.o
obj-$(CONFIG_BLK_DEV_UMC8672) += umc8672.o
obj-$(CONFIG_BLK_DEV_DTC2278) += dtc2278.o obj-$(CONFIG_BLK_DEV_DTC2278) += dtc2278.o
obj-$(CONFIG_BLK_DEV_HT6560B) += ht6560b.o obj-$(CONFIG_BLK_DEV_HT6560B) += ht6560b.o
obj-$(CONFIG_BLK_DEV_QD65XX) += qd65xx.o obj-$(CONFIG_BLK_DEV_QD65XX) += qd65xx.o
obj-$(CONFIG_BLK_DEV_UMC8672) += umc8672.o
obj-$(CONFIG_BLK_DEV_IDECS) += ide-cs.o obj-$(CONFIG_BLK_DEV_GAYLE) += gayle.o
obj-$(CONFIG_BLK_DEV_FALCON_IDE) += falconide.o
obj-$(CONFIG_BLK_DEV_MAC_IDE) += macide.o
obj-$(CONFIG_BLK_DEV_Q40IDE) += q40ide.o
obj-$(CONFIG_BLK_DEV_BUDDHA) += buddha.o
obj-$(CONFIG_BLK_DEV_PLATFORM) += ide_platform.o ifeq ($(CONFIG_BLK_DEV_IDECS), m)
obj-m += ide-cs.o
endif
# Last of all ifeq ($(CONFIG_BLK_DEV_PLATFORM), m)
obj-$(CONFIG_BLK_DEV_HD) += hd.o obj-m += ide_platform.o
endif
EXTRA_CFLAGS := -Idrivers/ide EXTRA_CFLAGS := -Idrivers/ide
...@@ -231,8 +231,7 @@ int probe_ali14xx = 0; ...@@ -231,8 +231,7 @@ int probe_ali14xx = 0;
module_param_named(probe, probe_ali14xx, bool, 0); module_param_named(probe, probe_ali14xx, bool, 0);
MODULE_PARM_DESC(probe, "probe for ALI M14xx chipsets"); MODULE_PARM_DESC(probe, "probe for ALI M14xx chipsets");
/* Can be called directly from ide.c. */ static int __init ali14xx_init(void)
int __init ali14xx_init(void)
{ {
if (probe_ali14xx == 0) if (probe_ali14xx == 0)
goto out; goto out;
...@@ -248,9 +247,7 @@ out: ...@@ -248,9 +247,7 @@ out:
return -ENODEV; return -ENODEV;
} }
#ifdef MODULE
module_init(ali14xx_init); module_init(ali14xx_init);
#endif
MODULE_AUTHOR("see local file"); MODULE_AUTHOR("see local file");
MODULE_DESCRIPTION("support of ALI 14XX IDE chipsets"); MODULE_DESCRIPTION("support of ALI 14XX IDE chipsets");
......
...@@ -143,7 +143,7 @@ static int xsurf_ack_intr(ide_hwif_t *hwif) ...@@ -143,7 +143,7 @@ static int xsurf_ack_intr(ide_hwif_t *hwif)
* Probe for a Buddha or Catweasel IDE interface * Probe for a Buddha or Catweasel IDE interface
*/ */
void __init buddha_init(void) static int __init buddha_init(void)
{ {
hw_regs_t hw; hw_regs_t hw;
ide_hwif_t *hwif; ide_hwif_t *hwif;
...@@ -243,4 +243,8 @@ fail_base2: ...@@ -243,4 +243,8 @@ fail_base2:
ide_device_add(idx); ide_device_add(idx);
} }
return 0;
} }
module_init(buddha_init);
...@@ -150,8 +150,7 @@ int probe_dtc2278 = 0; ...@@ -150,8 +150,7 @@ int probe_dtc2278 = 0;
module_param_named(probe, probe_dtc2278, bool, 0); module_param_named(probe, probe_dtc2278, bool, 0);
MODULE_PARM_DESC(probe, "probe for DTC2278xx chipsets"); MODULE_PARM_DESC(probe, "probe for DTC2278xx chipsets");
/* Can be called directly from ide.c. */ static int __init dtc2278_init(void)
int __init dtc2278_init(void)
{ {
if (probe_dtc2278 == 0) if (probe_dtc2278 == 0)
return -ENODEV; return -ENODEV;
...@@ -163,9 +162,7 @@ int __init dtc2278_init(void) ...@@ -163,9 +162,7 @@ int __init dtc2278_init(void)
return 0; return 0;
} }
#ifdef MODULE
module_init(dtc2278_init); module_init(dtc2278_init);
#endif
MODULE_AUTHOR("See Local File"); MODULE_AUTHOR("See Local File");
MODULE_DESCRIPTION("support of DTC-2278 VLB IDE chipsets"); MODULE_DESCRIPTION("support of DTC-2278 VLB IDE chipsets");
......
...@@ -62,7 +62,7 @@ EXPORT_SYMBOL(falconide_intr_lock); ...@@ -62,7 +62,7 @@ EXPORT_SYMBOL(falconide_intr_lock);
* Probe for a Falcon IDE interface * Probe for a Falcon IDE interface
*/ */
void __init falconide_init(void) static int __init falconide_init(void)
{ {
if (MACH_IS_ATARI && ATARIHW_PRESENT(IDE)) { if (MACH_IS_ATARI && ATARIHW_PRESENT(IDE)) {
hw_regs_t hw; hw_regs_t hw;
...@@ -84,4 +84,9 @@ void __init falconide_init(void) ...@@ -84,4 +84,9 @@ void __init falconide_init(void)
ide_device_add(idx); ide_device_add(idx);
} }
}
return 0;
} }
module_init(falconide_init);
...@@ -110,13 +110,13 @@ static int gayle_ack_intr_a1200(ide_hwif_t *hwif) ...@@ -110,13 +110,13 @@ static int gayle_ack_intr_a1200(ide_hwif_t *hwif)
* Probe for a Gayle IDE interface (and optionally for an IDE doubler) * Probe for a Gayle IDE interface (and optionally for an IDE doubler)
*/ */
void __init gayle_init(void) static int __init gayle_init(void)
{ {
int a4000, i; int a4000, i;
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
if (!MACH_IS_AMIGA) if (!MACH_IS_AMIGA)
return; return -ENODEV;
if ((a4000 = AMIGAHW_PRESENT(A4000_IDE)) || AMIGAHW_PRESENT(A1200_IDE)) if ((a4000 = AMIGAHW_PRESENT(A4000_IDE)) || AMIGAHW_PRESENT(A1200_IDE))
goto found; goto found;
...@@ -126,7 +126,7 @@ void __init gayle_init(void) ...@@ -126,7 +126,7 @@ void __init gayle_init(void)
NULL)) NULL))
goto found; goto found;
#endif #endif
return; return -ENODEV;
found: found:
for (i = 0; i < GAYLE_NUM_PROBE_HWIFS; i++) { for (i = 0; i < GAYLE_NUM_PROBE_HWIFS; i++) {
...@@ -191,4 +191,8 @@ found: ...@@ -191,4 +191,8 @@ found:
} }
ide_device_add(idx); ide_device_add(idx);
return 0;
} }
module_init(gayle_init);
...@@ -307,8 +307,7 @@ int probe_ht6560b = 0; ...@@ -307,8 +307,7 @@ int probe_ht6560b = 0;
module_param_named(probe, probe_ht6560b, bool, 0); module_param_named(probe, probe_ht6560b, bool, 0);
MODULE_PARM_DESC(probe, "probe for HT6560B chipset"); MODULE_PARM_DESC(probe, "probe for HT6560B chipset");
/* Can be called directly from ide.c. */ static int __init ht6560b_init(void)
int __init ht6560b_init(void)
{ {
ide_hwif_t *hwif, *mate; ide_hwif_t *hwif, *mate;
static u8 idx[4] = { 0, 1, 0xff, 0xff }; static u8 idx[4] = { 0, 1, 0xff, 0xff };
...@@ -369,9 +368,7 @@ release_region: ...@@ -369,9 +368,7 @@ release_region:
return -ENODEV; return -ENODEV;
} }
#ifdef MODULE
module_init(ht6560b_init); module_init(ht6560b_init);
#endif
MODULE_AUTHOR("See Local File"); MODULE_AUTHOR("See Local File");
MODULE_DESCRIPTION("HT-6560B EIDE-controller support"); MODULE_DESCRIPTION("HT-6560B EIDE-controller support");
......
...@@ -81,7 +81,7 @@ int macide_ack_intr(ide_hwif_t* hwif) ...@@ -81,7 +81,7 @@ int macide_ack_intr(ide_hwif_t* hwif)
* Probe for a Macintosh IDE interface * Probe for a Macintosh IDE interface
*/ */
void __init macide_init(void) static int __init macide_init(void)
{ {
hw_regs_t hw; hw_regs_t hw;
ide_hwif_t *hwif; ide_hwif_t *hwif;
...@@ -106,7 +106,7 @@ void __init macide_init(void) ...@@ -106,7 +106,7 @@ void __init macide_init(void)
IRQ_BABOON_1); IRQ_BABOON_1);
break; break;
default: default:
return; return -ENODEV;
} }
hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]); hwif = ide_find_port(hw.io_ports[IDE_DATA_OFFSET]);
...@@ -139,4 +139,8 @@ void __init macide_init(void) ...@@ -139,4 +139,8 @@ void __init macide_init(void)
ide_device_add(idx); ide_device_add(idx);
} }
return 0;
} }
module_init(macide_init);
...@@ -111,7 +111,7 @@ static const char *q40_ide_names[Q40IDE_NUM_HWIFS]={ ...@@ -111,7 +111,7 @@ static const char *q40_ide_names[Q40IDE_NUM_HWIFS]={
* Probe for Q40 IDE interfaces * Probe for Q40 IDE interfaces
*/ */
void __init q40ide_init(void) static int __init q40ide_init(void)
{ {
int i; int i;
ide_hwif_t *hwif; ide_hwif_t *hwif;
...@@ -119,7 +119,7 @@ void __init q40ide_init(void) ...@@ -119,7 +119,7 @@ void __init q40ide_init(void)
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
if (!MACH_IS_Q40) if (!MACH_IS_Q40)
return ; return -ENODEV;
for (i = 0; i < Q40IDE_NUM_HWIFS; i++) { for (i = 0; i < Q40IDE_NUM_HWIFS; i++) {
hw_regs_t hw; hw_regs_t hw;
...@@ -153,5 +153,8 @@ void __init q40ide_init(void) ...@@ -153,5 +153,8 @@ void __init q40ide_init(void)
} }
ide_device_add(idx); ide_device_add(idx);
return 0;
} }
module_init(q40ide_init);
...@@ -478,8 +478,7 @@ int probe_qd65xx = 0; ...@@ -478,8 +478,7 @@ int probe_qd65xx = 0;
module_param_named(probe, probe_qd65xx, bool, 0); module_param_named(probe, probe_qd65xx, bool, 0);
MODULE_PARM_DESC(probe, "probe for QD65xx chipsets"); MODULE_PARM_DESC(probe, "probe for QD65xx chipsets");
/* Can be called directly from ide.c. */ static int __init qd65xx_init(void)
int __init qd65xx_init(void)
{ {
if (probe_qd65xx == 0) if (probe_qd65xx == 0)
return -ENODEV; return -ENODEV;
...@@ -492,9 +491,7 @@ int __init qd65xx_init(void) ...@@ -492,9 +491,7 @@ int __init qd65xx_init(void)
return 0; return 0;
} }
#ifdef MODULE
module_init(qd65xx_init); module_init(qd65xx_init);
#endif
MODULE_AUTHOR("Samuel Thibault"); MODULE_AUTHOR("Samuel Thibault");
MODULE_DESCRIPTION("support of qd65xx vlb ide chipset"); MODULE_DESCRIPTION("support of qd65xx vlb ide chipset");
......
...@@ -169,8 +169,7 @@ int probe_umc8672 = 0; ...@@ -169,8 +169,7 @@ int probe_umc8672 = 0;
module_param_named(probe, probe_umc8672, bool, 0); module_param_named(probe, probe_umc8672, bool, 0);
MODULE_PARM_DESC(probe, "probe for UMC8672 chipset"); MODULE_PARM_DESC(probe, "probe for UMC8672 chipset");
/* Can be called directly from ide.c. */ static int __init umc8672_init(void)
int __init umc8672_init(void)
{ {
if (probe_umc8672 == 0) if (probe_umc8672 == 0)
goto out; goto out;
...@@ -181,9 +180,7 @@ out: ...@@ -181,9 +180,7 @@ out:
return -ENODEV;; return -ENODEV;;
} }
#ifdef MODULE
module_init(umc8672_init); module_init(umc8672_init);
#endif
MODULE_AUTHOR("Wolfram Podien"); MODULE_AUTHOR("Wolfram Podien");
MODULE_DESCRIPTION("Support for UMC 8672 IDE chipset"); MODULE_DESCRIPTION("Support for UMC 8672 IDE chipset");
......
...@@ -36,4 +36,8 @@ obj-$(CONFIG_BLK_DEV_VIA82CXXX) += via82cxxx.o ...@@ -36,4 +36,8 @@ obj-$(CONFIG_BLK_DEV_VIA82CXXX) += via82cxxx.o
# Must appear at the end of the block # Must appear at the end of the block
obj-$(CONFIG_BLK_DEV_GENERIC) += generic.o obj-$(CONFIG_BLK_DEV_GENERIC) += generic.o
ifeq ($(CONFIG_BLK_DEV_CMD640), m)
obj-m += cmd640.o
endif
EXTRA_CFLAGS := -Idrivers/ide EXTRA_CFLAGS := -Idrivers/ide
...@@ -706,9 +706,9 @@ static int pci_conf2(void) ...@@ -706,9 +706,9 @@ static int pci_conf2(void)
} }
/* /*
* Probe for a cmd640 chipset, and initialize it if found. Called from ide.c * Probe for a cmd640 chipset, and initialize it if found.
*/ */
int __init ide_probe_for_cmd640x (void) static int __init cmd640x_init(void)
{ {
#ifdef CONFIG_BLK_DEV_CMD640_ENHANCED #ifdef CONFIG_BLK_DEV_CMD640_ENHANCED
int second_port_toggled = 0; int second_port_toggled = 0;
...@@ -883,3 +883,7 @@ int __init ide_probe_for_cmd640x (void) ...@@ -883,3 +883,7 @@ int __init ide_probe_for_cmd640x (void)
return 1; return 1;
} }
module_param_named(probe_vlb, cmd640_vlb, bool, 0);
MODULE_PARM_DESC(probe_vlb, "probe for VLB version of CMD640 chipset");
module_init(cmd640x_init);
obj-$(CONFIG_BLK_DEV_IDE_PMAC) += pmac.o
obj-$(CONFIG_BLK_DEV_MPC8xx_IDE) += mpc8xx.o
...@@ -839,7 +839,7 @@ void m8xx_ide_init(void) ...@@ -839,7 +839,7 @@ void m8xx_ide_init(void)
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) static int __init mpc8xx_ide_probe(void)
{ {
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
...@@ -851,4 +851,8 @@ void __init mpc8xx_ide_probe(void) ...@@ -851,4 +851,8 @@ void __init mpc8xx_ide_probe(void)
#endif #endif
ide_device_add(idx); ide_device_add(idx);
return 0;
} }
module_init(mpc8xx_ide_probe);
...@@ -1786,3 +1786,5 @@ pmac_ide_setup_dma(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif) ...@@ -1786,3 +1786,5 @@ pmac_ide_setup_dma(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif)
} }
#endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */ #endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */
module_init(pmac_ide_probe);
...@@ -766,21 +766,20 @@ static int __init ide_scan_pcidev(struct pci_dev *dev) ...@@ -766,21 +766,20 @@ static int __init ide_scan_pcidev(struct pci_dev *dev)
/** /**
* ide_scan_pcibus - perform the initial IDE driver scan * ide_scan_pcibus - perform the initial IDE driver scan
* @scan_direction: set for reverse order scanning
* *
* Perform the initial bus rather than driver ordered scan of the * Perform the initial bus rather than driver ordered scan of the
* PCI drivers. After this all IDE pci handling becomes standard * PCI drivers. After this all IDE pci handling becomes standard
* module ordering not traditionally ordered. * module ordering not traditionally ordered.
*/ */
void __init ide_scan_pcibus (int scan_direction) int __init ide_scan_pcibus(void)
{ {
struct pci_dev *dev = NULL; struct pci_dev *dev = NULL;
struct pci_driver *d; struct pci_driver *d;
struct list_head *l, *n; struct list_head *l, *n;
pre_init = 0; pre_init = 0;
if (!scan_direction) if (!ide_scan_direction)
while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev))) while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)))
ide_scan_pcidev(dev); ide_scan_pcidev(dev);
else else
...@@ -801,5 +800,7 @@ void __init ide_scan_pcibus (int scan_direction) ...@@ -801,5 +800,7 @@ void __init ide_scan_pcibus (int scan_direction)
printk(KERN_ERR "%s: failed to register %s driver\n", printk(KERN_ERR "%s: failed to register %s driver\n",
__FUNCTION__, d->driver.mod_name); __FUNCTION__, d->driver.mod_name);
} }
return 0;
} }
#endif #endif
...@@ -1014,7 +1014,8 @@ extern void do_ide_request(struct request_queue *); ...@@ -1014,7 +1014,8 @@ extern void do_ide_request(struct request_queue *);
void ide_init_disk(struct gendisk *, ide_drive_t *); void ide_init_disk(struct gendisk *, ide_drive_t *);
#ifdef CONFIG_IDEPCI_PCIBUS_ORDER #ifdef CONFIG_IDEPCI_PCIBUS_ORDER
extern void ide_scan_pcibus(int scan_direction) __init; extern int ide_scan_direction;
int __init ide_scan_pcibus(void);
extern int __ide_pci_register_driver(struct pci_driver *driver, struct module *owner, const char *mod_name); extern int __ide_pci_register_driver(struct pci_driver *driver, struct module *owner, const char *mod_name);
#define ide_pci_register_driver(d) __ide_pci_register_driver(d, THIS_MODULE, KBUILD_MODNAME) #define ide_pci_register_driver(d) __ide_pci_register_driver(d, THIS_MODULE, KBUILD_MODNAME)
#else #else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment