]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
fdt: Pass the device serial number through devicetree
authorPaul Kocialkowski <contact@paulk.fr>
Thu, 21 May 2015 09:27:03 +0000 (11:27 +0200)
committerLothar Waßmann <LW@KARO-electronics.de>
Tue, 8 Sep 2015 22:40:41 +0000 (00:40 +0200)
Before device-tree, the device serial number used to be passed to the kernel
using ATAGs (on ARM). This is now deprecated and all the handover to the kernel
should now be done using device-tree. Thus, this passes the serial-number
property to the kernel using the serial-number property of the root node, as
expected by the kernel.

The serial number is a string that somewhat represents the device's serial
number. It might come from some form of storage (e.g. an eeprom) and be
programmed at factory-time by the manufacturer or come from identification
bits available in e.g. the SoC.

Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
Reviewed-by: Simon Glass <sgj@chromium.org>
common/fdt_support.c
common/image-fdt.c
doc/device-tree-bindings/root.txt [new file with mode: 0644]
include/fdt_support.h

index 612ee914c6b726ac4ce86d069aebb2fb86b43948..492b96ccaca023f9862638409bfee10961b2fe24 100644 (file)
@@ -194,6 +194,31 @@ static inline int fdt_setprop_uxx(void *fdt, int nodeoffset, const char *name,
                return fdt_setprop_u32(fdt, nodeoffset, name, (uint32_t)val);
 }
 
+int fdt_root(void *fdt)
+{
+       char *serial;
+       int err;
+
+       err = fdt_check_header(fdt);
+       if (err < 0) {
+               printf("fdt_root: %s\n", fdt_strerror(err));
+               return err;
+       }
+
+       serial = getenv("serial#");
+       if (serial) {
+               err = fdt_setprop(fdt, 0, "serial-number", serial,
+                                 strlen(serial) + 1);
+
+               if (err < 0) {
+                       printf("WARNING: could not set serial-number %s.\n",
+                              fdt_strerror(err));
+                       return err;
+               }
+       }
+
+       return 0;
+}
 
 int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end)
 {
index 7e2da7b3b7218d10c40167e1d80c0d678ff47c1a..80e3e63805cdca31ec0c780c45ab79c3ec601dc1 100644 (file)
@@ -471,6 +471,10 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
        int ret = -EPERM;
        int fdt_ret;
 
+       if (fdt_root(blob) < 0) {
+               printf("ERROR: root node setup failed\n");
+               goto err;
+       }
        if (fdt_chosen(blob) < 0) {
                printf("ERROR: /chosen node create failed\n");
                goto err;
diff --git a/doc/device-tree-bindings/root.txt b/doc/device-tree-bindings/root.txt
new file mode 100644 (file)
index 0000000..001ccf3
--- /dev/null
@@ -0,0 +1,4 @@
+The root node
+
+Optional properties:
+  - serial-number : a string representing the device's serial number
index cb31847325f844947e2d4991c80633cae9e7c4c3..4468aa45f65e6f6259bd8830069e5706654e03fc 100644 (file)
@@ -16,6 +16,7 @@ uint32_t fdt_getprop_u32_default_node(const void *fdt, int off, int cell,
                                const char *prop, const uint32_t dflt);
 uint32_t fdt_getprop_u32_default(const void *fdt, const char *path,
                                const char *prop, const uint32_t dflt);
+int fdt_root(void *fdt);
 int fdt_chosen(void *fdt);
 int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end);
 void do_fixup_by_path(void *fdt, const char *path, const char *prop,