diff options
Diffstat (limited to 'drivers/regulator/helpers.c')
| -rw-r--r-- | drivers/regulator/helpers.c | 54 | 
1 files changed, 37 insertions, 17 deletions
diff --git a/drivers/regulator/helpers.c b/drivers/regulator/helpers.c index 6e30df14714..cbc39096c78 100644 --- a/drivers/regulator/helpers.c +++ b/drivers/regulator/helpers.c @@ -37,10 +37,17 @@ int regulator_is_enabled_regmap(struct regulator_dev *rdev)  	if (ret != 0)  		return ret; -	if (rdev->desc->enable_is_inverted) -		return (val & rdev->desc->enable_mask) == 0; -	else -		return (val & rdev->desc->enable_mask) != 0; +	val &= rdev->desc->enable_mask; + +	if (rdev->desc->enable_is_inverted) { +		if (rdev->desc->enable_val) +			return val != rdev->desc->enable_val; +		return val == 0; +	} else { +		if (rdev->desc->enable_val) +			return val == rdev->desc->enable_val; +		return val != 0; +	}  }  EXPORT_SYMBOL_GPL(regulator_is_enabled_regmap); @@ -57,10 +64,13 @@ int regulator_enable_regmap(struct regulator_dev *rdev)  {  	unsigned int val; -	if (rdev->desc->enable_is_inverted) -		val = 0; -	else -		val = rdev->desc->enable_mask; +	if (rdev->desc->enable_is_inverted) { +		val = rdev->desc->disable_val; +	} else { +		val = rdev->desc->enable_val; +		if (!val) +			val = rdev->desc->enable_mask; +	}  	return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,  				  rdev->desc->enable_mask, val); @@ -80,10 +90,13 @@ int regulator_disable_regmap(struct regulator_dev *rdev)  {  	unsigned int val; -	if (rdev->desc->enable_is_inverted) -		val = rdev->desc->enable_mask; -	else -		val = 0; +	if (rdev->desc->enable_is_inverted) { +		val = rdev->desc->enable_val; +		if (!val) +			val = rdev->desc->enable_mask; +	} else { +		val = rdev->desc->disable_val; +	}  	return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,  				  rdev->desc->enable_mask, val); @@ -284,9 +297,13 @@ int regulator_map_voltage_linear_range(struct regulator_dev *rdev,  	}  	for (i = 0; i < rdev->desc->n_linear_ranges; i++) { +		int linear_max_uV; +  		range = &rdev->desc->linear_ranges[i]; +		linear_max_uV = range->min_uV + +			(range->max_sel - range->min_sel) * range->uV_step; -		if (!(min_uV <= range->max_uV && max_uV >= range->min_uV)) +		if (!(min_uV <= linear_max_uV && max_uV >= range->min_uV))  			continue;  		if (min_uV <= range->min_uV) @@ -415,10 +432,13 @@ int regulator_set_bypass_regmap(struct regulator_dev *rdev, bool enable)  {  	unsigned int val; -	if (enable) -		val = rdev->desc->bypass_mask; -	else -		val = 0; +	if (enable) { +		val = rdev->desc->bypass_val_on; +		if (!val) +			val = rdev->desc->bypass_mask; +	} else { +		val = rdev->desc->bypass_val_off; +	}  	return regmap_update_bits(rdev->regmap, rdev->desc->bypass_reg,  				  rdev->desc->bypass_mask, val);  | 
