summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHeiko Schocher <hs@denx.de>2009-09-23 07:56:08 +0200
committerWolfgang Denk <wd@denx.de>2009-09-25 01:22:13 +0200
commit3887c3fbdbbe6bbb4df60ed415c8e1ab9fe56b5e (patch)
tree45036f888029797df3058eb7c99c1fa2f6b22632
parent7f625fc6d3ba8f890e843ac01717804c2462ed53 (diff)
downloadbootable_bootloader_goldelico_gta04-3887c3fbdbbe6bbb4df60ed415c8e1ab9fe56b5e.zip
bootable_bootloader_goldelico_gta04-3887c3fbdbbe6bbb4df60ed415c8e1ab9fe56b5e.tar.gz
bootable_bootloader_goldelico_gta04-3887c3fbdbbe6bbb4df60ed415c8e1ab9fe56b5e.tar.bz2
mucmc52, uc101: delete ata@3a00 node, if no CF card is detected
U-Boot can detect if an IDE device is present or not. If not, and this new config option is activated, U-Boot removes the ATA node from the DTS before booting Linux, so the Linux IDE driver does not probe the device and crash. This is needed for buggy hardware (uc101) where no pull down resistor is connected to the signal IDE5V_DD7. Signed-off-by: Heiko Schocher <hs@denx.de>
-rw-r--r--README9
-rw-r--r--common/cmd_ide.c8
-rw-r--r--cpu/mpc5xxx/cpu.c20
-rw-r--r--include/configs/manroland/mpc5200-common.h1
-rw-r--r--include/ide.h3
5 files changed, 41 insertions, 0 deletions
diff --git a/README b/README
index ce86e74..dee0e67 100644
--- a/README
+++ b/README
@@ -388,6 +388,15 @@ The following options need to be configured:
This define fills in the correct boot CPU in the boot
param header, the default value is zero if undefined.
+ CONFIG_OF_IDE_FIXUP
+
+ U-Boot can detect if an IDE device is present or not.
+ If not, and this new config option is activated, U-Boot
+ removes the ATA node from the DTS before booting Linux,
+ so the Linux IDE driver does not probe the device and
+ crash. This is needed for buggy hardware (uc101) where
+ no pull down resistor is connected to the signal IDE5V_DD7.
+
- vxWorks boot parameters:
bootvx constructs a valid bootline using the following
diff --git a/common/cmd_ide.c b/common/cmd_ide.c
index 4d7a0ac..ec9a1df 100644
--- a/common/cmd_ide.c
+++ b/common/cmd_ide.c
@@ -1624,6 +1624,14 @@ static void ide_led (uchar led, uchar status)
#endif /* CONFIG_IDE_LED */
+#if defined(CONFIG_OF_IDE_FIXUP)
+int ide_device_present(int dev)
+{
+ if (dev >= CONFIG_SYS_IDE_MAXBUS)
+ return 0;
+ return (ide_dev_desc[dev].type == DEV_TYPE_UNKNOWN ? 0 : 1);
+}
+#endif
/* ------------------------------------------------------------------------- */
#ifdef CONFIG_ATAPI
diff --git a/cpu/mpc5xxx/cpu.c b/cpu/mpc5xxx/cpu.c
index f6258c7..efa64c7 100644
--- a/cpu/mpc5xxx/cpu.c
+++ b/cpu/mpc5xxx/cpu.c
@@ -40,6 +40,10 @@
#include <fdt_support.h>
#endif
+#if defined(CONFIG_OF_IDE_FIXUP)
+#include <ide.h>
+#endif
+
DECLARE_GLOBAL_DATA_PTR;
int checkcpu (void)
@@ -137,6 +141,22 @@ void ft_cpu_setup(void *blob, bd_t *bd)
do_fixup_by_path(blob, eth_path, "mac-address", enetaddr, 6, 0);
do_fixup_by_path(blob, eth_path, "local-mac-address", enetaddr, 6, 0);
#endif
+#if defined(CONFIG_OF_IDE_FIXUP)
+ if (!ide_device_present(0)) {
+ /* NO CF card detected -> delete ata node in DTS */
+ int nodeoffset = 0;
+ char nodename[] = "/soc5200@f0000000/ata@3a00";
+
+ nodeoffset = fdt_path_offset(blob, nodename);
+ if (nodeoffset >= 0) {
+ fdt_del_node(blob, nodeoffset);
+ } else {
+ printf("%s: cannot find %s node err:%s\n",
+ __func__, nodename, fdt_strerror(nodeoffset));
+ }
+ }
+
+#endif
}
#endif
diff --git a/include/configs/manroland/mpc5200-common.h b/include/configs/manroland/mpc5200-common.h
index 2f092b1..b29ef9b 100644
--- a/include/configs/manroland/mpc5200-common.h
+++ b/include/configs/manroland/mpc5200-common.h
@@ -225,5 +225,6 @@
#define OF_SOC "soc5200@f0000000"
#define OF_TBCLK (bd->bi_busfreq / 4)
#define OF_STDOUT_PATH "/soc5200@f0000000/serial@2000"
+#define CONFIG_OF_IDE_FIXUP
#endif /* __MANROLAND_MPC52XX__COMMON_H */
diff --git a/include/ide.h b/include/ide.h
index ddb9579..6a1b7ae 100644
--- a/include/ide.h
+++ b/include/ide.h
@@ -54,4 +54,7 @@ void ide_init(void);
ulong ide_read(int device, lbaint_t blknr, ulong blkcnt, void *buffer);
ulong ide_write(int device, lbaint_t blknr, ulong blkcnt, void *buffer);
+#if defined(CONFIG_OF_IDE_FIXUP)
+int ide_device_present(int dev);
+#endif
#endif /* _IDE_H */