Commit 9d92492fb753f01caa31dc502f69c189c0c22ad0

Authored by Lukasz Majewski
Committed by Samuel Ortiz
1 parent 8e52e279b2

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, &reg, &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 };