dtoverlay: find symbols, write properties
authorPhil Elwell <phil@raspberrypi.org>
Thu, 16 Feb 2017 17:58:08 +0000 (17:58 +0000)
committerpopcornmix <popcornmix@gmail.com>
Thu, 2 Mar 2017 00:25:33 +0000 (00:25 +0000)
Add functions to find nodes by alias or symbol, and write properties.

See: https://github.com/raspberrypi/firmware/issues/613

helpers/dtoverlay/dtoverlay.c
helpers/dtoverlay/dtoverlay.h

index 2e026867fcef180322dd1abc4855ccc9372d166b..2a3fca07fbd66c41edbc13ca9919609c975c5f1f 100644 (file)
@@ -1550,6 +1550,34 @@ int dtoverlay_find_phandle(DTBLOB_T *dtb, int phandle)
    return fdt_node_offset_by_phandle(dtb->fdt, phandle);
 }
 
+int dtoverlay_find_symbol(DTBLOB_T *dtb, const char *symbol_name)
+{
+   int symbols_off, path_len;
+   const char *node_path;
+
+   node_path = dtoverlay_get_alias(dtb, symbol_name);
+
+   if (node_path)
+   {
+      path_len = strlen(node_path);
+   }
+   else
+   {
+      symbols_off = fdt_path_offset(dtb->fdt, "/__symbols__");
+
+      if (symbols_off < 0)
+      {
+         dtoverlay_error("No symbols found");
+         return -FDT_ERR_NOTFOUND;
+      }
+
+      node_path = fdt_getprop(dtb->fdt, symbols_off, symbol_name, &path_len);
+      if (path_len < 0)
+         return -FDT_ERR_NOTFOUND;
+   }
+   return fdt_path_offset_namelen(dtb->fdt, node_path, path_len);
+}
+
 int dtoverlay_find_matching_node(DTBLOB_T *dtb, const char **node_names,
                                 int pos)
 {
@@ -1582,6 +1610,15 @@ const void *dtoverlay_get_property(DTBLOB_T *dtb, int pos, const char *prop_name
    return fdt_getprop(dtb->fdt, pos, prop_name, prop_len);
 }
 
+int dtoverlay_set_property(DTBLOB_T *dtb, int pos,
+                           const char *prop_name, const void *prop, int prop_len)
+{
+   int err = fdt_setprop(dtb->fdt, pos, prop_name, prop, prop_len);
+   if (err < 0)
+      dtoverlay_error("Failed to set property '%s'", prop_name);
+   return err;
+}
+
 const char *dtoverlay_get_alias(DTBLOB_T *dtb, const char *alias_name)
 {
    int node_off;
index 34d72a87c6c827099e2e50b10cb25fd35a9ad73b..63f00cfb41e2cf3cfa1fc6a9a1b87059b261e374 100644 (file)
@@ -168,12 +168,17 @@ static inline void dtoverlay_dtb_set_trailer(DTBLOB_T *dtb,
 
 int dtoverlay_find_phandle(DTBLOB_T *dtb, int phandle);
 
+int dtoverlay_find_symbol(DTBLOB_T *dtb, const char *symbol_name);
+
 int dtoverlay_find_matching_node(DTBLOB_T *dtb, const char **node_names,
                                  int pos);
 
 const void *dtoverlay_get_property(DTBLOB_T *dtb, int pos,
                                    const char *prop_name, int *prop_len);
 
+int dtoverlay_set_property(DTBLOB_T *dtb, int pos,
+                           const char *prop_name, const void *prop, int prop_len);
+
 const char *dtoverlay_get_alias(DTBLOB_T *dtb, const char *alias_name);
 
 int dtoverlay_set_alias(DTBLOB_T *dtb, const char *alias_name, const char *value);