Skip to contentSkip to conversation

8xx, kup4: add FDT support

PATCH Superseded Heiko Schocher 2 participants 2 messages Jul 19, 2010

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 2/2 8xx, kup4: add FDT support

---
- 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(-)
board/kup/kup4k/kup4k.c +58 -0
index 7eb36ab..637fe3d 100644
@@ -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) */
include/configs/KUP4K.h +4 -0
index ab708ae..14d412d 100644
@@ -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 */
 
Signature · 5 lines
1.6.2.5

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#1 lore raw

PATCH v2 2/2 8xx, kup4: add FDT support

Quoted 13 lines · On Mon, 19 Jul 2010 14:13:53 +0200 Heiko Schocher <[email protected]> wrote:
board/kup/kup4k/kup4k.c +13 -0
+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);

board/kup/kup4k/kup4k.c static unsigned char swapbyte(unsigned char c) · line 322

Quoted 10 lines
board/kup/kup4k/kup4k.c +10 -0
+		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()?

board/kup/kup4k/kup4k.c static unsigned char swapbyte(unsigned char c) · line 336

Quoted 13 lines
board/kup/kup4k/kup4k.c +13 -0
+/*
+ * 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).

board/kup/kup4k/kup4k.c static unsigned char swapbyte(unsigned char c) · line 343

Quoted 6 lines
board/kup/kup4k/kup4k.c +6 -0
+	/* 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