imx8m: config: convert to bootm_size
[platform/kernel/u-boot.git] / drivers / core / ofnode.c
index b0be7cb..c37afa1 100644 (file)
@@ -8,6 +8,7 @@
 #include <dm.h>
 #include <fdtdec.h>
 #include <fdt_support.h>
+#include <log.h>
 #include <malloc.h>
 #include <linux/libfdt.h>
 #include <dm/of_access.h>
@@ -474,6 +475,17 @@ ofnode ofnode_get_chosen_node(const char *name)
        return ofnode_path(prop);
 }
 
+int ofnode_get_child_count(ofnode parent)
+{
+       ofnode child;
+       int num = 0;
+
+       ofnode_for_each_subnode(child, parent)
+               num++;
+
+       return num;
+}
+
 static int decode_timing_property(ofnode node, const char *name,
                                  struct timing_entry *result)
 {
@@ -571,6 +583,54 @@ const void *ofnode_get_property(ofnode node, const char *propname, int *lenp)
                                   propname, lenp);
 }
 
+int ofnode_get_first_property(ofnode node, struct ofprop *prop)
+{
+       prop->node = node;
+
+       if (ofnode_is_np(node)) {
+               prop->prop = of_get_first_property(ofnode_to_np(prop->node));
+               if (!prop->prop)
+                       return -FDT_ERR_NOTFOUND;
+       } else {
+               prop->offset =
+                       fdt_first_property_offset(gd->fdt_blob,
+                                                 ofnode_to_offset(prop->node));
+               if (prop->offset < 0)
+                       return prop->offset;
+       }
+
+       return 0;
+}
+
+int ofnode_get_next_property(struct ofprop *prop)
+{
+       if (ofnode_is_np(prop->node)) {
+               prop->prop = of_get_next_property(ofnode_to_np(prop->node),
+                                                 prop->prop);
+               if (!prop->prop)
+                       return -FDT_ERR_NOTFOUND;
+       } else {
+               prop->offset = fdt_next_property_offset(gd->fdt_blob,
+                                                       prop->offset);
+               if (prop->offset  < 0)
+                       return prop->offset;
+       }
+
+       return 0;
+}
+
+const void *ofnode_get_property_by_prop(const struct ofprop *prop,
+                                       const char **propname, int *lenp)
+{
+       if (ofnode_is_np(prop->node))
+               return of_get_property_by_prop(ofnode_to_np(prop->node),
+                                              prop->prop, propname, lenp);
+       else
+               return fdt_getprop_by_offset(gd->fdt_blob,
+                                            prop->offset,
+                                            propname, lenp);
+}
+
 bool ofnode_is_available(ofnode node)
 {
        if (ofnode_is_np(node))