[PATCH v5] dm: core: Add of_match_node helper function
Biju Das
biju.das.jz at bp.renesas.com
Sat Jan 16 13:40:42 CET 2021
Add of_match_node() helper function to iterate over the device tree
and tell if a device_node has a matching of_match structure.
Signed-off-by: Biju Das <biju.das.jz at bp.renesas.com>
Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj at bp.renesas.com>
Reviewed-by: Simon Glass <sjg at chromium.org>
---
v4->v5:
* Rebased to latest master
v3->v4: No change
* Added Simon's Rb tag.
v2->v3:
* Added a test case for of_match_node helper function.
(Ref: https://patchwork.ozlabs.org/project/uboot/patch/20201102150959.4793-2-biju.das.jz@bp.renesas.com/)
v1->v2:
* No Change
v1:
* New Patch
---
drivers/core/device.c | 21 +++++++++++++++++++++
include/dm/device.h | 13 +++++++++++++
test/dm/core.c | 31 +++++++++++++++++++++++++++++++
3 files changed, 65 insertions(+)
diff --git a/drivers/core/device.c b/drivers/core/device.c
index aeab3836ed..4ff708fd38 100644
--- a/drivers/core/device.c
+++ b/drivers/core/device.c
@@ -1022,6 +1022,27 @@ bool of_machine_is_compatible(const char *compat)
return !fdt_node_check_compatible(fdt, 0, compat);
}
+static
+const struct udevice_id *__of_match_node(const struct udevice_id *matches,
+ const ofnode node)
+{
+ if (!matches)
+ return NULL;
+
+ for (; matches->compatible; matches++) {
+ if (ofnode_device_is_compatible(node, matches->compatible))
+ return matches;
+ }
+
+ return NULL;
+}
+
+const struct udevice_id *of_match_node(const struct udevice_id *matches,
+ const ofnode node)
+{
+ return __of_match_node(matches, node);
+}
+
int dev_disable_by_path(const char *path)
{
struct uclass *uc;
diff --git a/include/dm/device.h b/include/dm/device.h
index f5b4cd6876..950fc78184 100644
--- a/include/dm/device.h
+++ b/include/dm/device.h
@@ -802,6 +802,19 @@ bool device_is_compatible(const struct udevice *dev, const char *compat);
*/
bool of_machine_is_compatible(const char *compat);
+/**
+ * of_match_node() - Tell if a device_node has a matching of_match structure
+ *
+ *
+ * Low level utility function used by device matching.
+ *
+ * @matches: array of of device match structures to search in
+ * @node: the of device structure to match against
+ * @return matching structure on success, NULL if the match is not found
+ */
+const struct udevice_id *of_match_node(const struct udevice_id *matches,
+ const ofnode node);
+
/**
* dev_disable_by_path() - Disable a device given its device tree path
*
diff --git a/test/dm/core.c b/test/dm/core.c
index 1f5ca570dc..aae4d8427d 100644
--- a/test/dm/core.c
+++ b/test/dm/core.c
@@ -11,6 +11,7 @@
#include <fdtdec.h>
#include <log.h>
#include <malloc.h>
+#include <dm/device.h>
#include <dm/device-internal.h>
#include <dm/root.h>
#include <dm/util.h>
@@ -1067,6 +1068,36 @@ static int dm_test_inactive_child(struct unit_test_state *uts)
}
DM_TEST(dm_test_inactive_child, UT_TESTF_SCAN_PDATA);
+static int dm_test_of_match_node(struct unit_test_state *uts)
+{
+ const ulong test_data_expected = 0x1234;
+ ofnode root_node = ofnode_path("/");
+ const struct udevice_id *match;
+ unsigned long match_data;
+
+ const struct udevice_id soc_device_ids[] = {
+ { .compatible = "sandbox", .data = test_data_expected, },
+ { /* sentinel */ }
+ };
+
+ const struct udevice_id soc_device_nomatch_ids[] = {
+ { .compatible = "sandbox123", .data = test_data_expected, },
+ { /* sentinel */ }
+ };
+
+ match = of_match_node(soc_device_ids, root_node);
+ ut_assert(match);
+
+ match_data = match->data;
+ ut_asserteq(match_data, test_data_expected);
+
+ match = of_match_node(soc_device_nomatch_ids, root_node);
+ ut_asserteq_ptr(match, NULL);
+
+ return 0;
+}
+DM_TEST(dm_test_of_match_node, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
+
/* Make sure all bound devices have a sequence number */
static int dm_test_all_have_seq(struct unit_test_state *uts)
{
--
2.17.1
More information about the U-Boot
mailing list