aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-mips/mach-generic
diff options
context:
space:
mode:
authorAtsushi Nemoto <anemo@mba.ocn.ne.jp>2007-09-04 23:02:02 +0900
committerRalf Baechle <ralf@linux-mips.org>2007-09-14 19:08:43 +0100
commit6440fcfc62767028a2bbdf742549d24f6a023004 (patch)
tree419a228bd7af0017754ac5f3cd94a21180903971 /include/asm-mips/mach-generic
parentb1043cc7d9d7a7dec8d807570c067e0c90b94b57 (diff)
downloadkernel_samsung_aries-6440fcfc62767028a2bbdf742549d24f6a023004.zip
kernel_samsung_aries-6440fcfc62767028a2bbdf742549d24f6a023004.tar.gz
kernel_samsung_aries-6440fcfc62767028a2bbdf742549d24f6a023004.tar.bz2
[MIPS] No ide_default_io_base() if PCI IDE was not found
Revert b5438582090406e2ccb4169d9b2df7c9939ae42b and add no_pci_devices() check to avoid crash due to early calling of pci_get_class(). Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'include/asm-mips/mach-generic')
-rw-r--r--include/asm-mips/mach-generic/ide.h31
1 files changed, 31 insertions, 0 deletions
diff --git a/include/asm-mips/mach-generic/ide.h b/include/asm-mips/mach-generic/ide.h
index 2b92857..a771283 100644
--- a/include/asm-mips/mach-generic/ide.h
+++ b/include/asm-mips/mach-generic/ide.h
@@ -29,6 +29,35 @@
#define IDE_ARCH_OBSOLETE_DEFAULTS
+static __inline__ int ide_probe_legacy(void)
+{
+#ifdef CONFIG_PCI
+ struct pci_dev *dev;
+ /*
+ * This can be called on the ide_setup() path, super-early in
+ * boot. But the down_read() will enable local interrupts,
+ * which can cause some machines to crash. So here we detect
+ * and flag that situation and bail out early.
+ */
+ if (no_pci_devices())
+ return 0;
+ dev = pci_get_class(PCI_CLASS_BRIDGE_EISA << 8, NULL);
+ if (dev)
+ goto found;
+ dev = pci_get_class(PCI_CLASS_BRIDGE_ISA << 8, NULL);
+ if (dev)
+ goto found;
+ return 0;
+found:
+ pci_dev_put(dev);
+ return 1;
+#elif defined(CONFIG_EISA) || defined(CONFIG_ISA)
+ return 1;
+#else
+ return 0;
+#endif
+}
+
static __inline__ int ide_default_irq(unsigned long base)
{
switch (base) {
@@ -45,6 +74,8 @@ static __inline__ int ide_default_irq(unsigned long base)
static __inline__ unsigned long ide_default_io_base(int index)
{
+ if (!ide_probe_legacy())
+ return 0;
/*
* If PCI is present then it is not safe to poke around
* the other legacy IDE ports. Only 0x1f0 and 0x170 are