]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
of/fdt: Consolidate duplicate code into helper functions
authorYuntao Wang <yuntao.wang@linux.dev>
Sat, 15 Nov 2025 13:47:46 +0000 (21:47 +0800)
committerRob Herring (Arm) <robh@kernel.org>
Thu, 20 Nov 2025 14:32:48 +0000 (08:32 -0600)
Currently, there are many pieces of nearly identical code scattered across
different places. Consolidate the duplicate code into helper functions to
improve maintainability and reduce the likelihood of errors.

Signed-off-by: Yuntao Wang <yuntao.wang@linux.dev>
Link: https://patch.msgid.link/20251115134753.179931-2-yuntao.wang@linux.dev
Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
drivers/of/fdt.c
include/linux/of_fdt.h

index 0edd639898a63fd84cb1303e1e3d5c7fb7351b81..0c18bdefbbeea4fea79951ef9c353fe16c3c7328 100644 (file)
@@ -625,6 +625,47 @@ const void *__init of_get_flat_dt_prop(unsigned long node, const char *name,
        return fdt_getprop(initial_boot_params, node, name, size);
 }
 
+const __be32 *__init of_flat_dt_get_addr_size_prop(unsigned long node,
+                                                  const char *name,
+                                                  int *entries)
+{
+       const __be32 *prop;
+       int len, elen = (dt_root_addr_cells + dt_root_size_cells) * sizeof(__be32);
+
+       prop = of_get_flat_dt_prop(node, name, &len);
+       if (!prop || len % elen) {
+               *entries = 0;
+               return NULL;
+       }
+
+       *entries = len / elen;
+       return prop;
+}
+
+bool __init of_flat_dt_get_addr_size(unsigned long node, const char *name,
+                                    u64 *addr, u64 *size)
+{
+       const __be32 *prop;
+       int entries;
+
+       prop = of_flat_dt_get_addr_size_prop(node, name, &entries);
+       if (!prop || entries != 1)
+               return false;
+
+       of_flat_dt_read_addr_size(prop, 0, addr, size);
+       return true;
+}
+
+void __init of_flat_dt_read_addr_size(const __be32 *prop, int entry_index,
+                                     u64 *addr, u64 *size)
+{
+       int entry_cells = dt_root_addr_cells + dt_root_size_cells;
+       prop += entry_cells * entry_index;
+
+       *addr = dt_mem_next_cell(dt_root_addr_cells, &prop);
+       *size = dt_mem_next_cell(dt_root_size_cells, &prop);
+}
+
 /**
  * of_fdt_is_compatible - Return true if given node from the given blob has
  * compat in its compatible list
index b8d6c0c208760ab17372b4c3c32dbb2124f5184f..51dadbaa3d63a393792b5b0b154d8153a9d32bcb 100644 (file)
@@ -55,6 +55,15 @@ extern int of_get_flat_dt_subnode_by_name(unsigned long node,
                                          const char *uname);
 extern const void *of_get_flat_dt_prop(unsigned long node, const char *name,
                                       int *size);
+
+extern const __be32 *of_flat_dt_get_addr_size_prop(unsigned long node,
+                                                  const char *name,
+                                                  int *entries);
+extern bool of_flat_dt_get_addr_size(unsigned long node, const char *name,
+                                    u64 *addr, u64 *size);
+extern void of_flat_dt_read_addr_size(const __be32 *prop, int entry_index,
+                                     u64 *addr, u64 *size);
+
 extern int of_flat_dt_is_compatible(unsigned long node, const char *name);
 extern unsigned long of_get_flat_dt_root(void);
 extern uint32_t of_get_flat_dt_phandle(unsigned long node);