diff options
Diffstat (limited to 'drivers/regulator/rohm-regulator.c')
| -rw-r--r-- | drivers/regulator/rohm-regulator.c | 23 | 
1 files changed, 21 insertions, 2 deletions
| diff --git a/drivers/regulator/rohm-regulator.c b/drivers/regulator/rohm-regulator.c index 5c558b153d55..6e0d9c08ec1c 100644 --- a/drivers/regulator/rohm-regulator.c +++ b/drivers/regulator/rohm-regulator.c @@ -22,13 +22,26 @@ static int set_dvs_level(const struct regulator_desc *desc,  			return ret;  		return 0;  	} - +	/* If voltage is set to 0 => disable */  	if (uv == 0) {  		if (omask)  			return regmap_update_bits(regmap, oreg, omask, 0);  	} +	/* Some setups don't allow setting own voltage but do allow enabling */ +	if (!mask) { +		if (omask) +			return regmap_update_bits(regmap, oreg, omask, omask); + +		return -EINVAL; +	}  	for (i = 0; i < desc->n_voltages; i++) { -		ret = regulator_desc_list_voltage_linear_range(desc, i); +		/* NOTE to next hacker - Does not support pickable ranges */ +		if (desc->linear_range_selectors) +			return -EINVAL; +		if (desc->n_linear_ranges) +			ret = regulator_desc_list_voltage_linear_range(desc, i); +		else +			ret = regulator_desc_list_voltage_linear(desc, i);  		if (ret < 0)  			continue;  		if (ret == uv) { @@ -82,6 +95,12 @@ int rohm_regulator_set_dvs_levels(const struct rohm_dvs_config *dvs,  				mask = dvs->lpsr_mask;  				omask = dvs->lpsr_on_mask;  				break; +			case ROHM_DVS_LEVEL_SNVS: +				prop = "rohm,dvs-snvs-voltage"; +				reg = dvs->snvs_reg; +				mask = dvs->snvs_mask; +				omask = dvs->snvs_on_mask; +				break;  			default:  				return -EINVAL;  			} | 
