[U-Boot] [PATCH 2/2 v2] 8xx, kup4: add FDT support

Signed-off-by: Heiko Schocher hs@denx.de
--- - changes since v1 - rebased against current mainline - fix printf output
board/kup/kup4k/kup4k.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++ include/configs/KUP4K.h | 4 +++ 2 files changed, 62 insertions(+), 0 deletions(-)
diff --git a/board/kup/kup4k/kup4k.c b/board/kup/kup4k/kup4k.c index 7eb36ab..637fe3d 100644 --- a/board/kup/kup4k/kup4k.c +++ b/board/kup/kup4k/kup4k.c @@ -24,6 +24,7 @@
#include <common.h> #include <command.h> +#include <libfdt.h> #include <mpc8xx.h> #include <hwconfig.h> #include <i2c.h> @@ -291,3 +292,60 @@ static unsigned char swapbyte(unsigned char c) } return result; } + +/* + * Device Tree Support + */ +#if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT) +int fdt_set_node_and_value(void *blob, + char *nodename, + char *regname, + void *var, + int size) +{ + int ret = 0; + int nodeoffset = 0; + + nodeoffset = fdt_path_offset(blob, nodename); + if (nodeoffset >= 0) { + ret = fdt_setprop(blob, nodeoffset, regname, var, + size); + if (ret < 0) { + printf("%s: cannot set %s/%s property; err: %s\n", + __func__, nodename, regname, fdt_strerror(ret)); + } + } else { + printf("%s: cannot find %s node err:%s\n", __func__, + nodename, fdt_strerror(nodeoffset)); + } + return ret; +} + +/* + * update "brg" property in the blob + */ +void ft_blob_update(void *blob, bd_t *bd) +{ + uchar enetaddr[6]; + ulong brg_data = 0; + + /* BRG */ + brg_data = cpu_to_be32(bd->bi_busfreq); + fdt_set_node_and_value(blob, + "/soc/cpm", "brg-frequency", + &brg_data, sizeof(brg_data)); + + /* MAC addr */ + if (eth_getenv_enetaddr("ethaddr", enetaddr)) { + fdt_set_node_and_value(blob, + "ethernet0", "local-mac-address", + enetaddr, sizeof(u8) * 6); + } +} + +void ft_board_setup(void *blob, bd_t *bd) +{ + ft_cpu_setup(blob, bd); + ft_blob_update(blob, bd); +} +#endif /* defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT) */ diff --git a/include/configs/KUP4K.h b/include/configs/KUP4K.h index ab708ae..14d412d 100644 --- a/include/configs/KUP4K.h +++ b/include/configs/KUP4K.h @@ -510,5 +510,9 @@ #define CONFIG_SYS_DEVICE_NULLDEV 1 /* enble null device */ #define CONFIG_VERSION_VARIABLE 1
+/* pass open firmware flat tree */ +#define CONFIG_OF_LIBFDT 1 +#define CONFIG_OF_BOARD_SETUP 1 + #endif /* __CONFIG_H */

On Mon, 19 Jul 2010 14:13:53 +0200 Heiko Schocher hs@denx.de wrote:
+int fdt_set_node_and_value(void *blob,
char *nodename,
char *regname,
void *var,
int size)
+{
- int ret = 0;
- int nodeoffset = 0;
- nodeoffset = fdt_path_offset(blob, nodename);
- if (nodeoffset >= 0) {
ret = fdt_setprop(blob, nodeoffset, regname, var,
size);
if (ret < 0) {
printf("%s: cannot set %s/%s property; err: %s\n",
__func__, nodename, regname, fdt_strerror(ret));
}
- } else {
printf("%s: cannot find %s node err:%s\n", __func__,
nodename, fdt_strerror(nodeoffset));
- }
- return ret;
+}
How is this different from do_fixup_by_path()?
+/*
- update "brg" property in the blob
- */
+void ft_blob_update(void *blob, bd_t *bd) +{
- uchar enetaddr[6];
- ulong brg_data = 0;
- /* BRG */
- brg_data = cpu_to_be32(bd->bi_busfreq);
- fdt_set_node_and_value(blob,
"/soc/cpm", "brg-frequency",
&brg_data, sizeof(brg_data));
This binding is deprecated -- the device tree should have a brg node, in which ft_cpu_setup() will fill in clock-frequency.
See Documentation/powerpc/dts-bindings/fsl/cpm_qe/cpm.txt in Linux.
You can keep brg-frequency around in addition if you need to support kernels from the short period of time that was old enough to not know about the brg node, but new enough to support device trees at all. Maybe put it in ft_cpu_setup(), replacing the existing fixup a couple of other 8xx boards do (but not all of them).
- /* MAC addr */
- if (eth_getenv_enetaddr("ethaddr", enetaddr)) {
fdt_set_node_and_value(blob,
"ethernet0", "local-mac-address",
enetaddr, sizeof(u8) * 6);
- }
ft_cpu_setup() calls fdt_fixup_ethernet() which should handle this.
-Scott
participants (2)
-
Heiko Schocher
-
Scott Wood