diff options
author | Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 2021-03-29 18:12:03 +0300 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2021-04-05 13:18:22 +0200 |
commit | 06ad93c328dcebdc13df5ec6dc8a5142f4a3f1da (patch) | |
tree | 856bf8a15bafd383c8d3568947124a39f8667c2b /drivers/base | |
parent | 3f6b6536a73fad0c2c82db1672fc500cc15ff551 (diff) | |
download | lwn-06ad93c328dcebdc13df5ec6dc8a5142f4a3f1da.tar.gz lwn-06ad93c328dcebdc13df5ec6dc8a5142f4a3f1da.zip |
software node: Introduce software_node_alloc()/software_node_free()
Introduce software_node_alloc() and software_node_free() helpers.
This will help with code readability and maintenance.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20210329151207.36619-2-andriy.shevchenko@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/base')
-rw-r--r-- | drivers/base/swnode.c | 47 |
1 files changed, 24 insertions, 23 deletions
diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c index 0acb908172cd..6906a0a7cf47 100644 --- a/drivers/base/swnode.c +++ b/drivers/base/swnode.c @@ -720,19 +720,30 @@ software_node_find_by_name(const struct software_node *parent, const char *name) } EXPORT_SYMBOL_GPL(software_node_find_by_name); -static int -software_node_register_properties(struct software_node *node, - const struct property_entry *properties) +static struct software_node *software_node_alloc(const struct property_entry *properties) { struct property_entry *props; + struct software_node *node; props = property_entries_dup(properties); if (IS_ERR(props)) - return PTR_ERR(props); + return ERR_CAST(props); + + node = kzalloc(sizeof(*node), GFP_KERNEL); + if (!node) { + property_entries_free(props); + return ERR_PTR(-ENOMEM); + } node->properties = props; - return 0; + return node; +} + +static void software_node_free(const struct software_node *node) +{ + property_entries_free(node->properties); + kfree(node); } static void software_node_release(struct kobject *kobj) @@ -746,10 +757,9 @@ static void software_node_release(struct kobject *kobj) ida_simple_remove(&swnode_root_ids, swnode->id); } - if (swnode->allocated) { - property_entries_free(swnode->node->properties); - kfree(swnode->node); - } + if (swnode->allocated) + software_node_free(swnode->node); + ida_destroy(&swnode->child_ids); kfree(swnode); } @@ -972,7 +982,6 @@ fwnode_create_software_node(const struct property_entry *properties, struct fwnode_handle *fwnode; struct software_node *node; struct swnode *p = NULL; - int ret; if (parent) { if (IS_ERR(parent)) @@ -982,23 +991,15 @@ fwnode_create_software_node(const struct property_entry *properties, p = to_swnode(parent); } - node = kzalloc(sizeof(*node), GFP_KERNEL); - if (!node) - return ERR_PTR(-ENOMEM); - - ret = software_node_register_properties(node, properties); - if (ret) { - kfree(node); - return ERR_PTR(ret); - } + node = software_node_alloc(properties); + if (IS_ERR(node)) + return ERR_CAST(node); node->parent = p ? p->node : NULL; fwnode = swnode_register(node, p, 1); - if (IS_ERR(fwnode)) { - property_entries_free(node->properties); - kfree(node); - } + if (IS_ERR(fwnode)) + software_node_free(node); return fwnode; } |