}
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);
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);
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;
}
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;
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);