Commit 9d92492fb753f01caa31dc502f69c189c0c22ad0
Committed by
Samuel Ortiz
1 parent
8e52e279b2
Exists in
master
and in
7 other branches
regulator: Separate set_voltage for max8998 ldo and buck
Signed-off-by: Lukasz Majewski <l.majewski@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Acked-by: Liam Girdwood <lrg@slimlogic.co.uk> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Showing 1 changed file with 40 additions and 3 deletions Side-by-side Diff
drivers/regulator/max8998.c
... | ... | @@ -297,12 +297,49 @@ |
297 | 297 | return max8998_list_voltage(rdev, val); |
298 | 298 | } |
299 | 299 | |
300 | -static int max8998_set_voltage(struct regulator_dev *rdev, | |
300 | +static int max8998_set_voltage_ldo(struct regulator_dev *rdev, | |
301 | 301 | int min_uV, int max_uV) |
302 | 302 | { |
303 | 303 | struct max8998_data *max8998 = rdev_get_drvdata(rdev); |
304 | 304 | struct i2c_client *i2c = max8998->iodev->i2c; |
305 | 305 | int min_vol = min_uV / 1000, max_vol = max_uV / 1000; |
306 | + const struct voltage_map_desc *desc; | |
307 | + int ldo = max8998_get_ldo(rdev); | |
308 | + int reg, shift = 0, mask, ret; | |
309 | + int i = 0; | |
310 | + | |
311 | + if (ldo >= ARRAY_SIZE(ldo_voltage_map)) | |
312 | + return -EINVAL; | |
313 | + | |
314 | + desc = ldo_voltage_map[ldo]; | |
315 | + if (desc == NULL) | |
316 | + return -EINVAL; | |
317 | + | |
318 | + if (max_vol < desc->min || min_vol > desc->max) | |
319 | + return -EINVAL; | |
320 | + | |
321 | + while (desc->min + desc->step*i < min_vol && | |
322 | + desc->min + desc->step*i < desc->max) | |
323 | + i++; | |
324 | + | |
325 | + if (desc->min + desc->step*i > max_vol) | |
326 | + return -EINVAL; | |
327 | + | |
328 | + ret = max8998_get_voltage_register(rdev, ®, &shift, &mask); | |
329 | + if (ret) | |
330 | + return ret; | |
331 | + | |
332 | + ret = max8998_update_reg(i2c, reg, i<<shift, mask<<shift); | |
333 | + | |
334 | + return ret; | |
335 | +} | |
336 | + | |
337 | +static int max8998_set_voltage_buck(struct regulator_dev *rdev, | |
338 | + int min_uV, int max_uV) | |
339 | +{ | |
340 | + struct max8998_data *max8998 = rdev_get_drvdata(rdev); | |
341 | + struct i2c_client *i2c = max8998->iodev->i2c; | |
342 | + int min_vol = min_uV / 1000, max_vol = max_uV / 1000; | |
306 | 343 | int previous_vol = 0; |
307 | 344 | const struct voltage_map_desc *desc; |
308 | 345 | int ldo = max8998_get_ldo(rdev); |
... | ... | @@ -359,7 +396,7 @@ |
359 | 396 | .enable = max8998_ldo_enable, |
360 | 397 | .disable = max8998_ldo_disable, |
361 | 398 | .get_voltage = max8998_get_voltage, |
362 | - .set_voltage = max8998_set_voltage, | |
399 | + .set_voltage = max8998_set_voltage_ldo, | |
363 | 400 | .set_suspend_enable = max8998_ldo_enable, |
364 | 401 | .set_suspend_disable = max8998_ldo_disable, |
365 | 402 | }; |
... | ... | @@ -370,7 +407,7 @@ |
370 | 407 | .enable = max8998_ldo_enable, |
371 | 408 | .disable = max8998_ldo_disable, |
372 | 409 | .get_voltage = max8998_get_voltage, |
373 | - .set_voltage = max8998_set_voltage, | |
410 | + .set_voltage = max8998_set_voltage_buck, | |
374 | 411 | .set_suspend_enable = max8998_ldo_enable, |
375 | 412 | .set_suspend_disable = max8998_ldo_disable, |
376 | 413 | }; |