dm: core: Introduce dev_read_alias_highest_id()
[oweals/u-boot.git] / drivers / core / of_access.c
index 9a50f559de2d927c56e156076a2845c8fce210fc..945b81448ccef04fc9aa308695ea3f82e38d5003 100644 (file)
@@ -376,6 +376,33 @@ struct device_node *of_find_compatible_node(struct device_node *from,
        return np;
 }
 
+static int of_device_has_prop_value(const struct device_node *device,
+                                   const char *propname, const void *propval,
+                                   int proplen)
+{
+       struct property *prop = of_find_property(device, propname, NULL);
+
+       if (!prop || !prop->value || prop->length != proplen)
+               return 0;
+       return !memcmp(prop->value, propval, proplen);
+}
+
+struct device_node *of_find_node_by_prop_value(struct device_node *from,
+                                              const char *propname,
+                                              const void *propval, int proplen)
+{
+       struct device_node *np;
+
+       for_each_of_allnodes_from(from, np) {
+               if (of_device_has_prop_value(np, propname, propval, proplen) &&
+                   of_node_get(np))
+                       break;
+       }
+       of_node_put(from);
+
+       return np;
+}
+
 struct device_node *of_find_node_by_phandle(phandle handle)
 {
        struct device_node *np;
@@ -457,6 +484,26 @@ int of_read_u32_array(const struct device_node *np, const char *propname,
        return 0;
 }
 
+int of_read_u64(const struct device_node *np, const char *propname, u64 *outp)
+{
+       const __be64 *val;
+
+       debug("%s: %s: ", __func__, propname);
+       if (!np)
+               return -EINVAL;
+       val = of_find_property_value_of_size(np, propname, sizeof(*outp));
+       if (IS_ERR(val)) {
+               debug("(not found)\n");
+               return PTR_ERR(val);
+       }
+
+       *outp = be64_to_cpup(val);
+       debug("%#llx (%lld)\n", (unsigned long long)*outp,
+              (unsigned long long)*outp);
+
+       return 0;
+}
+
 int of_property_match_string(const struct device_node *np, const char *propname,
                             const char *string)
 {
@@ -765,6 +812,24 @@ int of_alias_get_id(const struct device_node *np, const char *stem)
        return id;
 }
 
+int of_alias_get_highest_id(const char *stem)
+{
+       struct alias_prop *app;
+       int id = -1;
+
+       mutex_lock(&of_mutex);
+       list_for_each_entry(app, &aliases_lookup, link) {
+               if (strcmp(app->stem, stem) != 0)
+                       continue;
+
+               if (app->id > id)
+                       id = app->id;
+       }
+       mutex_unlock(&of_mutex);
+
+       return id;
+}
+
 struct device_node *of_get_stdout(void)
 {
        return of_stdout;