public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 2/2 v2] 8xx, kup4: add FDT support
@ 2010-07-19 12:13 Heiko Schocher
  2010-07-19 17:48 ` Scott Wood
  0 siblings, 1 reply; 2+ messages in thread
From: Heiko Schocher @ 2010-07-19 12:13 UTC (permalink / raw)
  To: u-boot

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 */

-- 
1.6.2.5

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

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [U-Boot] [PATCH 2/2 v2] 8xx, kup4: add FDT support
  2010-07-19 12:13 [U-Boot] [PATCH 2/2 v2] 8xx, kup4: add FDT support Heiko Schocher
@ 2010-07-19 17:48 ` Scott Wood
  0 siblings, 0 replies; 2+ messages in thread
From: Scott Wood @ 2010-07-19 17:48 UTC (permalink / raw)
  To: u-boot

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

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2010-07-19 17:48 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-07-19 12:13 [U-Boot] [PATCH 2/2 v2] 8xx, kup4: add FDT support Heiko Schocher
2010-07-19 17:48 ` Scott Wood

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox