diff options
Diffstat (limited to 'drivers/regulator/max8998.c')
| -rw-r--r-- | drivers/regulator/max8998.c | 133 | 
1 files changed, 33 insertions, 100 deletions
diff --git a/drivers/regulator/max8998.c b/drivers/regulator/max8998.c index 18bb58b9b96..5dfa920ff0c 100644 --- a/drivers/regulator/max8998.c +++ b/drivers/regulator/max8998.c @@ -111,27 +111,6 @@ static const struct voltage_map_desc *ldo_voltage_map[] = {  	&buck4_voltage_map_desc,	/* BUCK4 */  }; -static int max8998_list_voltage(struct regulator_dev *rdev, -				unsigned int selector) -{ -	const struct voltage_map_desc *desc; -	int ldo = rdev_get_id(rdev); -	int val; - -	if (ldo >= ARRAY_SIZE(ldo_voltage_map)) -		return -EINVAL; - -	desc = ldo_voltage_map[ldo]; -	if (desc == NULL) -		return -EINVAL; - -	val = desc->min + desc->step * selector; -	if (val > desc->max) -		return -EINVAL; - -	return val * 1000; -} -  static int max8998_get_enable_register(struct regulator_dev *rdev,  					int *reg, int *shift)  { @@ -297,41 +276,18 @@ static int max8998_get_voltage_sel(struct regulator_dev *rdev)  	return val;  } -static int max8998_set_voltage_ldo(struct regulator_dev *rdev, -				   int min_uV, int max_uV, unsigned *selector) +static int max8998_set_voltage_ldo_sel(struct regulator_dev *rdev, +				       unsigned selector)  {  	struct max8998_data *max8998 = rdev_get_drvdata(rdev);  	struct i2c_client *i2c = max8998->iodev->i2c; -	int min_vol = min_uV / 1000, max_vol = max_uV / 1000; -	const struct voltage_map_desc *desc; -	int ldo = rdev_get_id(rdev); -	int reg, shift = 0, mask, ret, i; - -	if (ldo >= ARRAY_SIZE(ldo_voltage_map)) -		return -EINVAL; - -	desc = ldo_voltage_map[ldo]; -	if (desc == NULL) -		return -EINVAL; - -	if (max_vol < desc->min || min_vol > desc->max) -		return -EINVAL; - -	if (min_vol < desc->min) -		min_vol = desc->min; - -	i = DIV_ROUND_UP(min_vol - desc->min, desc->step); - -	if (desc->min + desc->step*i > max_vol) -		return -EINVAL; - -	*selector = i; +	int reg, shift = 0, mask, ret;  	ret = max8998_get_voltage_register(rdev, ®, &shift, &mask);  	if (ret)  		return ret; -	ret = max8998_update_reg(i2c, reg, i<<shift, mask<<shift); +	ret = max8998_update_reg(i2c, reg, selector<<shift, mask<<shift);  	return ret;  } @@ -347,41 +303,18 @@ static inline void buck2_gpio_set(int gpio, int v)  	gpio_set_value(gpio, v & 0x1);  } -static int max8998_set_voltage_buck(struct regulator_dev *rdev, -				    int min_uV, int max_uV, unsigned *selector) +static int max8998_set_voltage_buck_sel(struct regulator_dev *rdev, +					unsigned selector)  {  	struct max8998_data *max8998 = rdev_get_drvdata(rdev);  	struct max8998_platform_data *pdata =  		dev_get_platdata(max8998->iodev->dev);  	struct i2c_client *i2c = max8998->iodev->i2c; -	int min_vol = min_uV / 1000, max_vol = max_uV / 1000; -	const struct voltage_map_desc *desc;  	int buck = rdev_get_id(rdev);  	int reg, shift = 0, mask, ret; -	int i, j, previous_sel; +	int j, previous_sel;  	static u8 buck1_last_val; -	if (buck >= ARRAY_SIZE(ldo_voltage_map)) -		return -EINVAL; - -	desc = ldo_voltage_map[buck]; - -	if (desc == NULL) -		return -EINVAL; - -	if (max_vol < desc->min || min_vol > desc->max) -		return -EINVAL; - -	if (min_vol < desc->min) -		min_vol = desc->min; - -	i = DIV_ROUND_UP(min_vol - desc->min, desc->step); - -	if (desc->min + desc->step*i > max_vol) -		return -EINVAL; - -	*selector = i; -  	ret = max8998_get_voltage_register(rdev, ®, &shift, &mask);  	if (ret)  		return ret; @@ -390,19 +323,19 @@ static int max8998_set_voltage_buck(struct regulator_dev *rdev,  	/* Check if voltage needs to be changed */  	/* if previous_voltage equal new voltage, return */ -	if (previous_sel == i) { +	if (previous_sel == selector) {  		dev_dbg(max8998->dev, "No voltage change, old:%d, new:%d\n", -			max8998_list_voltage(rdev, previous_sel), -			max8998_list_voltage(rdev, i)); +			regulator_list_voltage_linear(rdev, previous_sel), +			regulator_list_voltage_linear(rdev, selector));  		return ret;  	}  	switch (buck) {  	case MAX8998_BUCK1:  		dev_dbg(max8998->dev, -			"BUCK1, i:%d, buck1_vol1:%d, buck1_vol2:%d\n" +			"BUCK1, selector:%d, buck1_vol1:%d, buck1_vol2:%d\n"  			"buck1_vol3:%d, buck1_vol4:%d\n", -			i, max8998->buck1_vol[0], max8998->buck1_vol[1], +			selector, max8998->buck1_vol[0], max8998->buck1_vol[1],  			max8998->buck1_vol[2], max8998->buck1_vol[3]);  		if (gpio_is_valid(pdata->buck1_set1) && @@ -411,7 +344,7 @@ static int max8998_set_voltage_buck(struct regulator_dev *rdev,  			/* check if requested voltage */  			/* value is already defined */  			for (j = 0; j < ARRAY_SIZE(max8998->buck1_vol); j++) { -				if (max8998->buck1_vol[j] == i) { +				if (max8998->buck1_vol[j] == selector) {  					max8998->buck1_idx = j;  					buck1_gpio_set(pdata->buck1_set1,  						       pdata->buck1_set2, j); @@ -426,11 +359,11 @@ static int max8998_set_voltage_buck(struct regulator_dev *rdev,  			max8998->buck1_idx = (buck1_last_val % 2) + 2;  			dev_dbg(max8998->dev, "max8998->buck1_idx:%d\n",  				max8998->buck1_idx); -			max8998->buck1_vol[max8998->buck1_idx] = i; +			max8998->buck1_vol[max8998->buck1_idx] = selector;  			ret = max8998_get_voltage_register(rdev, ®,  							   &shift,  							   &mask); -			ret = max8998_write_reg(i2c, reg, i); +			ret = max8998_write_reg(i2c, reg, selector);  			buck1_gpio_set(pdata->buck1_set1,  				       pdata->buck1_set2, max8998->buck1_idx);  			buck1_last_val++; @@ -440,20 +373,20 @@ buck1_exit:  				gpio_get_value(pdata->buck1_set2));  			break;  		} else { -			ret = max8998_write_reg(i2c, reg, i); +			ret = max8998_write_reg(i2c, reg, selector);  		}  		break;  	case MAX8998_BUCK2:  		dev_dbg(max8998->dev, -			"BUCK2, i:%d buck2_vol1:%d, buck2_vol2:%d\n" -			, i, max8998->buck2_vol[0], max8998->buck2_vol[1]); +			"BUCK2, selector:%d buck2_vol1:%d, buck2_vol2:%d\n", +			selector, max8998->buck2_vol[0], max8998->buck2_vol[1]);  		if (gpio_is_valid(pdata->buck2_set3)) {  			/* check if requested voltage */  			/* value is already defined */  			for (j = 0; j < ARRAY_SIZE(max8998->buck2_vol); j++) { -				if (max8998->buck2_vol[j] == i) { +				if (max8998->buck2_vol[j] == selector) {  					max8998->buck2_idx = j;  					buck2_gpio_set(pdata->buck2_set3, j);  					goto buck2_exit; @@ -465,20 +398,21 @@ buck1_exit:  			max8998_get_voltage_register(rdev,  					®, &shift, &mask); -			ret = max8998_write_reg(i2c, reg, i); -			max8998->buck2_vol[max8998->buck2_idx] = i; +			ret = max8998_write_reg(i2c, reg, selector); +			max8998->buck2_vol[max8998->buck2_idx] = selector;  			buck2_gpio_set(pdata->buck2_set3, max8998->buck2_idx);  buck2_exit:  			dev_dbg(max8998->dev, "%s: SET3:%d\n", i2c->name,  				gpio_get_value(pdata->buck2_set3));  		} else { -			ret = max8998_write_reg(i2c, reg, i); +			ret = max8998_write_reg(i2c, reg, selector);  		}  		break;  	case MAX8998_BUCK3:  	case MAX8998_BUCK4: -		ret = max8998_update_reg(i2c, reg, i<<shift, mask<<shift); +		ret = max8998_update_reg(i2c, reg, selector<<shift, +					 mask<<shift);  		break;  	} @@ -519,34 +453,30 @@ static int max8998_set_voltage_buck_time_sel(struct regulator_dev *rdev,  }  static struct regulator_ops max8998_ldo_ops = { -	.list_voltage		= max8998_list_voltage, +	.list_voltage		= regulator_list_voltage_linear, +	.map_voltage		= regulator_map_voltage_linear,  	.is_enabled		= max8998_ldo_is_enabled,  	.enable			= max8998_ldo_enable,  	.disable		= max8998_ldo_disable,  	.get_voltage_sel	= max8998_get_voltage_sel, -	.set_voltage		= max8998_set_voltage_ldo, -	.set_suspend_enable	= max8998_ldo_enable, -	.set_suspend_disable	= max8998_ldo_disable, +	.set_voltage_sel	= max8998_set_voltage_ldo_sel,  };  static struct regulator_ops max8998_buck_ops = { -	.list_voltage		= max8998_list_voltage, +	.list_voltage		= regulator_list_voltage_linear, +	.map_voltage		= regulator_map_voltage_linear,  	.is_enabled		= max8998_ldo_is_enabled,  	.enable			= max8998_ldo_enable,  	.disable		= max8998_ldo_disable,  	.get_voltage_sel	= max8998_get_voltage_sel, -	.set_voltage		= max8998_set_voltage_buck, +	.set_voltage_sel	= max8998_set_voltage_buck_sel,  	.set_voltage_time_sel	= max8998_set_voltage_buck_time_sel, -	.set_suspend_enable	= max8998_ldo_enable, -	.set_suspend_disable	= max8998_ldo_disable,  };  static struct regulator_ops max8998_others_ops = {  	.is_enabled		= max8998_ldo_is_enabled,  	.enable			= max8998_ldo_enable,  	.disable		= max8998_ldo_disable, -	.set_suspend_enable	= max8998_ldo_enable, -	.set_suspend_disable	= max8998_ldo_disable,  };  static struct regulator_desc regulators[] = { @@ -860,7 +790,10 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)  		desc = ldo_voltage_map[id];  		if (desc && regulators[index].ops != &max8998_others_ops) {  			int count = (desc->max - desc->min) / desc->step + 1; +  			regulators[index].n_voltages = count; +			regulators[index].min_uV = desc->min * 1000; +			regulators[index].uV_step = desc->step * 1000;  		}  		config.dev = max8998->dev;  |