aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLee Jones <lee.jones@linaro.org>2013-04-02 08:24:11 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2013-04-02 18:01:43 -0400
commitd7607baf32160a64a2610552868d348b6644b5ef (patch)
tree40683e5c2fd17a50da9aa887fe7024fa108fc90d
parentbd44e2cb4a21d9297b84efbb2e26961f6ece0423 (diff)
regulator: ab8500: Add new operations for Vaux3
In former functions, only can set Vaux3 to 2.91V, because the highest bit of Vaux3 register is put into another register. So add new expanded functions for Vaux3's operation. Signed-off-by: zhang xiaomei <xiaomei.zhang@stericsson.com> Signed-off-by: Lee Jones <lee.jones@linaro.org> Reviewed-by: Philippe LANGLAIS <philippe.langlais@stericsson.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r--drivers/regulator/ab8500.c129
1 files changed, 128 insertions, 1 deletions
diff --git a/drivers/regulator/ab8500.c b/drivers/regulator/ab8500.c
index e8d07f667448..6dae5dfb9fde 100644
--- a/drivers/regulator/ab8500.c
+++ b/drivers/regulator/ab8500.c
@@ -63,6 +63,13 @@ struct ab8500_regulator_info {
63 u8 voltage_reg; 63 u8 voltage_reg;
64 u8 voltage_mask; 64 u8 voltage_mask;
65 u8 voltage_shift; 65 u8 voltage_shift;
66 struct {
67 u8 voltage_limit;
68 u8 voltage_bank;
69 u8 voltage_reg;
70 u8 voltage_mask;
71 u8 voltage_shift;
72 } expand_register;
66}; 73};
67 74
68/* voltage tables for the vauxn/vintcore supplies */ 75/* voltage tables for the vauxn/vintcore supplies */
@@ -396,6 +403,57 @@ static int ab8500_regulator_get_voltage_sel(struct regulator_dev *rdev)
396 return val >> info->voltage_shift; 403 return val >> info->voltage_shift;
397} 404}
398 405
406static int ab8540_aux3_regulator_get_voltage_sel(struct regulator_dev *rdev)
407{
408 int ret, val;
409 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
410 u8 regval, regval_expand;
411
412 if (info == NULL) {
413 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
414 return -EINVAL;
415 }
416
417 ret = abx500_get_register_interruptible(info->dev,
418 info->voltage_bank, info->voltage_reg, &regval);
419
420 if (ret < 0) {
421 dev_err(rdev_get_dev(rdev),
422 "couldn't read voltage reg for regulator\n");
423 return ret;
424 }
425
426 ret = abx500_get_register_interruptible(info->dev,
427 info->expand_register.voltage_bank,
428 info->expand_register.voltage_reg, &regval_expand);
429
430 if (ret < 0) {
431 dev_err(rdev_get_dev(rdev),
432 "couldn't read voltage reg for regulator\n");
433 return ret;
434 }
435
436 dev_vdbg(rdev_get_dev(rdev),
437 "%s-get_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
438 " 0x%x\n",
439 info->desc.name, info->voltage_bank, info->voltage_reg,
440 info->voltage_mask, regval);
441 dev_vdbg(rdev_get_dev(rdev),
442 "%s-get_voltage expand (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
443 " 0x%x\n",
444 info->desc.name, info->expand_register.voltage_bank,
445 info->expand_register.voltage_reg,
446 info->expand_register.voltage_mask, regval_expand);
447
448 if (regval_expand&(info->expand_register.voltage_mask))
449 /* Vaux3 has a different layout */
450 val = info->expand_register.voltage_limit;
451 else
452 val = (regval & info->voltage_mask) >> info->voltage_shift;
453
454 return val;
455}
456
399static int ab8500_regulator_set_voltage_sel(struct regulator_dev *rdev, 457static int ab8500_regulator_set_voltage_sel(struct regulator_dev *rdev,
400 unsigned selector) 458 unsigned selector)
401{ 459{
@@ -426,6 +484,55 @@ static int ab8500_regulator_set_voltage_sel(struct regulator_dev *rdev,
426 return ret; 484 return ret;
427} 485}
428 486
487static int ab8540_aux3_regulator_set_voltage_sel(struct regulator_dev *rdev,
488 unsigned selector)
489{
490 int ret;
491 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
492 u8 regval;
493
494 if (info == NULL) {
495 dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
496 return -EINVAL;
497 }
498
499 if (selector >= info->expand_register.voltage_limit) {
500 /* Vaux3 bit4 has different layout */
501 regval = (u8)selector << info->expand_register.voltage_shift;
502 ret = abx500_mask_and_set_register_interruptible(info->dev,
503 info->expand_register.voltage_bank,
504 info->expand_register.voltage_reg,
505 info->expand_register.voltage_mask,
506 regval);
507 } else {
508 /* set the registers for the request */
509 regval = (u8)selector << info->voltage_shift;
510 ret = abx500_mask_and_set_register_interruptible(info->dev,
511 info->voltage_bank, info->voltage_reg,
512 info->voltage_mask, regval);
513 }
514 if (ret < 0)
515 dev_err(rdev_get_dev(rdev),
516 "couldn't set voltage reg for regulator\n");
517
518 dev_vdbg(rdev_get_dev(rdev),
519 "%s-set_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
520 " 0x%x\n",
521 info->desc.name, info->voltage_bank, info->voltage_reg,
522 info->voltage_mask, regval);
523
524 return ret;
525}
526
527static int ab8500_regulator_set_voltage_time_sel(struct regulator_dev *rdev,
528 unsigned int old_sel,
529 unsigned int new_sel)
530{
531 struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
532
533 return info->delay;
534}
535
429static struct regulator_ops ab8500_regulator_volt_mode_ops = { 536static struct regulator_ops ab8500_regulator_volt_mode_ops = {
430 .enable = ab8500_regulator_enable, 537 .enable = ab8500_regulator_enable,
431 .disable = ab8500_regulator_disable, 538 .disable = ab8500_regulator_disable,
@@ -438,6 +545,19 @@ static struct regulator_ops ab8500_regulator_volt_mode_ops = {
438 .list_voltage = regulator_list_voltage_table, 545 .list_voltage = regulator_list_voltage_table,
439}; 546};
440 547
548static struct regulator_ops ab8540_aux3_regulator_volt_mode_ops = {
549 .enable = ab8500_regulator_enable,
550 .disable = ab8500_regulator_disable,
551 .get_optimum_mode = ab8500_regulator_get_optimum_mode,
552 .set_mode = ab8500_regulator_set_mode,
553 .get_mode = ab8500_regulator_get_mode,
554 .is_enabled = ab8500_regulator_is_enabled,
555 .get_voltage_sel = ab8540_aux3_regulator_get_voltage_sel,
556 .set_voltage_sel = ab8540_aux3_regulator_set_voltage_sel,
557 .list_voltage = regulator_list_voltage_table,
558 .set_voltage_time_sel = ab8500_regulator_set_voltage_time_sel,
559};
560
441static struct regulator_ops ab8500_regulator_volt_ops = { 561static struct regulator_ops ab8500_regulator_volt_ops = {
442 .enable = ab8500_regulator_enable, 562 .enable = ab8500_regulator_enable,
443 .disable = ab8500_regulator_disable, 563 .disable = ab8500_regulator_disable,
@@ -1271,7 +1391,7 @@ static struct ab8500_regulator_info
1271 [AB8540_LDO_AUX3] = { 1391 [AB8540_LDO_AUX3] = {
1272 .desc = { 1392 .desc = {
1273 .name = "LDO-AUX3", 1393 .name = "LDO-AUX3",
1274 .ops = &ab8500_regulator_volt_mode_ops, 1394 .ops = &ab8540_aux3_regulator_volt_mode_ops,
1275 .type = REGULATOR_VOLTAGE, 1395 .type = REGULATOR_VOLTAGE,
1276 .id = AB8540_LDO_AUX3, 1396 .id = AB8540_LDO_AUX3,
1277 .owner = THIS_MODULE, 1397 .owner = THIS_MODULE,
@@ -1288,6 +1408,13 @@ static struct ab8500_regulator_info
1288 .voltage_bank = 0x04, 1408 .voltage_bank = 0x04,
1289 .voltage_reg = 0x21, 1409 .voltage_reg = 0x21,
1290 .voltage_mask = 0x07, 1410 .voltage_mask = 0x07,
1411 .expand_register = {
1412 .voltage_limit = 8,
1413 .voltage_bank = 0x04,
1414 .voltage_reg = 0x01,
1415 .voltage_mask = 0x10,
1416 .voltage_shift = 1,
1417 }
1291 }, 1418 },
1292 [AB8540_LDO_AUX4] = { 1419 [AB8540_LDO_AUX4] = {
1293 .desc = { 1420 .desc = {