diff options
-rw-r--r-- | drivers/regulator/ab8500.c | 53 |
1 files changed, 33 insertions, 20 deletions
diff --git a/drivers/regulator/ab8500.c b/drivers/regulator/ab8500.c index 109ce3dcf533..279793e26d94 100644 --- a/drivers/regulator/ab8500.c +++ b/drivers/regulator/ab8500.c | |||
@@ -589,39 +589,52 @@ static int ab8540_aux3_regulator_set_voltage_sel(struct regulator_dev *rdev, | |||
589 | { | 589 | { |
590 | int ret; | 590 | int ret; |
591 | struct ab8500_regulator_info *info = rdev_get_drvdata(rdev); | 591 | struct ab8500_regulator_info *info = rdev_get_drvdata(rdev); |
592 | u8 regval; | 592 | u8 regval, regval_expand; |
593 | 593 | ||
594 | if (info == NULL) { | 594 | if (info == NULL) { |
595 | dev_err(rdev_get_dev(rdev), "regulator info null pointer\n"); | 595 | dev_err(rdev_get_dev(rdev), "regulator info null pointer\n"); |
596 | return -EINVAL; | 596 | return -EINVAL; |
597 | } | 597 | } |
598 | 598 | ||
599 | if (selector >= info->expand_register.voltage_limit) { | 599 | if (selector < info->expand_register.voltage_limit) { |
600 | /* Vaux3 bit4 has different layout */ | ||
601 | regval = (u8)selector << info->expand_register.voltage_shift; | ||
602 | ret = abx500_mask_and_set_register_interruptible(info->dev, | ||
603 | info->expand_register.voltage_bank, | ||
604 | info->expand_register.voltage_reg, | ||
605 | info->expand_register.voltage_mask, | ||
606 | regval); | ||
607 | } else { | ||
608 | /* set the registers for the request */ | ||
609 | regval = (u8)selector << info->voltage_shift; | 600 | regval = (u8)selector << info->voltage_shift; |
610 | ret = abx500_mask_and_set_register_interruptible(info->dev, | 601 | ret = abx500_mask_and_set_register_interruptible(info->dev, |
611 | info->voltage_bank, info->voltage_reg, | 602 | info->voltage_bank, info->voltage_reg, |
612 | info->voltage_mask, regval); | 603 | info->voltage_mask, regval); |
604 | if (ret < 0) { | ||
605 | dev_err(rdev_get_dev(rdev), | ||
606 | "couldn't set voltage reg for regulator\n"); | ||
607 | return ret; | ||
608 | } | ||
609 | |||
610 | dev_vdbg(rdev_get_dev(rdev), | ||
611 | "%s-set_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x\n", | ||
612 | info->desc.name, info->voltage_bank, info->voltage_reg, | ||
613 | info->voltage_mask, regval); | ||
614 | |||
615 | regval_expand = 0; | ||
616 | } else { | ||
617 | regval_expand = info->expand_register.voltage_mask; | ||
613 | } | 618 | } |
614 | if (ret < 0) | 619 | |
620 | ret = abx500_mask_and_set_register_interruptible(info->dev, | ||
621 | info->expand_register.voltage_bank, | ||
622 | info->expand_register.voltage_reg, | ||
623 | info->expand_register.voltage_mask, | ||
624 | regval_expand); | ||
625 | if (ret < 0) { | ||
615 | dev_err(rdev_get_dev(rdev), | 626 | dev_err(rdev_get_dev(rdev), |
616 | "couldn't set voltage reg for regulator\n"); | 627 | "couldn't set expand voltage reg for regulator\n"); |
628 | return ret; | ||
629 | } | ||
617 | 630 | ||
618 | dev_vdbg(rdev_get_dev(rdev), | 631 | dev_vdbg(rdev_get_dev(rdev), |
619 | "%s-set_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x," | 632 | "%s-set_voltage expand (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x\n", |
620 | " 0x%x\n", | 633 | info->desc.name, info->expand_register.voltage_bank, |
621 | info->desc.name, info->voltage_bank, info->voltage_reg, | 634 | info->expand_register.voltage_reg, |
622 | info->voltage_mask, regval); | 635 | info->expand_register.voltage_mask, regval_expand); |
623 | 636 | ||
624 | return ret; | 637 | return 0; |
625 | } | 638 | } |
626 | 639 | ||
627 | static struct regulator_ops ab8500_regulator_volt_mode_ops = { | 640 | static struct regulator_ops ab8500_regulator_volt_mode_ops = { |