diff options
| author | Tero Kristo <t-kristo@ti.com> | 2012-02-28 04:39:10 -0500 |
|---|---|---|
| committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-03-11 16:09:00 -0400 |
| commit | 34a38440689b06a515104d668494e0ff8a4e1537 (patch) | |
| tree | b6ea0840779978b209a11eeaedc0575080d57885 | |
| parent | 63bfff4e20211b464cbea6e79e5fd36df227c154 (diff) | |
regulator: twl6030: add support for vdd1, vdd2 and vdd3 regulators
vdd1 and vdd2 are now common regulators for twl4030 and twl6030. Also
added vdd3 as a new regulator for twl6030. twl6030 vdd1...vdd3 smps
regulator voltages can only be controlled through the smartreflex
voltage channel, thus the support for the voltage_get and set is
minimal and requires external controller.
Signed-off-by: Tero Kristo <t-kristo@ti.com>
Signed-off-by: Rajendra Nayak <rnayak@ti.com>
Acked-by: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
| -rw-r--r-- | drivers/mfd/twl-core.c | 15 | ||||
| -rw-r--r-- | drivers/regulator/twl-regulator.c | 39 | ||||
| -rw-r--r-- | include/linux/i2c/twl.h | 5 |
3 files changed, 57 insertions, 2 deletions
diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index fae5f76d6ccb..c788e363ed56 100644 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c | |||
| @@ -949,6 +949,21 @@ add_children(struct twl4030_platform_data *pdata, unsigned long features) | |||
| 949 | /* twl6030 regulators */ | 949 | /* twl6030 regulators */ |
| 950 | if (twl_has_regulator() && twl_class_is_6030() && | 950 | if (twl_has_regulator() && twl_class_is_6030() && |
| 951 | !(features & TWL6025_SUBCLASS)) { | 951 | !(features & TWL6025_SUBCLASS)) { |
| 952 | child = add_regulator(TWL6030_REG_VDD1, pdata->vdd1, | ||
| 953 | features); | ||
| 954 | if (IS_ERR(child)) | ||
| 955 | return PTR_ERR(child); | ||
| 956 | |||
| 957 | child = add_regulator(TWL6030_REG_VDD2, pdata->vdd2, | ||
| 958 | features); | ||
| 959 | if (IS_ERR(child)) | ||
| 960 | return PTR_ERR(child); | ||
| 961 | |||
| 962 | child = add_regulator(TWL6030_REG_VDD3, pdata->vdd3, | ||
| 963 | features); | ||
| 964 | if (IS_ERR(child)) | ||
| 965 | return PTR_ERR(child); | ||
| 966 | |||
| 952 | child = add_regulator(TWL6030_REG_VMMC, pdata->vmmc, | 967 | child = add_regulator(TWL6030_REG_VMMC, pdata->vmmc, |
| 953 | features); | 968 | features); |
| 954 | if (IS_ERR(child)) | 969 | if (IS_ERR(child)) |
diff --git a/drivers/regulator/twl-regulator.c b/drivers/regulator/twl-regulator.c index 7ff8bb22d569..8611282f1d20 100644 --- a/drivers/regulator/twl-regulator.c +++ b/drivers/regulator/twl-regulator.c | |||
| @@ -561,6 +561,32 @@ static struct regulator_ops twl4030smps_ops = { | |||
| 561 | .get_voltage = twl4030smps_get_voltage, | 561 | .get_voltage = twl4030smps_get_voltage, |
| 562 | }; | 562 | }; |
| 563 | 563 | ||
| 564 | static int twl6030coresmps_set_voltage(struct regulator_dev *rdev, int min_uV, | ||
| 565 | int max_uV, unsigned *selector) | ||
| 566 | { | ||
| 567 | struct twlreg_info *info = rdev_get_drvdata(rdev); | ||
| 568 | |||
| 569 | if (info->set_voltage) | ||
| 570 | return info->set_voltage(info->data, min_uV); | ||
| 571 | |||
| 572 | return -ENODEV; | ||
| 573 | } | ||
| 574 | |||
| 575 | static int twl6030coresmps_get_voltage(struct regulator_dev *rdev) | ||
| 576 | { | ||
| 577 | struct twlreg_info *info = rdev_get_drvdata(rdev); | ||
| 578 | |||
| 579 | if (info->get_voltage) | ||
| 580 | return info->get_voltage(info->data); | ||
| 581 | |||
| 582 | return -ENODEV; | ||
| 583 | } | ||
| 584 | |||
| 585 | static struct regulator_ops twl6030coresmps_ops = { | ||
| 586 | .set_voltage = twl6030coresmps_set_voltage, | ||
| 587 | .get_voltage = twl6030coresmps_get_voltage, | ||
| 588 | }; | ||
| 589 | |||
| 564 | static int twl6030ldo_list_voltage(struct regulator_dev *rdev, unsigned index) | 590 | static int twl6030ldo_list_voltage(struct regulator_dev *rdev, unsigned index) |
| 565 | { | 591 | { |
| 566 | struct twlreg_info *info = rdev_get_drvdata(rdev); | 592 | struct twlreg_info *info = rdev_get_drvdata(rdev); |
| @@ -926,6 +952,16 @@ static struct regulator_ops twlsmps_ops = { | |||
| 926 | }, \ | 952 | }, \ |
| 927 | } | 953 | } |
| 928 | 954 | ||
| 955 | #define TWL6030_ADJUSTABLE_SMPS(label) { \ | ||
| 956 | .desc = { \ | ||
| 957 | .name = #label, \ | ||
| 958 | .id = TWL6030_REG_##label, \ | ||
| 959 | .ops = &twl6030coresmps_ops, \ | ||
| 960 | .type = REGULATOR_VOLTAGE, \ | ||
| 961 | .owner = THIS_MODULE, \ | ||
| 962 | }, \ | ||
| 963 | } | ||
| 964 | |||
| 929 | #define TWL6030_ADJUSTABLE_LDO(label, offset, min_mVolts, max_mVolts) { \ | 965 | #define TWL6030_ADJUSTABLE_LDO(label, offset, min_mVolts, max_mVolts) { \ |
| 930 | .base = offset, \ | 966 | .base = offset, \ |
| 931 | .min_mV = min_mVolts, \ | 967 | .min_mV = min_mVolts, \ |
| @@ -1027,6 +1063,9 @@ static struct twlreg_info twl_regs[] = { | |||
| 1027 | /* 6030 REG with base as PMC Slave Misc : 0x0030 */ | 1063 | /* 6030 REG with base as PMC Slave Misc : 0x0030 */ |
| 1028 | /* Turnon-delay and remap configuration values for 6030 are not | 1064 | /* Turnon-delay and remap configuration values for 6030 are not |
| 1029 | verified since the specification is not public */ | 1065 | verified since the specification is not public */ |
| 1066 | TWL6030_ADJUSTABLE_SMPS(VDD1), | ||
| 1067 | TWL6030_ADJUSTABLE_SMPS(VDD2), | ||
| 1068 | TWL6030_ADJUSTABLE_SMPS(VDD3), | ||
| 1030 | TWL6030_ADJUSTABLE_LDO(VAUX1_6030, 0x54, 1000, 3300), | 1069 | TWL6030_ADJUSTABLE_LDO(VAUX1_6030, 0x54, 1000, 3300), |
| 1031 | TWL6030_ADJUSTABLE_LDO(VAUX2_6030, 0x58, 1000, 3300), | 1070 | TWL6030_ADJUSTABLE_LDO(VAUX2_6030, 0x58, 1000, 3300), |
| 1032 | TWL6030_ADJUSTABLE_LDO(VAUX3_6030, 0x5c, 1000, 3300), | 1071 | TWL6030_ADJUSTABLE_LDO(VAUX3_6030, 0x5c, 1000, 3300), |
diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h index 08a82d314f24..f66c0311e448 100644 --- a/include/linux/i2c/twl.h +++ b/include/linux/i2c/twl.h | |||
| @@ -712,6 +712,9 @@ struct twl4030_platform_data { | |||
| 712 | struct regulator_init_data *vaux1; | 712 | struct regulator_init_data *vaux1; |
| 713 | struct regulator_init_data *vaux2; | 713 | struct regulator_init_data *vaux2; |
| 714 | struct regulator_init_data *vaux3; | 714 | struct regulator_init_data *vaux3; |
| 715 | struct regulator_init_data *vdd1; | ||
| 716 | struct regulator_init_data *vdd2; | ||
| 717 | struct regulator_init_data *vdd3; | ||
| 715 | /* TWL4030 LDO regulators */ | 718 | /* TWL4030 LDO regulators */ |
| 716 | struct regulator_init_data *vpll1; | 719 | struct regulator_init_data *vpll1; |
| 717 | struct regulator_init_data *vpll2; | 720 | struct regulator_init_data *vpll2; |
| @@ -720,8 +723,6 @@ struct twl4030_platform_data { | |||
| 720 | struct regulator_init_data *vsim; | 723 | struct regulator_init_data *vsim; |
| 721 | struct regulator_init_data *vaux4; | 724 | struct regulator_init_data *vaux4; |
| 722 | struct regulator_init_data *vio; | 725 | struct regulator_init_data *vio; |
| 723 | struct regulator_init_data *vdd1; | ||
| 724 | struct regulator_init_data *vdd2; | ||
| 725 | struct regulator_init_data *vintana1; | 726 | struct regulator_init_data *vintana1; |
| 726 | struct regulator_init_data *vintana2; | 727 | struct regulator_init_data *vintana2; |
| 727 | struct regulator_init_data *vintdig; | 728 | struct regulator_init_data *vintdig; |
