diff options
Diffstat (limited to 'drivers/regulator/core.c')
| -rw-r--r-- | drivers/regulator/core.c | 33 | 
1 files changed, 20 insertions, 13 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 5c4829cba6a..e872c8be080 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -1381,22 +1381,14 @@ struct regulator *regulator_get_exclusive(struct device *dev, const char *id)  }  EXPORT_SYMBOL_GPL(regulator_get_exclusive); -/** - * regulator_put - "free" the regulator source - * @regulator: regulator source - * - * Note: drivers must ensure that all regulator_enable calls made on this - * regulator source are balanced by regulator_disable calls prior to calling - * this function. - */ -void regulator_put(struct regulator *regulator) +/* Locks held by regulator_put() */ +static void _regulator_put(struct regulator *regulator)  {  	struct regulator_dev *rdev;  	if (regulator == NULL || IS_ERR(regulator))  		return; -	mutex_lock(®ulator_list_mutex);  	rdev = regulator->rdev;  	debugfs_remove_recursive(regulator->debugfs); @@ -1412,6 +1404,20 @@ void regulator_put(struct regulator *regulator)  	rdev->exclusive = 0;  	module_put(rdev->owner); +} + +/** + * regulator_put - "free" the regulator source + * @regulator: regulator source + * + * Note: drivers must ensure that all regulator_enable calls made on this + * regulator source are balanced by regulator_disable calls prior to calling + * this function. + */ +void regulator_put(struct regulator *regulator) +{ +	mutex_lock(®ulator_list_mutex); +	_regulator_put(regulator);  	mutex_unlock(®ulator_list_mutex);  }  EXPORT_SYMBOL_GPL(regulator_put); @@ -1974,7 +1980,7 @@ int regulator_is_supported_voltage(struct regulator *regulator,  	if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_VOLTAGE)) {  		ret = regulator_get_voltage(regulator);  		if (ret >= 0) -			return (min_uV >= ret && ret <= max_uV); +			return (min_uV <= ret && ret <= max_uV);  		else  			return ret;  	} @@ -3365,7 +3371,7 @@ regulator_register(const struct regulator_desc *regulator_desc,  		if (ret != 0) {  			rdev_err(rdev, "Failed to request enable GPIO%d: %d\n",  				 config->ena_gpio, ret); -			goto clean; +			goto wash;  		}  		rdev->ena_gpio = config->ena_gpio; @@ -3445,10 +3451,11 @@ unset_supplies:  scrub:  	if (rdev->supply) -		regulator_put(rdev->supply); +		_regulator_put(rdev->supply);  	if (rdev->ena_gpio)  		gpio_free(rdev->ena_gpio);  	kfree(rdev->constraints); +wash:  	device_unregister(&rdev->dev);  	/* device core frees rdev */  	rdev = ERR_PTR(ret);  |