]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
dm: core: Support writing a boolean
authorSimon Glass <sjg@chromium.org>
Tue, 26 Sep 2023 14:14:44 +0000 (08:14 -0600)
committerTom Rini <trini@konsulko.com>
Fri, 6 Oct 2023 18:38:13 +0000 (14:38 -0400)
Add functions to write a boolean property. This involves deleting it if
the value is false.

Add a new ofnode_has_property() as well. Add a comment about the behaviour
of of_read_property() when the property value is empty.

Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/core/ofnode.c
include/dm/ofnode.h
test/dm/ofnode.c

index 39ba480c8f88b03aba15c6176cc2a148778875e2..4dcb3dd1c03725882b4ad9a1e0c20405a0d6bebe 100644 (file)
@@ -491,12 +491,12 @@ u64 ofnode_read_u64_default(ofnode node, const char *propname, u64 def)
 
 bool ofnode_read_bool(ofnode node, const char *propname)
 {
-       const void *prop;
+       bool prop;
 
        assert(ofnode_valid(node));
        debug("%s: %s: ", __func__, propname);
 
-       prop = ofnode_get_property(node, propname, NULL);
+       prop = ofnode_has_property(node, propname);
 
        debug("%s\n", prop ? "true" : "false");
 
@@ -1168,6 +1168,14 @@ const void *ofnode_get_property(ofnode node, const char *propname, int *lenp)
                                   propname, lenp);
 }
 
+bool ofnode_has_property(ofnode node, const char *propname)
+{
+       if (ofnode_is_np(node))
+               return of_find_property(ofnode_to_np(node), propname, NULL);
+       else
+               return ofnode_get_property(node, propname, NULL);
+}
+
 int ofnode_first_property(ofnode node, struct ofprop *prop)
 {
        prop->node = node;
@@ -1616,6 +1624,30 @@ int ofnode_write_u32(ofnode node, const char *propname, u32 value)
        return ofnode_write_prop(node, propname, val, sizeof(value), false);
 }
 
+int ofnode_write_bool(ofnode node, const char *propname, bool value)
+{
+       if (value)
+               return ofnode_write_prop(node, propname, NULL, 0, false);
+       else
+               return ofnode_delete_prop(node, propname);
+}
+
+int ofnode_delete_prop(ofnode node, const char *propname)
+{
+       if (ofnode_is_np(node)) {
+               struct property *prop;
+               int len;
+
+               prop = of_find_property(ofnode_to_np(node), propname, &len);
+               if (prop)
+                       return of_remove_property(ofnode_to_np(node), prop);
+               return 0;
+       } else {
+               return fdt_delprop(ofnode_to_fdt(node), ofnode_to_offset(node),
+                                  propname);
+       }
+}
+
 int ofnode_set_enabled(ofnode node, bool value)
 {
        assert(ofnode_valid(node));
index a8605fb718b22ca9aebeb86bd743101c616124b9..ebea29d32afc36d4bb3124f4fc9eda93cbf0800f 100644 (file)
@@ -1037,10 +1037,19 @@ int ofnode_decode_panel_timing(ofnode node,
  * @node: node to read
  * @propname: property to read
  * @lenp: place to put length on success
- * Return: pointer to property, or NULL if not found
+ * Return: pointer to property value, or NULL if not found or empty
  */
 const void *ofnode_get_property(ofnode node, const char *propname, int *lenp);
 
+/**
+ * ofnode_has_property() - check if a node has a named property
+ *
+ * @node: node to read
+ * @propname: property to read
+ * Return: true if the property exists in the node, false if not
+ */
+bool ofnode_has_property(ofnode node, const char *propname);
+
 /**
  * ofnode_first_property()- get the reference of the first property
  *
@@ -1452,6 +1461,27 @@ int ofnode_write_string(ofnode node, const char *propname, const char *value);
  */
 int ofnode_write_u32(ofnode node, const char *propname, u32 value);
 
+/**
+ * ofnode_write_bool() - Set a boolean property of an ofnode
+ *
+ * This either adds or deleted a property with a zero-length value
+ *
+ * @node:      The node for whose string property should be set
+ * @propname:  The name of the string property to set
+ * @value:     The new value of the boolean property
+ * Return: 0 if successful, -ve on error
+ */
+int ofnode_write_bool(ofnode node, const char *propname, bool value);
+
+/**
+ * ofnode_delete_prop() - Delete a property
+ *
+ * @node:      Node containing the property to delete
+ * @propname:  Name of property to delete
+ * Return: 0 if successful, -ve on error
+ */
+int ofnode_delete_prop(ofnode node, const char *propname);
+
 /**
  * ofnode_set_enabled() - Enable or disable a device tree node given by its
  *                       ofnode
index ceeb8e57791e7c33b5663a151cd6239d91e587d8..9477f791d6493541b2a0a31798a51b2c944c2237 100644 (file)
@@ -1480,3 +1480,28 @@ static int dm_test_oftree_to_fdt(struct unit_test_state *uts)
        return 0;
 }
 DM_TEST(dm_test_oftree_to_fdt, UT_TESTF_SCAN_FDT);
+
+/* test ofnode_read_bool() and ofnode_write_bool() */
+static int dm_test_bool(struct unit_test_state *uts)
+{
+       const char *propname = "missing-bool-value";
+       ofnode node;
+
+       node = ofnode_path("/a-test");
+       ut_assert(ofnode_read_bool(node, "bool-value"));
+       ut_assert(!ofnode_read_bool(node, propname));
+       ut_assert(!ofnode_has_property(node, propname));
+
+       ut_assertok(ofnode_write_bool(node, propname, true));
+       ut_assert(ofnode_read_bool(node, propname));
+       ut_assert(ofnode_has_property(node, propname));
+       ut_assert(ofnode_read_bool(node, "bool-value"));
+
+       ut_assertok(ofnode_write_bool(node, propname, false));
+       ut_assert(!ofnode_read_bool(node, propname));
+       ut_assert(!ofnode_has_property(node, propname));
+       ut_assert(ofnode_read_bool(node, "bool-value"));
+
+       return 0;
+}
+DM_TEST(dm_test_bool, UT_TESTF_SCAN_FDT);