mucmc52, uc101: delete ata@3a00 node, if no CF card is detected
authorHeiko Schocher <hs@denx.de>
Wed, 23 Sep 2009 05:56:08 +0000 (07:56 +0200)
committerWolfgang Denk <wd@denx.de>
Thu, 24 Sep 2009 23:22:13 +0000 (01:22 +0200)
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>
README
common/cmd_ide.c
cpu/mpc5xxx/cpu.c
include/configs/manroland/mpc5200-common.h
include/ide.h

diff --git a/README b/README
index ce86e74baf31ea70b02a7d51e46aa73125fad73a..dee0e674a18c007fa98393db9a7d3b0a70e8a42b 100644 (file)
--- 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
index 4d7a0ac9e46a465147e55355912d417401f40519..ec9a1df38e778483237fb2241d1d05d15c323017 100644 (file)
@@ -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
index f6258c7be60b9f00d4d546be36ed9c3f5e06174e..efa64c74815ca26e6c4d9b051f0acae41670397b 100644 (file)
 #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
 
index 2f092b180726e7da2692a24af759cc6932c733ec..b29ef9b65591798b9ed04ed840ca5ea1a29d6966 100644 (file)
 #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 */
index ddb9579f8fa07307b807ee1118dea11cf242b7ff..6a1b7ae844f34529e6dfa4d18ae7887c9f068ea6 100644 (file)
@@ -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 */