diff options
Diffstat (limited to 'drivers/regulator/core.c')
| -rw-r--r-- | drivers/regulator/core.c | 29 | 
1 files changed, 18 insertions, 11 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 6382f0af353b..b38a6b669e8c 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -119,6 +119,11 @@ static const char *rdev_get_name(struct regulator_dev *rdev)  		return "";  } +static bool have_full_constraints(void) +{ +	return has_full_constraints || of_have_populated_dt(); +} +  /**   * of_get_regulator - get a regulator device node based on supply name   * @dev: Device pointer for the consumer (of regulator) device @@ -1329,9 +1334,8 @@ static struct regulator *_regulator_get(struct device *dev, const char *id,  	 * If we have return value from dev_lookup fail, we do not expect to  	 * succeed, so, quit with appropriate error value  	 */ -	if (ret && ret != -ENODEV) { +	if (ret && ret != -ENODEV)  		goto out; -	}  	if (!devname)  		devname = "deviceless"; @@ -1340,13 +1344,14 @@ static struct regulator *_regulator_get(struct device *dev, const char *id,  	 * Assume that a regulator is physically present and enabled  	 * even if it isn't hooked up and just provide a dummy.  	 */ -	if (has_full_constraints && allow_dummy) { +	if (have_full_constraints() && allow_dummy) {  		pr_warn("%s supply %s not found, using dummy regulator\n",  			devname, id);  		rdev = dummy_regulator_rdev;  		goto found; -	} else { +	/* Don't log an error when called from regulator_get_optional() */ +	} else if (!have_full_constraints() || exclusive) {  		dev_err(dev, "dummy supplies not allowed\n");  	} @@ -2184,6 +2189,9 @@ int regulator_list_voltage(struct regulator *regulator, unsigned selector)  	struct regulator_ops	*ops = rdev->desc->ops;  	int			ret; +	if (rdev->desc->fixed_uV && rdev->desc->n_voltages == 1 && !selector) +		return rdev->desc->fixed_uV; +  	if (!ops->list_voltage || selector >= rdev->desc->n_voltages)  		return -EINVAL; @@ -2236,7 +2244,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;  	} @@ -2408,7 +2416,7 @@ int regulator_set_voltage(struct regulator *regulator, int min_uV, int max_uV)  	ret = regulator_check_voltage(rdev, &min_uV, &max_uV);  	if (ret < 0)  		goto out; -	 +  	/* restore original values in case of error */  	old_min_uV = regulator->min_uV;  	old_max_uV = regulator->max_uV; @@ -2422,7 +2430,7 @@ int regulator_set_voltage(struct regulator *regulator, int min_uV, int max_uV)  	ret = _regulator_do_set_voltage(rdev, min_uV, max_uV);  	if (ret < 0)  		goto out2; -	 +  out:  	mutex_unlock(&rdev->mutex);  	return ret; @@ -3624,7 +3632,7 @@ int regulator_suspend_finish(void)  			if (error)  				ret = error;  		} else { -			if (!has_full_constraints) +			if (!have_full_constraints())  				goto unlock;  			if (!ops->disable)  				goto unlock; @@ -3822,14 +3830,13 @@ static int __init regulator_init_complete(void)  		if (!enabled)  			goto unlock; -		if (has_full_constraints) { +		if (have_full_constraints()) {  			/* We log since this may kill the system if it  			 * goes wrong. */  			rdev_info(rdev, "disabling\n");  			ret = ops->disable(rdev); -			if (ret != 0) { +			if (ret != 0)  				rdev_err(rdev, "couldn't disable: %d\n", ret); -			}  		} else {  			/* The intention is that in future we will  			 * assume that full constraints are provided  | 
