[U-Boot] [PATCH v2 2/6] libfdt: add fdtdec_lookup_phandle_index()
Andre Przywara
andre.przywara at arm.com
Sun Jul 23 22:56:36 UTC 2017
In some bindings a property points to multiple nodes, using a list of
phandles. A prominent example are UART pinctrl nodes, which use one node
to contain the RX/TX pins and another node to describe the lines used
for the hardware handshake.
The current fdtdec_lookup_phandle() helper function to chase a phandle
is quite convienent, but can only lookup the first of those handles.
Introduce an extra function fdtdec_lookup_phandle_index() to take an
index parameter and implement fdtdec_lookup_phandle() as a special case
of that.
Signed-off-by: Andre Przywara <andre.przywara at arm.com>
---
include/fdtdec.h | 12 ++++++++++++
lib/fdtdec.c | 16 ++++++++++++----
2 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/include/fdtdec.h b/include/fdtdec.h
index eda2ffa..529e0fe 100644
--- a/include/fdtdec.h
+++ b/include/fdtdec.h
@@ -650,6 +650,18 @@ int fdtdec_get_chosen_node(const void *blob, const char *name);
*/
const char *fdtdec_get_compatible(enum fdt_compat_id id);
+/* Look up a phandle with a given index and follow it to its node.
+ * Then return the offset of that node.
+ *
+ * @param blob FDT blob
+ * @param node node to examine
+ * @param prop_name name of property to find
+ * @param index index of the desired phandle in the list
+ * @return node offset if found, -ve error code on error
+ */
+int fdtdec_lookup_phandle_index(const void *blob, int node,
+ const char *prop_name, int index);
+
/* Look up a phandle and follow it to its node. Then return the offset
* of that node.
*
diff --git a/lib/fdtdec.c b/lib/fdtdec.c
index fbb48bf..9ce5e41 100644
--- a/lib/fdtdec.c
+++ b/lib/fdtdec.c
@@ -618,20 +618,28 @@ int fdtdec_prepare_fdt(void)
return 0;
}
-int fdtdec_lookup_phandle(const void *blob, int node, const char *prop_name)
+int fdtdec_lookup_phandle_index(const void *blob, int node,
+ const char *prop_name, int index)
{
const u32 *phandle;
int lookup;
+ int length;
debug("%s: %s\n", __func__, prop_name);
- phandle = fdt_getprop(blob, node, prop_name, NULL);
- if (!phandle)
+ phandle = fdt_getprop(blob, node, prop_name, &length);
+ if (!phandle || index * 4 >= length)
return -FDT_ERR_NOTFOUND;
- lookup = fdt_node_offset_by_phandle(blob, fdt32_to_cpu(*phandle));
+ lookup = fdt_node_offset_by_phandle(blob,
+ fdt32_to_cpu(phandle[index]));
return lookup;
}
+int fdtdec_lookup_phandle(const void *blob, int node, const char *prop_name)
+{
+ return fdtdec_lookup_phandle_index(blob, node, prop_name, 0);
+}
+
/**
* Look up a property in a node and check that it has a minimum length.
*
--
2.8.2
More information about the U-Boot
mailing list