aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/regulator/s5m8767.c
diff options
context:
space:
mode:
authorSangbeom Kim <sbkim73@samsung.com>2012-06-13 04:28:18 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-06-13 13:45:09 -0400
commitdf2643cfa4ad4f3775838ad0c0815c465f351f92 (patch)
treeb13d355dc487cf12483e5ba99be42693aaefc4ee /drivers/regulator/s5m8767.c
parent38c20eb23fb7b5505ac80595f18f4209abc19cd3 (diff)
regulator: Replace set_voltage with set_voltage_sel
To apply delay time for voltage change, replace s5m8767_set_voltage with s5m8767_set_voltage_sel. Signed-off-by: Sangbeom Kim <sbkim73@samsung.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers/regulator/s5m8767.c')
-rw-r--r--drivers/regulator/s5m8767.c38
1 files changed, 14 insertions, 24 deletions
diff --git a/drivers/regulator/s5m8767.c b/drivers/regulator/s5m8767.c
index 4edf344fb7c4..a4a3c7eefd1f 100644
--- a/drivers/regulator/s5m8767.c
+++ b/drivers/regulator/s5m8767.c
@@ -357,32 +357,34 @@ static int s5m8767_convert_voltage_to_sel(
357 return selector; 357 return selector;
358} 358}
359 359
360static inline void s5m8767_set_high(struct s5m8767_info *s5m8767) 360static inline int s5m8767_set_high(struct s5m8767_info *s5m8767)
361{ 361{
362 int temp_index = s5m8767->buck_gpioindex; 362 int temp_index = s5m8767->buck_gpioindex;
363 363
364 gpio_set_value(s5m8767->buck_gpios[0], (temp_index >> 2) & 0x1); 364 gpio_set_value(s5m8767->buck_gpios[0], (temp_index >> 2) & 0x1);
365 gpio_set_value(s5m8767->buck_gpios[1], (temp_index >> 1) & 0x1); 365 gpio_set_value(s5m8767->buck_gpios[1], (temp_index >> 1) & 0x1);
366 gpio_set_value(s5m8767->buck_gpios[2], temp_index & 0x1); 366 gpio_set_value(s5m8767->buck_gpios[2], temp_index & 0x1);
367
368 return 0;
367} 369}
368 370
369static inline void s5m8767_set_low(struct s5m8767_info *s5m8767) 371static inline int s5m8767_set_low(struct s5m8767_info *s5m8767)
370{ 372{
371 int temp_index = s5m8767->buck_gpioindex; 373 int temp_index = s5m8767->buck_gpioindex;
372 374
373 gpio_set_value(s5m8767->buck_gpios[2], temp_index & 0x1); 375 gpio_set_value(s5m8767->buck_gpios[2], temp_index & 0x1);
374 gpio_set_value(s5m8767->buck_gpios[1], (temp_index >> 1) & 0x1); 376 gpio_set_value(s5m8767->buck_gpios[1], (temp_index >> 1) & 0x1);
375 gpio_set_value(s5m8767->buck_gpios[0], (temp_index >> 2) & 0x1); 377 gpio_set_value(s5m8767->buck_gpios[0], (temp_index >> 2) & 0x1);
378
379 return 0;
376} 380}
377 381
378static int s5m8767_set_voltage(struct regulator_dev *rdev, 382static int s5m8767_set_voltage_sel(struct regulator_dev *rdev,
379 int min_uV, int max_uV, unsigned *selector) 383 unsigned selector)
380{ 384{
381 struct s5m8767_info *s5m8767 = rdev_get_drvdata(rdev); 385 struct s5m8767_info *s5m8767 = rdev_get_drvdata(rdev);
382 const struct s5m_voltage_desc *desc;
383 int reg_id = rdev_get_id(rdev); 386 int reg_id = rdev_get_id(rdev);
384 int sel, reg, mask, ret = 0, old_index, index = 0; 387 int reg, mask, ret = 0, old_index, index = 0;
385 u8 val;
386 u8 *buck234_vol = NULL; 388 u8 *buck234_vol = NULL;
387 389
388 switch (reg_id) { 390 switch (reg_id) {
@@ -407,15 +409,9 @@ static int s5m8767_set_voltage(struct regulator_dev *rdev,
407 return -EINVAL; 409 return -EINVAL;
408 } 410 }
409 411
410 desc = reg_voltage_map[reg_id];
411
412 sel = s5m8767_convert_voltage_to_sel(desc, min_uV, max_uV);
413 if (sel < 0)
414 return sel;
415
416 /* buck234_vol != NULL means to control buck234 voltage via DVS GPIO */ 412 /* buck234_vol != NULL means to control buck234 voltage via DVS GPIO */
417 if (buck234_vol) { 413 if (buck234_vol) {
418 while (*buck234_vol != sel) { 414 while (*buck234_vol != selector) {
419 buck234_vol++; 415 buck234_vol++;
420 index++; 416 index++;
421 } 417 }
@@ -423,22 +419,16 @@ static int s5m8767_set_voltage(struct regulator_dev *rdev,
423 s5m8767->buck_gpioindex = index; 419 s5m8767->buck_gpioindex = index;
424 420
425 if (index > old_index) 421 if (index > old_index)
426 s5m8767_set_high(s5m8767); 422 return s5m8767_set_high(s5m8767);
427 else 423 else
428 s5m8767_set_low(s5m8767); 424 return s5m8767_set_low(s5m8767);
429 } else { 425 } else {
430 ret = s5m8767_get_voltage_register(rdev, &reg); 426 ret = s5m8767_get_voltage_register(rdev, &reg);
431 if (ret) 427 if (ret)
432 return ret; 428 return ret;
433 429
434 s5m_reg_read(s5m8767->iodev, reg, &val); 430 return s5m_reg_update(s5m8767->iodev, reg, selector, mask);
435 val = (val & ~mask) | sel;
436
437 ret = s5m_reg_write(s5m8767->iodev, reg, val);
438 } 431 }
439
440 *selector = sel;
441 return ret;
442} 432}
443 433
444static int s5m8767_set_voltage_time_sel(struct regulator_dev *rdev, 434static int s5m8767_set_voltage_time_sel(struct regulator_dev *rdev,
@@ -463,7 +453,7 @@ static struct regulator_ops s5m8767_ops = {
463 .enable = s5m8767_reg_enable, 453 .enable = s5m8767_reg_enable,
464 .disable = s5m8767_reg_disable, 454 .disable = s5m8767_reg_disable,
465 .get_voltage_sel = s5m8767_get_voltage_sel, 455 .get_voltage_sel = s5m8767_get_voltage_sel,
466 .set_voltage = s5m8767_set_voltage, 456 .set_voltage_sel = s5m8767_set_voltage_sel,
467 .set_voltage_time_sel = s5m8767_set_voltage_time_sel, 457 .set_voltage_time_sel = s5m8767_set_voltage_time_sel,
468}; 458};
469 459