summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAhmad Fatoum <a.fatoum@pengutronix.de>2022-09-05 12:36:39 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2022-09-12 10:54:40 +0200
commit11d909019a1759b3a35e55e974020b948a406c76 (patch)
tree0539bac7a9bbf5049daa95370f9659afa803465e
parent4ff6430adde85818b61d9243e8a50ab9eb64e421 (diff)
downloadbarebox-11d909019a1759b3a35e55e974020b948a406c76.tar.gz
of: implement of_rename_property()
It's often desirable to have the same barebox binary for multiple variants. DT-level differences between the variants are often handled by having extra device tree nodes that are disabled by default and patched as appropriate by board code. It can be useful to have a finer granularity for patching though, that covers only a select property, e.g.: usbotg1 { vbus-supply = <&reg_vbus_common>; vendor,specialvariant-vbus-supply = <&reg_vbus_specialvariant>; }; The new of_rename_property allows board code to easily activate the alternative vbus supply on the specialvariant: of_rename_property(np, "vendor,specialvariant-vbus-supply", "vbus-supply"); Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20220905103639.1750714-1-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--drivers/of/base.c16
-rw-r--r--include/of.h8
-rw-r--r--test/self/of_manipulation.c10
-rw-r--r--test/self/of_manipulation.dts6
4 files changed, 38 insertions, 2 deletions
diff --git a/drivers/of/base.c b/drivers/of/base.c
index 52e6a9294e..d2e7ea4ae7 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -2301,6 +2301,22 @@ void of_delete_property(struct property *pp)
free(pp);
}
+struct property *of_rename_property(struct device_node *np,
+ const char *old_name, const char *new_name)
+{
+ struct property *pp;
+
+ pp = of_find_property(np, old_name, NULL);
+ if (!pp)
+ return NULL;
+
+ of_property_write_bool(np, new_name, false);
+
+ free(pp->name);
+ pp->name = xstrdup(new_name);
+ return pp;
+}
+
/**
* of_set_property - create a property for a given node
* @node - the node
diff --git a/include/of.h b/include/of.h
index 492988a290..392227e755 100644
--- a/include/of.h
+++ b/include/of.h
@@ -143,6 +143,8 @@ extern struct property *of_new_property_const(struct device_node *node,
extern struct property *__of_new_property(struct device_node *node,
const char *name, void *data, int len);
extern void of_delete_property(struct property *pp);
+extern struct property *of_rename_property(struct device_node *np,
+ const char *old_name, const char *new_name);
extern struct device_node *of_find_node_by_name(struct device_node *from,
const char *name);
@@ -552,6 +554,12 @@ static inline void of_delete_property(struct property *pp)
{
}
+static inline struct property *of_rename_property(struct device_node *np,
+ const char *old_name, const char *new_name)
+{
+ return NULL;
+}
+
static inline int of_property_read_u32_index(const struct device_node *np,
const char *propname, u32 index, u32 *out_value)
{
diff --git a/test/self/of_manipulation.c b/test/self/of_manipulation.c
index 6eb6062e12..7e30a60ca6 100644
--- a/test/self/of_manipulation.c
+++ b/test/self/of_manipulation.c
@@ -57,6 +57,16 @@ static void test_of_basics(struct device_node *root)
of_property_write_bool(node1, "property1", true);
assert_equal(node1, node2);
+
+ of_property_write_bool(node2, "property1", false);
+ of_property_write_u32(node2, "property1", 1);
+ of_property_write_u32(node2, "property2", 2);
+
+ of_property_write_u32(node1, "property3", 1);
+ of_property_write_u32(node1, "property2", 2);
+ of_rename_property(node1, "property3", "property1");
+
+ assert_equal(node1, node2);
}
static void test_of_property_strings(struct device_node *root)
diff --git a/test/self/of_manipulation.dts b/test/self/of_manipulation.dts
index a69d944c1e..2cc6773fa9 100644
--- a/test/self/of_manipulation.dts
+++ b/test/self/of_manipulation.dts
@@ -4,12 +4,14 @@
/ {
node1 {
- property1;
+ property1 = <1>;
+ property2 = <2>;
node21 { };
};
node2 {
- property1;
+ property1 = <1>;
+ property2 = <2>;
node21 { };
};