diff options
| author | Arnd Bergmann <arnd@arndb.de> | 2024-09-05 17:11:20 +0300 | 
|---|---|---|
| committer | Arnd Bergmann <arnd@arndb.de> | 2024-09-05 17:11:25 +0300 | 
| commit | 311ef8837ff2c99a1594fa979aa6bc6e0099d98c (patch) | |
| tree | cf7ee6a297f64a9258a5fb888f9d9dd0a5dc6ce4 /drivers/reset/core.c | |
| parent | 639d5f6dee6eef470bcef434a5c401571602d9c4 (diff) | |
| parent | 487b1b32e317b85c2948eb4013f3e089a0433d49 (diff) | |
| download | linux-311ef8837ff2c99a1594fa979aa6bc6e0099d98c.tar.xz | |
Merge tag 'reset-for-v6.12' of git://git.pengutronix.de/pza/linux into soc/drivers
Reset controller updates for v6.12
Use get_device()/put_device() to keep reset controller devices alive
while their reset controls are acquired.
Enable support for the Amlogic T7 SoC reset controller.
Remove unused EyeQ reset bindings and add a reset controller driver
to be instantiated as auxiliary device by the EyeQ clock driver.
Fix OF node leaks in the k210 and berlin probe() error paths.
Add some simplifications and cleanup in the core, lcp18xx driver, and
uniphier bindings.
* tag 'reset-for-v6.12' of git://git.pengutronix.de/pza/linux:
  reset: eyeq: add platform driver
  Revert "dt-bindings: reset: mobileye,eyeq5-reset: add bindings"
  reset: reset-meson: Add support for Amlogic T7 SoC reset controller
  dt-bindings: reset: Add Amlogic T7 reset controller
  reset: core: add get_device()/put_device on rcdev
  reset: lpc18xx: simplify with devm_clk_get_enabled()
  reset: lpc18xx: simplify with dev_err_probe()
  reset: simplify locking with guard()
  reset: k210: fix OF node leak in probe() error path
  reset: berlin: fix OF node leak in probe() error path
  dt-bindings: reset: socionext,uniphier-glue-reset: add top-level constraints
Link: https://lore.kernel.org/r/20240904103921.1479579-1-p.zabel@pengutronix.de
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
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;  } | 
