Hello Pantelis,
On 07/11/13 21:17, ext Pantelis Antoniou wrote:Introduce helper functions for working with the live DT tree.
__of_free_property() frees a dynamically created property
__of_free_tree() recursively frees a device node tree
__of_copy_property() copies a property dynamically
__of_create_empty_node() creates an empty node
__of_find_node_by_full_name() finds the node with the full name
and
of_multi_prop_cmp() performs a multi property compare but without
having to take locks.
Signed-off-by: Pantelis Antoniou <panto@xxxxxxxxxxxxxxxxxxxxxxx>
---
drivers/of/Makefile | 2 +-
drivers/of/util.c | 253 ++++++++++++++++++++++++++++++++++++++++++++++++++++
include/linux/of.h | 59 ++++++++++++
3 files changed, 313 insertions(+), 1 deletion(-)
create mode 100644 drivers/of/util.c
...
+struct property *__of_copy_property(const struct property *prop, gfp_t flags)^^^^^^^^^^^^^^^^^^^^^^^
+{
+ struct property *propn;
+
+ propn = kzalloc(sizeof(*prop), flags);
+ if (propn == NULL)
+ return NULL;
+
+ propn->name = kstrdup(prop->name, flags);
+ if (propn->name == NULL)
+ goto err_fail_name;
+
+ if (prop->length > 0) {
As Ioan already mentioned, this is really a problem.
There is a bunch of places, where properties without values are used.
Like gpio-controller; ranges; interrupt-controller;
Refer, for example, to of_irq_map_raw() which checks
of_get_property(ipar, "interrupt-controller", NULL) != NULL
and some other occurrences of exactly same construct.
This will simply be broken for merged device-tree parts.
+ propn->value = kmalloc(prop->length, flags);
+ if (propn->value == NULL)
+ goto err_fail_value;
+ memcpy(propn->value, prop->value, prop->length);
+ propn->length = prop->length;
+ }
+
+ /* mark the property as dynamic */
+ of_property_set_flag(propn, OF_DYNAMIC);
+
+ return propn;
+
+err_fail_value:
+ kfree(propn->name);
+err_fail_name:
+ kfree(propn);
+ return NULL;
+}
+
...