Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

regulator: Report actual configured voltage to set_voltage()

Change the interface used by set_voltage() to report the selected value
to the regulator core in terms of a selector used by list_voltage().
This allows the regulator core to know the voltage that was chosen
without having to do an explict get_voltage(), which would be much more
expensive as it will generally access hardware.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>

authored by

Mark Brown and committed by
Liam Girdwood
3a93f2a9 63cee946

+202 -79
+2 -1
drivers/regulator/88pm8607.c
··· 249 249 } 250 250 251 251 static int pm8607_set_voltage(struct regulator_dev *rdev, 252 - int min_uV, int max_uV) 252 + int min_uV, int max_uV, unsigned *selector) 253 253 { 254 254 struct pm8607_regulator_info *info = rdev_get_drvdata(rdev); 255 255 uint8_t val, mask; ··· 263 263 ret = choose_voltage(rdev, min_uV, max_uV); 264 264 if (ret < 0) 265 265 return -EINVAL; 266 + *selector = ret; 266 267 val = (uint8_t)(ret << info->vol_shift); 267 268 mask = ((1 << info->vol_nbits) - 1) << info->vol_shift; 268 269
+4 -1
drivers/regulator/ab3100.c
··· 362 362 } 363 363 364 364 static int ab3100_set_voltage_regulator(struct regulator_dev *reg, 365 - int min_uV, int max_uV) 365 + int min_uV, int max_uV, 366 + unsigned *selector) 366 367 { 367 368 struct ab3100_regulator *abreg = reg->reg_data; 368 369 u8 regval; ··· 373 372 bestindex = ab3100_get_best_voltage_index(reg, min_uV, max_uV); 374 373 if (bestindex < 0) 375 374 return bestindex; 375 + 376 + *selector = bestindex; 376 377 377 378 err = abx500_get_register_interruptible(abreg->dev, 0, 378 379 abreg->regreg, &regval);
+4 -1
drivers/regulator/ab8500.c
··· 215 215 } 216 216 217 217 static int ab8500_regulator_set_voltage(struct regulator_dev *rdev, 218 - int min_uV, int max_uV) 218 + int min_uV, int max_uV, 219 + unsigned *selector) 219 220 { 220 221 int regulator_id, ret; 221 222 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev); ··· 232 231 "couldn't get best voltage for regulator\n"); 233 232 return ret; 234 233 } 234 + 235 + *selector = ret; 235 236 236 237 /* set the registers for the request */ 237 238 ret = abx500_mask_and_set_register_interruptible(info->dev,
+12 -2
drivers/regulator/core.c
··· 723 723 struct regulator_ops *ops = rdev->desc->ops; 724 724 const char *name = rdev_get_name(rdev); 725 725 int ret; 726 + unsigned selector; 726 727 727 728 /* do we need to apply the constraint voltage */ 728 729 if (rdev->constraints->apply_uV && 729 730 rdev->constraints->min_uV == rdev->constraints->max_uV && 730 731 ops->set_voltage) { 731 732 ret = ops->set_voltage(rdev, 732 - rdev->constraints->min_uV, rdev->constraints->max_uV); 733 + rdev->constraints->min_uV, 734 + rdev->constraints->max_uV, 735 + &selector); 733 736 if (ret < 0) { 734 737 printk(KERN_ERR "%s: failed to apply %duV constraint to %s\n", 735 738 __func__, ··· 1628 1625 { 1629 1626 struct regulator_dev *rdev = regulator->rdev; 1630 1627 int ret; 1628 + unsigned selector; 1631 1629 1632 1630 mutex_lock(&rdev->mutex); 1633 1631 ··· 1644 1640 goto out; 1645 1641 regulator->min_uV = min_uV; 1646 1642 regulator->max_uV = max_uV; 1647 - ret = rdev->desc->ops->set_voltage(rdev, min_uV, max_uV); 1643 + 1644 + ret = rdev->desc->ops->set_voltage(rdev, min_uV, max_uV, &selector); 1645 + 1646 + if (rdev->desc->ops->list_voltage) 1647 + selector = rdev->desc->ops->list_voltage(rdev, selector); 1648 + else 1649 + selector = -1; 1648 1650 1649 1651 out: 1650 1652 _notifier_call_chain(rdev, REGULATOR_EVENT_VOLTAGE_CHANGE, NULL);
+12 -5
drivers/regulator/da903x.c
··· 107 107 108 108 /* DA9030/DA9034 common operations */ 109 109 static int da903x_set_ldo_voltage(struct regulator_dev *rdev, 110 - int min_uV, int max_uV) 110 + int min_uV, int max_uV, unsigned *selector) 111 111 { 112 112 struct da903x_regulator_info *info = rdev_get_drvdata(rdev); 113 113 struct device *da9034_dev = to_da903x_dev(rdev); ··· 119 119 } 120 120 121 121 val = (min_uV - info->min_uV + info->step_uV - 1) / info->step_uV; 122 + *selector = val; 122 123 val <<= info->vol_shift; 123 124 mask = ((1 << info->vol_nbits) - 1) << info->vol_shift; 124 125 ··· 188 187 189 188 /* DA9030 specific operations */ 190 189 static int da9030_set_ldo1_15_voltage(struct regulator_dev *rdev, 191 - int min_uV, int max_uV) 190 + int min_uV, int max_uV, 191 + unsigned *selector) 192 192 { 193 193 struct da903x_regulator_info *info = rdev_get_drvdata(rdev); 194 194 struct device *da903x_dev = to_da903x_dev(rdev); ··· 202 200 } 203 201 204 202 val = (min_uV - info->min_uV + info->step_uV - 1) / info->step_uV; 203 + *selector = val; 205 204 val <<= info->vol_shift; 206 205 mask = ((1 << info->vol_nbits) - 1) << info->vol_shift; 207 206 val |= DA9030_LDO_UNLOCK; /* have to set UNLOCK bits */ ··· 217 214 } 218 215 219 216 static int da9030_set_ldo14_voltage(struct regulator_dev *rdev, 220 - int min_uV, int max_uV) 217 + int min_uV, int max_uV, 218 + unsigned *selector) 221 219 { 222 220 struct da903x_regulator_info *info = rdev_get_drvdata(rdev); 223 221 struct device *da903x_dev = to_da903x_dev(rdev); ··· 238 234 val = (min_uV - thresh + info->step_uV - 1) / info->step_uV; 239 235 } 240 236 237 + *selector = val; 241 238 val <<= info->vol_shift; 242 239 mask = ((1 << info->vol_nbits) - 1) << info->vol_shift; 243 240 ··· 268 263 269 264 /* DA9034 specific operations */ 270 265 static int da9034_set_dvc_voltage(struct regulator_dev *rdev, 271 - int min_uV, int max_uV) 266 + int min_uV, int max_uV, unsigned *selector) 272 267 { 273 268 struct da903x_regulator_info *info = rdev_get_drvdata(rdev); 274 269 struct device *da9034_dev = to_da903x_dev(rdev); ··· 281 276 } 282 277 283 278 val = (min_uV - info->min_uV + info->step_uV - 1) / info->step_uV; 279 + *selector = val; 284 280 val <<= info->vol_shift; 285 281 mask = ((1 << info->vol_nbits) - 1) << info->vol_shift; 286 282 ··· 295 289 } 296 290 297 291 static int da9034_set_ldo12_voltage(struct regulator_dev *rdev, 298 - int min_uV, int max_uV) 292 + int min_uV, int max_uV, unsigned *selector) 299 293 { 300 294 struct da903x_regulator_info *info = rdev_get_drvdata(rdev); 301 295 struct device *da9034_dev = to_da903x_dev(rdev); ··· 308 302 309 303 val = (min_uV - info->min_uV + info->step_uV - 1) / info->step_uV; 310 304 val = (val >= 20) ? val - 12 : ((val > 7) ? 8 : val); 305 + *selector = val; 311 306 val <<= info->vol_shift; 312 307 mask = ((1 << info->vol_nbits) - 1) << info->vol_shift; 313 308
+5 -1
drivers/regulator/isl6271a-regulator.c
··· 58 58 return data; 59 59 } 60 60 61 - static int isl6271a_set_voltage(struct regulator_dev *dev, int minuV, int maxuV) 61 + static int isl6271a_set_voltage(struct regulator_dev *dev, 62 + int minuV, int maxuV, 63 + unsigned *selector) 62 64 { 63 65 struct isl_pmic *pmic = rdev_get_drvdata(dev); 64 66 int vsel, err, data; ··· 79 77 80 78 /* Convert the microvolts to data for the chip */ 81 79 data = (vsel - ISL6271A_VOLTAGE_MIN) / ISL6271A_VOLTAGE_STEP; 80 + 81 + *selector = data; 82 82 83 83 mutex_lock(&pmic->mtx); 84 84
+8 -2
drivers/regulator/lp3971.c
··· 168 168 } 169 169 170 170 static int lp3971_ldo_set_voltage(struct regulator_dev *dev, 171 - int min_uV, int max_uV) 171 + int min_uV, int max_uV, 172 + unsigned int *selector) 172 173 { 173 174 struct lp3971 *lp3971 = rdev_get_drvdata(dev); 174 175 int ldo = rdev_get_id(dev) - LP3971_LDO1; ··· 187 186 188 187 if (val > LDO_VOL_MAX_IDX || vol_map[val] > max_vol) 189 188 return -EINVAL; 189 + 190 + *selector = val; 190 191 191 192 return lp3971_set_bits(lp3971, LP3971_LDO_VOL_CONTR_REG(ldo), 192 193 LDO_VOL_CONTR_MASK << LDO_VOL_CONTR_SHIFT(ldo), ··· 259 256 } 260 257 261 258 static int lp3971_dcdc_set_voltage(struct regulator_dev *dev, 262 - int min_uV, int max_uV) 259 + int min_uV, int max_uV, 260 + unsigned int *selector) 263 261 { 264 262 struct lp3971 *lp3971 = rdev_get_drvdata(dev); 265 263 int buck = rdev_get_id(dev) - LP3971_DCDC1; ··· 280 276 281 277 if (val > BUCK_TARGET_VOL_MAX_IDX || vol_map[val] > max_vol) 282 278 return -EINVAL; 279 + 280 + *selector = val; 283 281 284 282 ret = lp3971_set_bits(lp3971, LP3971_BUCK_TARGET_VOL1_REG(buck), 285 283 BUCK_TARGET_VOL_MASK, val);
+8 -2
drivers/regulator/lp3972.c
··· 292 292 } 293 293 294 294 static int lp3972_ldo_set_voltage(struct regulator_dev *dev, 295 - int min_uV, int max_uV) 295 + int min_uV, int max_uV, 296 + unsigned int *selector) 296 297 { 297 298 struct lp3972 *lp3972 = rdev_get_drvdata(dev); 298 299 int ldo = rdev_get_id(dev) - LP3972_LDO1; ··· 313 312 314 313 if (val > LP3972_LDO_VOL_MAX_IDX(ldo) || vol_map[val] > max_vol) 315 314 return -EINVAL; 315 + 316 + *selector = val; 316 317 317 318 shift = LP3972_LDO_VOL_CONTR_SHIFT(ldo); 318 319 ret = lp3972_set_bits(lp3972, LP3972_LDO_VOL_CONTR_REG(ldo), ··· 419 416 } 420 417 421 418 static int lp3972_dcdc_set_voltage(struct regulator_dev *dev, 422 - int min_uV, int max_uV) 419 + int min_uV, int max_uV, 420 + unsigned int *selector) 423 421 { 424 422 struct lp3972 *lp3972 = rdev_get_drvdata(dev); 425 423 int buck = rdev_get_id(dev) - LP3972_DCDC1; ··· 441 437 if (val > LP3972_BUCK_VOL_MAX_IDX(buck) || 442 438 vol_map[val] > max_vol) 443 439 return -EINVAL; 440 + 441 + *selector = val; 444 442 445 443 ret = lp3972_set_bits(lp3972, LP3972_BUCK_VOL1_REG(buck), 446 444 LP3972_BUCK_VOL_MASK, val);
+15 -15
drivers/regulator/max1586.c
··· 63 63 return max1586->min_uV + (selector * range_uV / MAX1586_V3_MAX_VSEL); 64 64 } 65 65 66 - static int max1586_v3_set(struct regulator_dev *rdev, int min_uV, int max_uV) 66 + static int max1586_v3_set(struct regulator_dev *rdev, int min_uV, int max_uV, 67 + unsigned *selector) 67 68 { 68 69 struct max1586_data *max1586 = rdev_get_drvdata(rdev); 69 70 struct i2c_client *client = max1586->client; 70 71 unsigned range_uV = max1586->max_uV - max1586->min_uV; 71 - unsigned selector; 72 72 u8 v3_prog; 73 73 74 74 if (min_uV > max1586->max_uV || max_uV < max1586->min_uV) ··· 76 76 if (min_uV < max1586->min_uV) 77 77 min_uV = max1586->min_uV; 78 78 79 - selector = ((min_uV - max1586->min_uV) * MAX1586_V3_MAX_VSEL + 79 + *selector = ((min_uV - max1586->min_uV) * MAX1586_V3_MAX_VSEL + 80 80 range_uV - 1) / range_uV; 81 - if (max1586_v3_calc_voltage(max1586, selector) > max_uV) 81 + if (max1586_v3_calc_voltage(max1586, *selector) > max_uV) 82 82 return -EINVAL; 83 83 84 84 dev_dbg(&client->dev, "changing voltage v3 to %dmv\n", 85 - max1586_v3_calc_voltage(max1586, selector) / 1000); 85 + max1586_v3_calc_voltage(max1586, *selector) / 1000); 86 86 87 - v3_prog = I2C_V3_SELECT | (u8) selector; 87 + v3_prog = I2C_V3_SELECT | (u8) *selector; 88 88 return i2c_smbus_write_byte(client, v3_prog); 89 89 } 90 90 ··· 110 110 return voltages_uv[selector]; 111 111 } 112 112 113 - static int max1586_v6_set(struct regulator_dev *rdev, int min_uV, int max_uV) 113 + static int max1586_v6_set(struct regulator_dev *rdev, int min_uV, int max_uV, 114 + unsigned int *selector) 114 115 { 115 116 struct i2c_client *client = rdev_get_drvdata(rdev); 116 - unsigned selector; 117 117 u8 v6_prog; 118 118 119 119 if (min_uV < MAX1586_V6_MIN_UV || min_uV > MAX1586_V6_MAX_UV) ··· 122 122 return -EINVAL; 123 123 124 124 if (min_uV < 1800000) 125 - selector = 0; 125 + *selector = 0; 126 126 else if (min_uV < 2500000) 127 - selector = 1; 127 + *selector = 1; 128 128 else if (min_uV < 3000000) 129 - selector = 2; 129 + *selector = 2; 130 130 else if (min_uV >= 3000000) 131 - selector = 3; 131 + *selector = 3; 132 132 133 - if (max1586_v6_calc_voltage(selector) > max_uV) 133 + if (max1586_v6_calc_voltage(*selector) > max_uV) 134 134 return -EINVAL; 135 135 136 136 dev_dbg(&client->dev, "changing voltage v6 to %dmv\n", 137 - max1586_v6_calc_voltage(selector) / 1000); 137 + max1586_v6_calc_voltage(*selector) / 1000); 138 138 139 - v6_prog = I2C_V6_SELECT | (u8) selector; 139 + v6_prog = I2C_V6_SELECT | (u8) *selector; 140 140 return i2c_smbus_write_byte(client, v6_prog); 141 141 } 142 142
+2 -1
drivers/regulator/max8649.c
··· 155 155 } 156 156 157 157 static int max8649_set_voltage(struct regulator_dev *rdev, 158 - int min_uV, int max_uV) 158 + int min_uV, int max_uV, unsigned *selector) 159 159 { 160 160 struct max8649_regulator_info *info = rdev_get_drvdata(rdev); 161 161 unsigned char data, mask; ··· 168 168 data = (min_uV - MAX8649_DCDC_VMIN + MAX8649_DCDC_STEP - 1) 169 169 / MAX8649_DCDC_STEP; 170 170 mask = MAX8649_VOL_MASK; 171 + *selector = data & mask; 171 172 172 173 return max8649_set_bits(info->i2c, info->vol_reg, mask, data); 173 174 }
+11 -3
drivers/regulator/max8660.c
··· 141 141 return MAX8660_DCDC_MIN_UV + selector * MAX8660_DCDC_STEP; 142 142 } 143 143 144 - static int max8660_dcdc_set(struct regulator_dev *rdev, int min_uV, int max_uV) 144 + static int max8660_dcdc_set(struct regulator_dev *rdev, int min_uV, int max_uV, 145 + unsigned int *s) 145 146 { 146 147 struct max8660 *max8660 = rdev_get_drvdata(rdev); 147 148 u8 reg, selector, bits; ··· 155 154 156 155 selector = (min_uV - (MAX8660_DCDC_MIN_UV - MAX8660_DCDC_STEP + 1)) 157 156 / MAX8660_DCDC_STEP; 157 + *s = selector; 158 158 159 159 ret = max8660_dcdc_list(rdev, selector); 160 160 if (ret < 0 || ret > max_uV) ··· 198 196 return MAX8660_LDO5_MIN_UV + selector * MAX8660_LDO5_STEP; 199 197 } 200 198 201 - static int max8660_ldo5_set(struct regulator_dev *rdev, int min_uV, int max_uV) 199 + static int max8660_ldo5_set(struct regulator_dev *rdev, int min_uV, int max_uV, 200 + unsigned int *s) 202 201 { 203 202 struct max8660 *max8660 = rdev_get_drvdata(rdev); 204 203 u8 selector; ··· 215 212 ret = max8660_ldo5_list(rdev, selector); 216 213 if (ret < 0 || ret > max_uV) 217 214 return -EINVAL; 215 + 216 + *s = selector; 218 217 219 218 ret = max8660_write(max8660, MAX8660_MDTV2, 0, selector); 220 219 if (ret) ··· 275 270 return MAX8660_LDO67_MIN_UV + selector * MAX8660_LDO67_STEP; 276 271 } 277 272 278 - static int max8660_ldo67_set(struct regulator_dev *rdev, int min_uV, int max_uV) 273 + static int max8660_ldo67_set(struct regulator_dev *rdev, int min_uV, 274 + int max_uV, unsigned int *s) 279 275 { 280 276 struct max8660 *max8660 = rdev_get_drvdata(rdev); 281 277 u8 selector; ··· 293 287 ret = max8660_ldo67_list(rdev, selector); 294 288 if (ret < 0 || ret > max_uV) 295 289 return -EINVAL; 290 + 291 + *s = selector; 296 292 297 293 if (rdev_get_id(rdev) == MAX8660_V6) 298 294 return max8660_write(max8660, MAX8660_L12VCR, 0xf0, selector);
+2 -1
drivers/regulator/max8925-regulator.c
··· 55 55 } 56 56 57 57 static int max8925_set_voltage(struct regulator_dev *rdev, 58 - int min_uV, int max_uV) 58 + int min_uV, int max_uV, unsigned int *selector) 59 59 { 60 60 struct max8925_regulator_info *info = rdev_get_drvdata(rdev); 61 61 unsigned char data, mask; ··· 66 66 return -EINVAL; 67 67 } 68 68 data = (min_uV - info->min_uV + info->step_uV - 1) / info->step_uV; 69 + *selector = data; 69 70 data <<= info->vol_shift; 70 71 mask = ((1 << info->vol_nbits) - 1) << info->vol_shift; 71 72
+2 -1
drivers/regulator/max8952.c
··· 133 133 } 134 134 135 135 static int max8952_set_voltage(struct regulator_dev *rdev, 136 - int min_uV, int max_uV) 136 + int min_uV, int max_uV, unsigned *selector) 137 137 { 138 138 struct max8952_data *max8952 = rdev_get_drvdata(rdev); 139 139 s8 vid = -1, i; ··· 156 156 if (vid >= 0 && vid < MAX8952_NUM_DVS_MODE) { 157 157 max8952->vid0 = (vid % 2 == 1); 158 158 max8952->vid1 = (((vid >> 1) % 2) == 1); 159 + *selector = vid; 159 160 gpio_set_value(max8952->pdata->gpio_vid0, max8952->vid0); 160 161 gpio_set_value(max8952->pdata->gpio_vid1, max8952->vid1); 161 162 } else
+6 -2
drivers/regulator/max8998.c
··· 304 304 } 305 305 306 306 static int max8998_set_voltage_ldo(struct regulator_dev *rdev, 307 - int min_uV, int max_uV) 307 + int min_uV, int max_uV, unsigned *selector) 308 308 { 309 309 struct max8998_data *max8998 = rdev_get_drvdata(rdev); 310 310 struct i2c_client *i2c = max8998->iodev->i2c; ··· 331 331 if (desc->min + desc->step*i > max_vol) 332 332 return -EINVAL; 333 333 334 + *selector = i; 335 + 334 336 ret = max8998_get_voltage_register(rdev, &reg, &shift, &mask); 335 337 if (ret) 336 338 return ret; ··· 354 352 } 355 353 356 354 static int max8998_set_voltage_buck(struct regulator_dev *rdev, 357 - int min_uV, int max_uV) 355 + int min_uV, int max_uV, int *selector) 358 356 { 359 357 struct max8998_data *max8998 = rdev_get_drvdata(rdev); 360 358 struct max8998_platform_data *pdata = ··· 385 383 386 384 if (desc->min + desc->step*i > max_vol) 387 385 return -EINVAL; 386 + 387 + *selector = i; 388 388 389 389 ret = max8998_get_voltage_register(rdev, &reg, &shift, &mask); 390 390 if (ret)
+8 -2
drivers/regulator/mc13783-regulator.c
··· 373 373 } 374 374 375 375 static int mc13783_regulator_set_voltage(struct regulator_dev *rdev, 376 - int min_uV, int max_uV) 376 + int min_uV, int max_uV, 377 + unsigned *selector) 377 378 { 378 379 struct mc13783_regulator_priv *priv = rdev_get_drvdata(rdev); 379 380 int value, id = rdev_get_id(rdev); ··· 388 387 dev_dbg(rdev_get_dev(rdev), "%s best value: %d \n", __func__, value); 389 388 if (value < 0) 390 389 return value; 390 + 391 + *selector = value; 391 392 392 393 mc13783_lock(priv->mc13783); 393 394 ret = mc13783_reg_rmw(priv->mc13783, mc13783_regulators[id].vsel_reg, ··· 436 433 }; 437 434 438 435 static int mc13783_fixed_regulator_set_voltage(struct regulator_dev *rdev, 439 - int min_uV, int max_uV) 436 + int min_uV, int max_uV, 437 + unsigned int *selector) 440 438 { 441 439 int id = rdev_get_id(rdev); 442 440 443 441 dev_dbg(rdev_get_dev(rdev), "%s id: %d min_uV: %d max_uV: %d\n", 444 442 __func__, id, min_uV, max_uV); 443 + 444 + *selector = 0; 445 445 446 446 if (min_uV >= mc13783_regulators[id].voltages[0] && 447 447 max_uV <= mc13783_regulators[id].voltages[0])
+5 -2
drivers/regulator/pcap-regulator.c
··· 151 151 }; 152 152 153 153 static int pcap_regulator_set_voltage(struct regulator_dev *rdev, 154 - int min_uV, int max_uV) 154 + int min_uV, int max_uV, 155 + unsiged *selector) 155 156 { 156 157 struct pcap_regulator *vreg = &vreg_table[rdev_get_id(rdev)]; 157 158 void *pcap = rdev_get_drvdata(rdev); ··· 171 170 i = 0; 172 171 173 172 uV = vreg->voltage_table[i] * 1000; 174 - if (min_uV <= uV && uV <= max_uV) 173 + if (min_uV <= uV && uV <= max_uV) { 174 + *selector = i; 175 175 return ezx_pcap_set_bits(pcap, vreg->reg, 176 176 (vreg->n_voltages - 1) << vreg->index, 177 177 i << vreg->index); 178 + } 178 179 179 180 if (i == 0 && rdev_get_id(rdev) == V1) 180 181 i = vreg->n_voltages - 1;
+4 -1
drivers/regulator/pcf50633-regulator.c
··· 108 108 } 109 109 110 110 static int pcf50633_regulator_set_voltage(struct regulator_dev *rdev, 111 - int min_uV, int max_uV) 111 + int min_uV, int max_uV, 112 + unsigned *selector) 112 113 { 113 114 struct pcf50633 *pcf; 114 115 int regulator_id, millivolts; ··· 147 146 default: 148 147 return -EINVAL; 149 148 } 149 + 150 + *selector = volt_bits; 150 151 151 152 return pcf50633_reg_write(pcf, regnr, volt_bits); 152 153 }
+7 -2
drivers/regulator/tps65023-regulator.c
··· 321 321 } 322 322 323 323 static int tps65023_dcdc_set_voltage(struct regulator_dev *dev, 324 - int min_uV, int max_uV) 324 + int min_uV, int max_uV, 325 + unsigned *selector) 325 326 { 326 327 struct tps_pmic *tps = rdev_get_drvdata(dev); 327 328 int dcdc = rdev_get_id(dev); ··· 346 345 if (min_uV <= uV && uV <= max_uV) 347 346 break; 348 347 } 348 + 349 + *selector = vsel; 349 350 350 351 /* write to the register in case we found a match */ 351 352 if (vsel == tps->info[dcdc]->table_len) ··· 374 371 } 375 372 376 373 static int tps65023_ldo_set_voltage(struct regulator_dev *dev, 377 - int min_uV, int max_uV) 374 + int min_uV, int max_uV, unsigned *selector) 378 375 { 379 376 struct tps_pmic *tps = rdev_get_drvdata(dev); 380 377 int data, vsel, ldo = rdev_get_id(dev); ··· 398 395 399 396 if (vsel == tps->info[ldo]->table_len) 400 397 return -EINVAL; 398 + 399 + *selector = vsel; 401 400 402 401 data = tps_65023_reg_read(tps, TPS65023_REG_LDO_CTRL); 403 402 if (data < 0)
+8 -2
drivers/regulator/tps6507x-regulator.c
··· 369 369 } 370 370 371 371 static int tps6507x_pmic_dcdc_set_voltage(struct regulator_dev *dev, 372 - int min_uV, int max_uV) 372 + int min_uV, int max_uV, 373 + unsigned *selector) 373 374 { 374 375 struct tps6507x_pmic *tps = rdev_get_drvdata(dev); 375 376 int data, vsel, dcdc = rdev_get_id(dev); ··· 416 415 if (vsel == tps->info[dcdc]->table_len) 417 416 return -EINVAL; 418 417 418 + *selector = vsel; 419 + 419 420 data = tps6507x_pmic_reg_read(tps, reg); 420 421 if (data < 0) 421 422 return data; ··· 453 450 } 454 451 455 452 static int tps6507x_pmic_ldo_set_voltage(struct regulator_dev *dev, 456 - int min_uV, int max_uV) 453 + int min_uV, int max_uV, 454 + unsigned *selector) 457 455 { 458 456 struct tps6507x_pmic *tps = rdev_get_drvdata(dev); 459 457 int data, vsel, ldo = rdev_get_id(dev); ··· 486 482 487 483 if (vsel == tps->info[ldo]->table_len) 488 484 return -EINVAL; 485 + 486 + *selector = vsel; 489 487 490 488 data = tps6507x_pmic_reg_read(tps, reg); 491 489 if (data < 0)
+10 -5
drivers/regulator/tps6586x-regulator.c
··· 85 85 86 86 static int __tps6586x_ldo_set_voltage(struct device *parent, 87 87 struct tps6586x_regulator *ri, 88 - int min_uV, int max_uV) 88 + int min_uV, int max_uV, 89 + unsigned *selector) 89 90 { 90 91 int val, uV; 91 92 uint8_t mask; ··· 101 100 /* use the first in-range value */ 102 101 if (min_uV <= uV && uV <= max_uV) { 103 102 103 + *selector = val; 104 + 104 105 val <<= ri->volt_shift; 105 106 mask = ((1 << ri->volt_nbits) - 1) << ri->volt_shift; 106 107 ··· 114 111 } 115 112 116 113 static int tps6586x_ldo_set_voltage(struct regulator_dev *rdev, 117 - int min_uV, int max_uV) 114 + int min_uV, int max_uV, unsigned *selector) 118 115 { 119 116 struct tps6586x_regulator *ri = rdev_get_drvdata(rdev); 120 117 struct device *parent = to_tps6586x_dev(rdev); 121 118 122 - return __tps6586x_ldo_set_voltage(parent, ri, min_uV, max_uV); 119 + return __tps6586x_ldo_set_voltage(parent, ri, min_uV, max_uV, 120 + selector); 123 121 } 124 122 125 123 static int tps6586x_ldo_get_voltage(struct regulator_dev *rdev) ··· 144 140 } 145 141 146 142 static int tps6586x_dvm_set_voltage(struct regulator_dev *rdev, 147 - int min_uV, int max_uV) 143 + int min_uV, int max_uV, unsigned *selector) 148 144 { 149 145 struct tps6586x_regulator *ri = rdev_get_drvdata(rdev); 150 146 struct device *parent = to_tps6586x_dev(rdev); 151 147 int ret; 152 148 153 - ret = __tps6586x_ldo_set_voltage(parent, ri, min_uV, max_uV); 149 + ret = __tps6586x_ldo_set_voltage(parent, ri, min_uV, max_uV, 150 + selector); 154 151 if (ret) 155 152 return ret; 156 153
+8 -3
drivers/regulator/twl-regulator.c
··· 329 329 } 330 330 331 331 static int 332 - twl4030ldo_set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV) 332 + twl4030ldo_set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV, 333 + unsigned *selector) 333 334 { 334 335 struct twlreg_info *info = rdev_get_drvdata(rdev); 335 336 int vsel; ··· 346 345 /* REVISIT for VAUX2, first match may not be best/lowest */ 347 346 348 347 /* use the first in-range value */ 349 - if (min_uV <= uV && uV <= max_uV) 348 + if (min_uV <= uV && uV <= max_uV) { 349 + *selector = vsel; 350 350 return twlreg_write(info, TWL_MODULE_PM_RECEIVER, 351 351 VREG_VOLTAGE, vsel); 352 + } 352 353 } 353 354 354 355 return -EDOM; ··· 392 389 } 393 390 394 391 static int 395 - twl6030ldo_set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV) 392 + twl6030ldo_set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV, 393 + unsigned *selector) 396 394 { 397 395 struct twlreg_info *info = rdev_get_drvdata(rdev); 398 396 int vsel; ··· 406 402 * mV = 1000mv + 100mv * (vsel - 1) 407 403 */ 408 404 vsel = (min_uV/1000 - 1000)/100 + 1; 405 + *selector = vsel; 409 406 return twlreg_write(info, TWL_MODULE_PM_RECEIVER, VREG_VOLTAGE, vsel); 410 407 411 408 }
+12 -5
drivers/regulator/wm831x-dcdc.c
··· 302 302 } 303 303 304 304 static int wm831x_buckv_set_voltage(struct regulator_dev *rdev, 305 - int min_uV, int max_uV) 305 + int min_uV, int max_uV, unsigned *selector) 306 306 { 307 307 struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev); 308 308 struct wm831x *wm831x = dcdc->wm831x; ··· 313 313 vsel = wm831x_buckv_select_min_voltage(rdev, min_uV, max_uV); 314 314 if (vsel < 0) 315 315 return vsel; 316 + 317 + *selector = vsel; 316 318 317 319 /* If this value is already set then do a GPIO update if we can */ 318 320 if (dcdc->dvs_gpio && dcdc->on_vsel == vsel) ··· 638 636 } 639 637 640 638 static int wm831x_buckp_set_voltage_int(struct regulator_dev *rdev, int reg, 641 - int min_uV, int max_uV) 639 + int min_uV, int max_uV, int *selector) 642 640 { 643 641 struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev); 644 642 struct wm831x *wm831x = dcdc->wm831x; ··· 652 650 if (wm831x_buckp_list_voltage(rdev, vsel) > max_uV) 653 651 return -EINVAL; 654 652 653 + *selector = vsel; 654 + 655 655 return wm831x_set_bits(wm831x, reg, WM831X_DC3_ON_VSEL_MASK, vsel); 656 656 } 657 657 658 658 static int wm831x_buckp_set_voltage(struct regulator_dev *rdev, 659 - int min_uV, int max_uV) 659 + int min_uV, int max_uV, 660 + unsigned *selector) 660 661 { 661 662 struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev); 662 663 u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG; 663 664 664 - return wm831x_buckp_set_voltage_int(rdev, reg, min_uV, max_uV); 665 + return wm831x_buckp_set_voltage_int(rdev, reg, min_uV, max_uV, 666 + selector); 665 667 } 666 668 667 669 static int wm831x_buckp_set_suspend_voltage(struct regulator_dev *rdev, ··· 673 667 { 674 668 struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev); 675 669 u16 reg = dcdc->base + WM831X_DCDC_SLEEP_CONTROL; 670 + unsigned selector; 676 671 677 - return wm831x_buckp_set_voltage_int(rdev, reg, uV, uV); 672 + return wm831x_buckp_set_voltage_int(rdev, reg, uV, uV, &selector); 678 673 } 679 674 680 675 static int wm831x_buckp_get_voltage(struct regulator_dev *rdev)
+29 -12
drivers/regulator/wm831x-ldo.c
··· 113 113 } 114 114 115 115 static int wm831x_gp_ldo_set_voltage_int(struct regulator_dev *rdev, int reg, 116 - int min_uV, int max_uV) 116 + int min_uV, int max_uV, 117 + unsigned *selector) 117 118 { 118 119 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 119 120 struct wm831x *wm831x = ldo->wm831x; ··· 134 133 if (ret < min_uV || ret > max_uV) 135 134 return -EINVAL; 136 135 136 + *selector = vsel; 137 + 137 138 return wm831x_set_bits(wm831x, reg, WM831X_LDO1_ON_VSEL_MASK, vsel); 138 139 } 139 140 140 141 static int wm831x_gp_ldo_set_voltage(struct regulator_dev *rdev, 141 - int min_uV, int max_uV) 142 + int min_uV, int max_uV, 143 + unsigned *selector) 142 144 { 143 145 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 144 146 int reg = ldo->base + WM831X_LDO_ON_CONTROL; 145 147 146 - return wm831x_gp_ldo_set_voltage_int(rdev, reg, min_uV, max_uV); 148 + return wm831x_gp_ldo_set_voltage_int(rdev, reg, min_uV, max_uV, 149 + selector); 147 150 } 148 151 149 152 static int wm831x_gp_ldo_set_suspend_voltage(struct regulator_dev *rdev, ··· 155 150 { 156 151 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 157 152 int reg = ldo->base + WM831X_LDO_SLEEP_CONTROL; 153 + unsigned int selector; 158 154 159 - return wm831x_gp_ldo_set_voltage_int(rdev, reg, uV, uV); 155 + return wm831x_gp_ldo_set_voltage_int(rdev, reg, uV, uV, &selector); 160 156 } 161 157 162 158 static int wm831x_gp_ldo_get_voltage(struct regulator_dev *rdev) ··· 419 413 } 420 414 421 415 static int wm831x_aldo_set_voltage_int(struct regulator_dev *rdev, int reg, 422 - int min_uV, int max_uV) 416 + int min_uV, int max_uV, 417 + unsigned *selector) 423 418 { 424 419 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 425 420 struct wm831x *wm831x = ldo->wm831x; ··· 440 433 if (ret < min_uV || ret > max_uV) 441 434 return -EINVAL; 442 435 436 + *selector = vsel; 437 + 443 438 return wm831x_set_bits(wm831x, reg, WM831X_LDO7_ON_VSEL_MASK, vsel); 444 439 } 445 440 446 441 static int wm831x_aldo_set_voltage(struct regulator_dev *rdev, 447 - int min_uV, int max_uV) 442 + int min_uV, int max_uV, unsigned *selector) 448 443 { 449 444 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 450 445 int reg = ldo->base + WM831X_LDO_ON_CONTROL; 451 446 452 - return wm831x_aldo_set_voltage_int(rdev, reg, min_uV, max_uV); 447 + return wm831x_aldo_set_voltage_int(rdev, reg, min_uV, max_uV, 448 + selector); 453 449 } 454 450 455 451 static int wm831x_aldo_set_suspend_voltage(struct regulator_dev *rdev, ··· 460 450 { 461 451 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 462 452 int reg = ldo->base + WM831X_LDO_SLEEP_CONTROL; 453 + unsigned int selector; 463 454 464 - return wm831x_aldo_set_voltage_int(rdev, reg, uV, uV); 455 + return wm831x_aldo_set_voltage_int(rdev, reg, uV, uV, &selector); 465 456 } 466 457 467 458 static int wm831x_aldo_get_voltage(struct regulator_dev *rdev) ··· 677 666 678 667 static int wm831x_alive_ldo_set_voltage_int(struct regulator_dev *rdev, 679 668 int reg, 680 - int min_uV, int max_uV) 669 + int min_uV, int max_uV, 670 + unsigned *selector) 681 671 { 682 672 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 683 673 struct wm831x *wm831x = ldo->wm831x; ··· 692 680 if (ret < min_uV || ret > max_uV) 693 681 return -EINVAL; 694 682 683 + *selector = vsel; 684 + 695 685 return wm831x_set_bits(wm831x, reg, WM831X_LDO11_ON_VSEL_MASK, vsel); 696 686 } 697 687 698 688 static int wm831x_alive_ldo_set_voltage(struct regulator_dev *rdev, 699 - int min_uV, int max_uV) 689 + int min_uV, int max_uV, 690 + unsigned *selector) 700 691 { 701 692 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 702 693 int reg = ldo->base + WM831X_ALIVE_LDO_ON_CONTROL; 703 694 704 - return wm831x_alive_ldo_set_voltage_int(rdev, reg, min_uV, max_uV); 695 + return wm831x_alive_ldo_set_voltage_int(rdev, reg, min_uV, max_uV, 696 + selector); 705 697 } 706 698 707 699 static int wm831x_alive_ldo_set_suspend_voltage(struct regulator_dev *rdev, ··· 713 697 { 714 698 struct wm831x_ldo *ldo = rdev_get_drvdata(rdev); 715 699 int reg = ldo->base + WM831X_ALIVE_LDO_SLEEP_CONTROL; 700 + unsigned selector; 716 701 717 - return wm831x_alive_ldo_set_voltage_int(rdev, reg, uV, uV); 702 + return wm831x_alive_ldo_set_voltage_int(rdev, reg, uV, uV, &selector); 718 703 } 719 704 720 705 static int wm831x_alive_ldo_get_voltage(struct regulator_dev *rdev)
+6 -2
drivers/regulator/wm8350-regulator.c
··· 360 360 EXPORT_SYMBOL_GPL(wm8350_isink_set_flash); 361 361 362 362 static int wm8350_dcdc_set_voltage(struct regulator_dev *rdev, int min_uV, 363 - int max_uV) 363 + int max_uV, unsigned *selector) 364 364 { 365 365 struct wm8350 *wm8350 = rdev_get_drvdata(rdev); 366 366 int volt_reg, dcdc = rdev_get_id(rdev), mV, ··· 396 396 default: 397 397 return -EINVAL; 398 398 } 399 + 400 + *selector = mV; 399 401 400 402 /* all DCDCs have same mV bits */ 401 403 val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_DC1_VSEL_MASK; ··· 756 754 } 757 755 758 756 static int wm8350_ldo_set_voltage(struct regulator_dev *rdev, int min_uV, 759 - int max_uV) 757 + int max_uV, unsigned *selector) 760 758 { 761 759 struct wm8350 *wm8350 = rdev_get_drvdata(rdev); 762 760 int volt_reg, ldo = rdev_get_id(rdev), mV, min_mV = min_uV / 1000, ··· 798 796 default: 799 797 return -EINVAL; 800 798 } 799 + 800 + *selector = mV; 801 801 802 802 /* all LDOs have same mV bits */ 803 803 val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_LDO1_VSEL_MASK;
+6 -2
drivers/regulator/wm8400-regulator.c
··· 67 67 } 68 68 69 69 static int wm8400_ldo_set_voltage(struct regulator_dev *dev, 70 - int min_uV, int max_uV) 70 + int min_uV, int max_uV, unsigned *selector) 71 71 { 72 72 struct wm8400 *wm8400 = rdev_get_drvdata(dev); 73 73 u16 val; ··· 92 92 93 93 val += 0xf; 94 94 } 95 + 96 + *selector = val; 95 97 96 98 return wm8400_set_bits(wm8400, WM8400_LDO1_CONTROL + rdev_get_id(dev), 97 99 WM8400_LDO1_VSEL_MASK, val); ··· 158 156 } 159 157 160 158 static int wm8400_dcdc_set_voltage(struct regulator_dev *dev, 161 - int min_uV, int max_uV) 159 + int min_uV, int max_uV, unsigned *selector) 162 160 { 163 161 struct wm8400 *wm8400 = rdev_get_drvdata(dev); 164 162 u16 val; ··· 172 170 if (850000 + (25000 * val) > max_uV) 173 171 return -EINVAL; 174 172 BUG_ON(850000 + (25000 * val) < min_uV); 173 + 174 + *selector = val; 175 175 176 176 return wm8400_set_bits(wm8400, WM8400_DCDC1_CONTROL_1 + offset, 177 177 WM8400_DC1_VSEL_MASK, val);
+4 -2
drivers/regulator/wm8994-regulator.c
··· 101 101 } 102 102 103 103 static int wm8994_ldo1_set_voltage(struct regulator_dev *rdev, 104 - int min_uV, int max_uV) 104 + int min_uV, int max_uV, unsigned *s) 105 105 { 106 106 struct wm8994_ldo *ldo = rdev_get_drvdata(rdev); 107 107 int selector, v; ··· 111 111 if (v < 0 || v > max_uV) 112 112 return -EINVAL; 113 113 114 + *s = selector; 114 115 selector <<= WM8994_LDO1_VSEL_SHIFT; 115 116 116 117 return wm8994_set_bits(ldo->wm8994, WM8994_LDO_1, ··· 153 152 } 154 153 155 154 static int wm8994_ldo2_set_voltage(struct regulator_dev *rdev, 156 - int min_uV, int max_uV) 155 + int min_uV, int max_uV, unsigned *s) 157 156 { 158 157 struct wm8994_ldo *ldo = rdev_get_drvdata(rdev); 159 158 int selector, v; ··· 163 162 if (v < 0 || v > max_uV) 164 163 return -EINVAL; 165 164 165 + *s = selector; 166 166 selector <<= WM8994_LDO2_VSEL_SHIFT; 167 167 168 168 return wm8994_set_bits(ldo->wm8994, WM8994_LDO_2,
+2 -1
include/linux/regulator/driver.h
··· 79 79 int (*list_voltage) (struct regulator_dev *, unsigned selector); 80 80 81 81 /* get/set regulator voltage */ 82 - int (*set_voltage) (struct regulator_dev *, int min_uV, int max_uV); 82 + int (*set_voltage) (struct regulator_dev *, int min_uV, int max_uV, 83 + unsigned *selector); 83 84 int (*get_voltage) (struct regulator_dev *); 84 85 85 86 /* get/set regulator current */