diff --git a/commands/of_node.c b/commands/of_node.c index e60ef66..b1894b1 100644 --- a/commands/of_node.c +++ b/commands/of_node.c @@ -87,7 +87,7 @@ return -ENOENT; } - of_free(node); + of_delete_node(node); } return 0; diff --git a/commands/oftree.c b/commands/oftree.c index 9149517..00e54dc 100644 --- a/commands/oftree.c +++ b/commands/oftree.c @@ -86,7 +86,7 @@ struct device_node *root = of_get_root_node(); if (root) - of_free(root); + of_delete_node(root); return 0; } @@ -162,7 +162,7 @@ goto out; } of_print_nodes(root, 0); - of_free(root); + of_delete_node(root); } else { struct device_node *n = of_find_node_by_path(node); if (!n) { diff --git a/drivers/of/base.c b/drivers/of/base.c index 1cf7a5f..e9f1f79 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -1549,39 +1549,6 @@ return 0; } -void of_free(struct device_node *node) -{ - struct device_node *n, *nt; - struct property *p, *pt; - struct device_d *dev; - - if (!node) - return; - - list_for_each_entry_safe(p, pt, &node->properties, list) - of_delete_property(p); - - list_for_each_entry_safe(n, nt, &node->children, parent_list) { - of_free(n); - } - - if (node->parent) { - list_del(&node->parent_list); - list_del(&node->list); - } - - dev = of_find_device_by_node(node); - if (dev) - dev->device_node = NULL; - - free(node->name); - free(node->full_name); - free(node); - - if (node == root_node) - of_set_root_node(NULL); -} - static void __of_parse_phandles(struct device_node *node) { struct device_node *n; @@ -1679,6 +1646,38 @@ return dn; } +void of_delete_node(struct device_node *node) +{ + struct device_node *n, *nt; + struct property *p, *pt; + struct device_d *dev; + + if (!node) + return; + + list_for_each_entry_safe(p, pt, &node->properties, list) + of_delete_property(p); + + list_for_each_entry_safe(n, nt, &node->children, parent_list) + of_delete_node(n); + + if (node->parent) { + list_del(&node->parent_list); + list_del(&node->list); + } + + dev = of_find_device_by_node(node); + if (dev) + dev->device_node = NULL; + + free(node->name); + free(node->full_name); + free(node); + + if (node == root_node) + of_set_root_node(NULL); +} + int of_device_is_stdout_path(struct device_d *dev) { struct device_node *dn; diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index afaa4e0..76d6bb1 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -211,7 +211,7 @@ } } err: - of_free(root); + of_delete_node(root); return ERR_PTR(ret); } diff --git a/include/of.h b/include/of.h index f01d854..ebe8e39 100644 --- a/include/of.h +++ b/include/of.h @@ -139,7 +139,7 @@ const char *name); extern struct device_node *of_create_node(struct device_node *root, const char *path); -extern void of_free(struct device_node *node); +extern void of_delete_node(struct device_node *node); extern int of_machine_is_compatible(const char *compat); extern int of_device_is_compatible(const struct device_node *device, @@ -508,7 +508,7 @@ return NULL; } -static inline void of_free(struct device_node *node) +static inline void of_delete_node(struct device_node *node) { }