dm: ofnode: add ofnode_device_is_compatible() helper
[platform/kernel/u-boot.git] / drivers / core / ofnode.c
index 98f4b53..3cf3205 100644 (file)
@@ -1,15 +1,14 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright (c) 2017 Google, Inc
  * Written by Simon Glass <sjg@chromium.org>
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
 #include <dm.h>
 #include <fdtdec.h>
 #include <fdt_support.h>
-#include <libfdt.h>
+#include <linux/libfdt.h>
 #include <dm/of_access.h>
 #include <dm/of_addr.h>
 #include <dm/ofnode.h>
@@ -165,6 +164,20 @@ ofnode ofnode_next_subnode(ofnode node)
                fdt_next_subnode(gd->fdt_blob, ofnode_to_offset(node)));
 }
 
+ofnode ofnode_get_parent(ofnode node)
+{
+       ofnode parent;
+
+       assert(ofnode_valid(node));
+       if (ofnode_is_np(node))
+               parent = np_to_ofnode(of_get_parent(ofnode_to_np(node)));
+       else
+               parent.of_offset = fdt_parent_offset(gd->fdt_blob,
+                                                    ofnode_to_offset(node));
+
+       return parent;
+}
+
 const char *ofnode_get_name(ofnode node)
 {
        assert(ofnode_valid(node));
@@ -174,6 +187,19 @@ const char *ofnode_get_name(ofnode node)
        return fdt_get_name(gd->fdt_blob, ofnode_to_offset(node), NULL);
 }
 
+ofnode ofnode_get_by_phandle(uint phandle)
+{
+       ofnode node;
+
+       if (of_live_active())
+               node = np_to_ofnode(of_find_node_by_phandle(phandle));
+       else
+               node.of_offset = fdt_node_offset_by_phandle(gd->fdt_blob,
+                                                           phandle);
+
+       return node;
+}
+
 int ofnode_read_size(ofnode node, const char *propname)
 {
        int len;
@@ -200,13 +226,16 @@ fdt_addr_t ofnode_get_addr_index(ofnode node, int index)
                uint flags;
                u64 size;
                int na;
+               int ns;
 
                prop_val = of_get_address(ofnode_to_np(node), index, &size,
                                          &flags);
                if (!prop_val)
                        return FDT_ADDR_T_NONE;
 
-               if (IS_ENABLED(CONFIG_OF_TRANSLATE)) {
+               ns = of_n_size_cells(ofnode_to_np(node));
+
+               if (IS_ENABLED(CONFIG_OF_TRANSLATE) && ns > 0) {
                        return of_translate_address(ofnode_to_np(node), prop_val);
                } else {
                        na = of_n_addr_cells(ofnode_to_np(node));
@@ -657,3 +686,14 @@ u64 ofnode_translate_address(ofnode node, const fdt32_t *in_addr)
        else
                return fdt_translate_address(gd->fdt_blob, ofnode_to_offset(node), in_addr);
 }
+
+int ofnode_device_is_compatible(ofnode node, const char *compat)
+{
+       if (ofnode_is_np(node))
+               return of_device_is_compatible(ofnode_to_np(node), compat,
+                                              NULL, NULL);
+       else
+               return !fdt_node_check_compatible(gd->fdt_blob,
+                                                 ofnode_to_offset(node),
+                                                 compat);
+}