forked from mirrors/linux
		
	regulator: refactor valid_ops_mask checking code
To make the code more compat and centralized, this patch add a unified function - regulator_ops_is_valid. So we can add some extra checking code easily later. Signed-off-by: WEN Pingbo <pingbo.wen@linaro.org> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
		
							parent
							
								
									45a91e8f76
								
							
						
					
					
						commit
						8a34e979f6
					
				
					 1 changed files with 29 additions and 59 deletions
				
			
		| 
						 | 
					@ -132,6 +132,19 @@ static bool have_full_constraints(void)
 | 
				
			||||||
	return has_full_constraints || of_have_populated_dt();
 | 
						return has_full_constraints || of_have_populated_dt();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static bool regulator_ops_is_valid(struct regulator_dev *rdev, int ops)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (!rdev->constraints) {
 | 
				
			||||||
 | 
							rdev_err(rdev, "no constraints\n");
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (rdev->constraints->valid_ops_mask & ops)
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline struct regulator_dev *rdev_get_supply(struct regulator_dev *rdev)
 | 
					static inline struct regulator_dev *rdev_get_supply(struct regulator_dev *rdev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (rdev && rdev->supply)
 | 
						if (rdev && rdev->supply)
 | 
				
			||||||
| 
						 | 
					@ -198,28 +211,13 @@ static struct device_node *of_get_regulator(struct device *dev, const char *supp
 | 
				
			||||||
	return regnode;
 | 
						return regnode;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int _regulator_can_change_status(struct regulator_dev *rdev)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	if (!rdev->constraints)
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_STATUS)
 | 
					 | 
				
			||||||
		return 1;
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Platform voltage constraint check */
 | 
					/* Platform voltage constraint check */
 | 
				
			||||||
static int regulator_check_voltage(struct regulator_dev *rdev,
 | 
					static int regulator_check_voltage(struct regulator_dev *rdev,
 | 
				
			||||||
				   int *min_uV, int *max_uV)
 | 
									   int *min_uV, int *max_uV)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	BUG_ON(*min_uV > *max_uV);
 | 
						BUG_ON(*min_uV > *max_uV);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!rdev->constraints) {
 | 
						if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_VOLTAGE)) {
 | 
				
			||||||
		rdev_err(rdev, "no constraints\n");
 | 
					 | 
				
			||||||
		return -ENODEV;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_VOLTAGE)) {
 | 
					 | 
				
			||||||
		rdev_err(rdev, "voltage operation not allowed\n");
 | 
							rdev_err(rdev, "voltage operation not allowed\n");
 | 
				
			||||||
		return -EPERM;
 | 
							return -EPERM;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -275,11 +273,7 @@ static int regulator_check_current_limit(struct regulator_dev *rdev,
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	BUG_ON(*min_uA > *max_uA);
 | 
						BUG_ON(*min_uA > *max_uA);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!rdev->constraints) {
 | 
						if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_CURRENT)) {
 | 
				
			||||||
		rdev_err(rdev, "no constraints\n");
 | 
					 | 
				
			||||||
		return -ENODEV;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_CURRENT)) {
 | 
					 | 
				
			||||||
		rdev_err(rdev, "current operation not allowed\n");
 | 
							rdev_err(rdev, "current operation not allowed\n");
 | 
				
			||||||
		return -EPERM;
 | 
							return -EPERM;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -312,11 +306,7 @@ static int regulator_mode_constrain(struct regulator_dev *rdev, int *mode)
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!rdev->constraints) {
 | 
						if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_MODE)) {
 | 
				
			||||||
		rdev_err(rdev, "no constraints\n");
 | 
					 | 
				
			||||||
		return -ENODEV;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_MODE)) {
 | 
					 | 
				
			||||||
		rdev_err(rdev, "mode operation not allowed\n");
 | 
							rdev_err(rdev, "mode operation not allowed\n");
 | 
				
			||||||
		return -EPERM;
 | 
							return -EPERM;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -333,20 +323,6 @@ static int regulator_mode_constrain(struct regulator_dev *rdev, int *mode)
 | 
				
			||||||
	return -EINVAL;
 | 
						return -EINVAL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* dynamic regulator mode switching constraint check */
 | 
					 | 
				
			||||||
static int regulator_check_drms(struct regulator_dev *rdev)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	if (!rdev->constraints) {
 | 
					 | 
				
			||||||
		rdev_err(rdev, "no constraints\n");
 | 
					 | 
				
			||||||
		return -ENODEV;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_DRMS)) {
 | 
					 | 
				
			||||||
		rdev_dbg(rdev, "drms operation not allowed\n");
 | 
					 | 
				
			||||||
		return -EPERM;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static ssize_t regulator_uV_show(struct device *dev,
 | 
					static ssize_t regulator_uV_show(struct device *dev,
 | 
				
			||||||
				struct device_attribute *attr, char *buf)
 | 
									struct device_attribute *attr, char *buf)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -692,8 +668,7 @@ static int drms_uA_update(struct regulator_dev *rdev)
 | 
				
			||||||
	 * first check to see if we can set modes at all, otherwise just
 | 
						 * first check to see if we can set modes at all, otherwise just
 | 
				
			||||||
	 * tell the consumer everything is OK.
 | 
						 * tell the consumer everything is OK.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	err = regulator_check_drms(rdev);
 | 
						if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_DRMS))
 | 
				
			||||||
	if (err < 0)
 | 
					 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!rdev->desc->ops->get_optimum_mode &&
 | 
						if (!rdev->desc->ops->get_optimum_mode &&
 | 
				
			||||||
| 
						 | 
					@ -893,7 +868,7 @@ static void print_constraints(struct regulator_dev *rdev)
 | 
				
			||||||
	rdev_dbg(rdev, "%s\n", buf);
 | 
						rdev_dbg(rdev, "%s\n", buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((constraints->min_uV != constraints->max_uV) &&
 | 
						if ((constraints->min_uV != constraints->max_uV) &&
 | 
				
			||||||
	    !(constraints->valid_ops_mask & REGULATOR_CHANGE_VOLTAGE))
 | 
						    !regulator_ops_is_valid(rdev, REGULATOR_CHANGE_VOLTAGE))
 | 
				
			||||||
		rdev_warn(rdev,
 | 
							rdev_warn(rdev,
 | 
				
			||||||
			  "Voltage range but no REGULATOR_CHANGE_VOLTAGE\n");
 | 
								  "Voltage range but no REGULATOR_CHANGE_VOLTAGE\n");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1354,7 +1329,7 @@ static struct regulator *create_regulator(struct regulator_dev *rdev,
 | 
				
			||||||
	 * it is then we don't need to do nearly so much work for
 | 
						 * it is then we don't need to do nearly so much work for
 | 
				
			||||||
	 * enable/disable calls.
 | 
						 * enable/disable calls.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	if (!_regulator_can_change_status(rdev) &&
 | 
						if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_STATUS) &&
 | 
				
			||||||
	    _regulator_is_enabled(rdev))
 | 
						    _regulator_is_enabled(rdev))
 | 
				
			||||||
		regulator->always_on = true;
 | 
							regulator->always_on = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2131,15 +2106,15 @@ static int _regulator_enable(struct regulator_dev *rdev)
 | 
				
			||||||
	lockdep_assert_held_once(&rdev->mutex);
 | 
						lockdep_assert_held_once(&rdev->mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* check voltage and requested load before enabling */
 | 
						/* check voltage and requested load before enabling */
 | 
				
			||||||
	if (rdev->constraints &&
 | 
						if (regulator_ops_is_valid(rdev, REGULATOR_CHANGE_DRMS))
 | 
				
			||||||
	    (rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_DRMS))
 | 
					 | 
				
			||||||
		drms_uA_update(rdev);
 | 
							drms_uA_update(rdev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (rdev->use_count == 0) {
 | 
						if (rdev->use_count == 0) {
 | 
				
			||||||
		/* The regulator may on if it's not switchable or left on */
 | 
							/* The regulator may on if it's not switchable or left on */
 | 
				
			||||||
		ret = _regulator_is_enabled(rdev);
 | 
							ret = _regulator_is_enabled(rdev);
 | 
				
			||||||
		if (ret == -EINVAL || ret == 0) {
 | 
							if (ret == -EINVAL || ret == 0) {
 | 
				
			||||||
			if (!_regulator_can_change_status(rdev))
 | 
								if (!regulator_ops_is_valid(rdev,
 | 
				
			||||||
 | 
										REGULATOR_CHANGE_STATUS))
 | 
				
			||||||
				return -EPERM;
 | 
									return -EPERM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			ret = _regulator_do_enable(rdev);
 | 
								ret = _regulator_do_enable(rdev);
 | 
				
			||||||
| 
						 | 
					@ -2241,7 +2216,7 @@ static int _regulator_disable(struct regulator_dev *rdev)
 | 
				
			||||||
	    (rdev->constraints && !rdev->constraints->always_on)) {
 | 
						    (rdev->constraints && !rdev->constraints->always_on)) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* we are last user */
 | 
							/* we are last user */
 | 
				
			||||||
		if (_regulator_can_change_status(rdev)) {
 | 
							if (regulator_ops_is_valid(rdev, REGULATOR_CHANGE_STATUS)) {
 | 
				
			||||||
			ret = _notifier_call_chain(rdev,
 | 
								ret = _notifier_call_chain(rdev,
 | 
				
			||||||
						   REGULATOR_EVENT_PRE_DISABLE,
 | 
											   REGULATOR_EVENT_PRE_DISABLE,
 | 
				
			||||||
						   NULL);
 | 
											   NULL);
 | 
				
			||||||
| 
						 | 
					@ -2262,10 +2237,7 @@ static int _regulator_disable(struct regulator_dev *rdev)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		rdev->use_count = 0;
 | 
							rdev->use_count = 0;
 | 
				
			||||||
	} else if (rdev->use_count > 1) {
 | 
						} else if (rdev->use_count > 1) {
 | 
				
			||||||
 | 
							if (regulator_ops_is_valid(rdev, REGULATOR_CHANGE_DRMS))
 | 
				
			||||||
		if (rdev->constraints &&
 | 
					 | 
				
			||||||
			(rdev->constraints->valid_ops_mask &
 | 
					 | 
				
			||||||
			REGULATOR_CHANGE_DRMS))
 | 
					 | 
				
			||||||
			drms_uA_update(rdev);
 | 
								drms_uA_update(rdev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		rdev->use_count--;
 | 
							rdev->use_count--;
 | 
				
			||||||
| 
						 | 
					@ -2509,8 +2481,7 @@ int regulator_can_change_voltage(struct regulator *regulator)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct regulator_dev	*rdev = regulator->rdev;
 | 
						struct regulator_dev	*rdev = regulator->rdev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (rdev->constraints &&
 | 
						if (regulator_ops_is_valid(rdev, REGULATOR_CHANGE_VOLTAGE)) {
 | 
				
			||||||
	    (rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_VOLTAGE)) {
 | 
					 | 
				
			||||||
		if (rdev->desc->n_voltages - rdev->desc->linear_min_sel > 1)
 | 
							if (rdev->desc->n_voltages - rdev->desc->linear_min_sel > 1)
 | 
				
			||||||
			return 1;
 | 
								return 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2664,7 +2635,7 @@ int regulator_is_supported_voltage(struct regulator *regulator,
 | 
				
			||||||
	int i, voltages, ret;
 | 
						int i, voltages, ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* If we can't change voltage check the current voltage */
 | 
						/* If we can't change voltage check the current voltage */
 | 
				
			||||||
	if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_VOLTAGE)) {
 | 
						if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_VOLTAGE)) {
 | 
				
			||||||
		ret = regulator_get_voltage(regulator);
 | 
							ret = regulator_get_voltage(regulator);
 | 
				
			||||||
		if (ret >= 0)
 | 
							if (ret >= 0)
 | 
				
			||||||
			return min_uV <= ret && ret <= max_uV;
 | 
								return min_uV <= ret && ret <= max_uV;
 | 
				
			||||||
| 
						 | 
					@ -2870,7 +2841,7 @@ static int regulator_set_voltage_unlocked(struct regulator *regulator,
 | 
				
			||||||
	 * return successfully even though the regulator does not support
 | 
						 * return successfully even though the regulator does not support
 | 
				
			||||||
	 * changing the voltage.
 | 
						 * changing the voltage.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	if (!(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_VOLTAGE)) {
 | 
						if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_VOLTAGE)) {
 | 
				
			||||||
		current_uV = _regulator_get_voltage(rdev);
 | 
							current_uV = _regulator_get_voltage(rdev);
 | 
				
			||||||
		if (min_uV <= current_uV && current_uV <= max_uV) {
 | 
							if (min_uV <= current_uV && current_uV <= max_uV) {
 | 
				
			||||||
			regulator->min_uV = min_uV;
 | 
								regulator->min_uV = min_uV;
 | 
				
			||||||
| 
						 | 
					@ -3385,8 +3356,7 @@ int regulator_allow_bypass(struct regulator *regulator, bool enable)
 | 
				
			||||||
	if (!rdev->desc->ops->set_bypass)
 | 
						if (!rdev->desc->ops->set_bypass)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (rdev->constraints &&
 | 
						if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_BYPASS))
 | 
				
			||||||
	    !(rdev->constraints->valid_ops_mask & REGULATOR_CHANGE_BYPASS))
 | 
					 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mutex_lock(&rdev->mutex);
 | 
						mutex_lock(&rdev->mutex);
 | 
				
			||||||
| 
						 | 
					@ -4406,7 +4376,7 @@ static int __init regulator_late_cleanup(struct device *dev, void *data)
 | 
				
			||||||
	if (c && c->always_on)
 | 
						if (c && c->always_on)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (c && !(c->valid_ops_mask & REGULATOR_CHANGE_STATUS))
 | 
						if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_STATUS))
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mutex_lock(&rdev->mutex);
 | 
						mutex_lock(&rdev->mutex);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue