diff options
Diffstat (limited to 'drivers/reset/core.c')
| -rw-r--r-- | drivers/reset/core.c | 17 | 
1 files changed, 6 insertions, 11 deletions
| diff --git a/drivers/reset/core.c b/drivers/reset/core.c index dba74e857be6..4d509d41456a 100644 --- a/drivers/reset/core.c +++ b/drivers/reset/core.c @@ -812,6 +812,7 @@ __reset_control_get_internal(struct reset_controller_dev *rcdev,  	kref_init(&rstc->refcnt);  	rstc->acquired = acquired;  	rstc->shared = shared; +	get_device(rcdev->dev);  	return rstc;  } @@ -826,6 +827,7 @@ static void __reset_control_release(struct kref *kref)  	module_put(rstc->rcdev->owner);  	list_del(&rstc->list); +	put_device(rstc->rcdev->dev);  	kfree(rstc);  } @@ -916,20 +918,18 @@ static int __reset_add_reset_gpio_device(const struct of_phandle_args *args)  	 */  	lockdep_assert_not_held(&reset_list_mutex); -	mutex_lock(&reset_gpio_lookup_mutex); +	guard(mutex)(&reset_gpio_lookup_mutex);  	list_for_each_entry(rgpio_dev, &reset_gpio_lookup_list, list) {  		if (args->np == rgpio_dev->of_args.np) {  			if (of_phandle_args_equal(args, &rgpio_dev->of_args)) -				goto out; /* Already on the list, done */ +				return 0; /* Already on the list, done */  		}  	}  	id = ida_alloc(&reset_gpio_ida, GFP_KERNEL); -	if (id < 0) { -		ret = id; -		goto err_unlock; -	} +	if (id < 0) +		return id;  	/* Not freed on success, because it is persisent subsystem data. */  	rgpio_dev = kzalloc(sizeof(*rgpio_dev), GFP_KERNEL); @@ -959,9 +959,6 @@ static int __reset_add_reset_gpio_device(const struct of_phandle_args *args)  	list_add(&rgpio_dev->list, &reset_gpio_lookup_list); -out: -	mutex_unlock(&reset_gpio_lookup_mutex); -  	return 0;  err_put: @@ -970,8 +967,6 @@ err_kfree:  	kfree(rgpio_dev);  err_ida_free:  	ida_free(&reset_gpio_ida, id); -err_unlock: -	mutex_unlock(&reset_gpio_lookup_mutex);  	return ret;  } | 
