diff options
Diffstat (limited to 'drivers/of/dynamic.c')
| -rw-r--r-- | drivers/of/dynamic.c | 37 | 
1 files changed, 16 insertions, 21 deletions
diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c index 4d57a4e34105..dda6092e6d3a 100644 --- a/drivers/of/dynamic.c +++ b/drivers/of/dynamic.c @@ -9,6 +9,7 @@  #define pr_fmt(fmt)	"OF: " fmt +#include <linux/cleanup.h>  #include <linux/device.h>  #include <linux/of.h>  #include <linux/spinlock.h> @@ -306,15 +307,20 @@ int of_detach_node(struct device_node *np)  }  EXPORT_SYMBOL_GPL(of_detach_node); +void __of_prop_free(struct property *prop) +{ +	kfree(prop->name); +	kfree(prop->value); +	kfree(prop); +} +  static void property_list_free(struct property *prop_list)  {  	struct property *prop, *next;  	for (prop = prop_list; prop != NULL; prop = next) {  		next = prop->next; -		kfree(prop->name); -		kfree(prop->value); -		kfree(prop); +		__of_prop_free(prop);  	}  } @@ -427,9 +433,7 @@ struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags)  	return new;   err_free: -	kfree(new->name); -	kfree(new->value); -	kfree(new); +	__of_prop_free(new);  	return NULL;  } @@ -471,9 +475,7 @@ struct device_node *__of_node_dup(const struct device_node *np,  			if (!new_pp)  				goto err_prop;  			if (__of_add_property(node, new_pp)) { -				kfree(new_pp->name); -				kfree(new_pp->value); -				kfree(new_pp); +				__of_prop_free(new_pp);  				goto err_prop;  			}  		} @@ -933,11 +935,8 @@ static int of_changeset_add_prop_helper(struct of_changeset *ocs,  		return -ENOMEM;  	ret = of_changeset_add_property(ocs, np, new_pp); -	if (ret) { -		kfree(new_pp->name); -		kfree(new_pp->value); -		kfree(new_pp); -	} +	if (ret) +		__of_prop_free(new_pp);  	return ret;  } @@ -1033,10 +1032,9 @@ int of_changeset_add_prop_u32_array(struct of_changeset *ocs,  				    const u32 *array, size_t sz)  {  	struct property prop; -	__be32 *val; -	int i, ret; +	__be32 *val __free(kfree) = kcalloc(sz, sizeof(__be32), GFP_KERNEL); +	int i; -	val = kcalloc(sz, sizeof(__be32), GFP_KERNEL);  	if (!val)  		return -ENOMEM; @@ -1046,9 +1044,6 @@ int of_changeset_add_prop_u32_array(struct of_changeset *ocs,  	prop.length = sizeof(u32) * sz;  	prop.value = (void *)val; -	ret = of_changeset_add_prop_helper(ocs, np, &prop); -	kfree(val); - -	return ret; +	return of_changeset_add_prop_helper(ocs, np, &prop);  }  EXPORT_SYMBOL_GPL(of_changeset_add_prop_u32_array);  |