regulator: twl6030: add support for vdd1, vdd2 and vdd3 regulators
authorTero Kristo <t-kristo@ti.com>
Tue, 28 Feb 2012 09:39:10 +0000 (15:09 +0530)
committerGrazvydas Ignotas <notasas@gmail.com>
Tue, 3 Apr 2012 21:00:39 +0000 (00:00 +0300)
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>
drivers/mfd/twl-core.c
drivers/regulator/twl-regulator.c
include/linux/i2c/twl.h

index 83974ed..6331f6e 100644 (file)
@@ -940,6 +940,21 @@ add_children(struct twl4030_platform_data *pdata, unsigned long features)
        /* twl6030 regulators */
        if (twl_has_regulator() && twl_class_is_6030() &&
                        !(features & TWL6025_SUBCLASS)) {
+               child = add_regulator(TWL6030_REG_VDD1, pdata->vdd1,
+                                       features);
+               if (IS_ERR(child))
+                       return PTR_ERR(child);
+
+               child = add_regulator(TWL6030_REG_VDD2, pdata->vdd2,
+                                       features);
+               if (IS_ERR(child))
+                       return PTR_ERR(child);
+
+               child = add_regulator(TWL6030_REG_VDD3, pdata->vdd3,
+                                       features);
+               if (IS_ERR(child))
+                       return PTR_ERR(child);
+
                child = add_regulator(TWL6030_REG_VMMC, pdata->vmmc,
                                        features);
                if (IS_ERR(child))
index f6918bf..0dedf72 100644 (file)
@@ -561,6 +561,32 @@ static struct regulator_ops twl4030smps_ops = {
        .get_voltage    = twl4030smps_get_voltage,
 };
 
+static int twl6030coresmps_set_voltage(struct regulator_dev *rdev, int min_uV,
+       int max_uV, unsigned *selector)
+{
+       struct twlreg_info *info = rdev_get_drvdata(rdev);
+
+       if (info->set_voltage)
+               return info->set_voltage(info->data, min_uV);
+
+       return -ENODEV;
+}
+
+static int twl6030coresmps_get_voltage(struct regulator_dev *rdev)
+{
+       struct twlreg_info *info = rdev_get_drvdata(rdev);
+
+       if (info->get_voltage)
+               return info->get_voltage(info->data);
+
+       return -ENODEV;
+}
+
+static struct regulator_ops twl6030coresmps_ops = {
+       .set_voltage    = twl6030coresmps_set_voltage,
+       .get_voltage    = twl6030coresmps_get_voltage,
+};
+
 static int twl6030ldo_list_voltage(struct regulator_dev *rdev, unsigned index)
 {
        struct twlreg_info      *info = rdev_get_drvdata(rdev);
@@ -918,6 +944,16 @@ static struct regulator_ops twlsmps_ops = {
                }, \
        }
 
+#define TWL6030_ADJUSTABLE_SMPS(label) { \
+       .desc = { \
+               .name = #label, \
+               .id = TWL6030_REG_##label, \
+               .ops = &twl6030coresmps_ops, \
+               .type = REGULATOR_VOLTAGE, \
+               .owner = THIS_MODULE, \
+               }, \
+       }
+
 #define TWL6030_ADJUSTABLE_LDO(label, offset, min_mVolts, max_mVolts) { \
        .base = offset, \
        .min_mV = min_mVolts, \
@@ -1019,6 +1055,9 @@ static struct twlreg_info twl_regs[] = {
        /* 6030 REG with base as PMC Slave Misc : 0x0030 */
        /* Turnon-delay and remap configuration values for 6030 are not
           verified since the specification is not public */
+       TWL6030_ADJUSTABLE_SMPS(VDD1),
+       TWL6030_ADJUSTABLE_SMPS(VDD2),
+       TWL6030_ADJUSTABLE_SMPS(VDD3),
        TWL6030_ADJUSTABLE_LDO(VAUX1_6030, 0x54, 1000, 3300),
        TWL6030_ADJUSTABLE_LDO(VAUX2_6030, 0x58, 1000, 3300),
        TWL6030_ADJUSTABLE_LDO(VAUX3_6030, 0x5c, 1000, 3300),
index e458c5b..99bc7bf 100644 (file)
@@ -714,6 +714,9 @@ struct twl4030_platform_data {
        struct regulator_init_data              *vaux1;
        struct regulator_init_data              *vaux2;
        struct regulator_init_data              *vaux3;
+       struct regulator_init_data              *vdd1;
+       struct regulator_init_data              *vdd2;
+       struct regulator_init_data              *vdd3;
        /* TWL4030 LDO regulators */
        struct regulator_init_data              *vpll1;
        struct regulator_init_data              *vpll2;
@@ -722,8 +725,6 @@ struct twl4030_platform_data {
        struct regulator_init_data              *vsim;
        struct regulator_init_data              *vaux4;
        struct regulator_init_data              *vio;
-       struct regulator_init_data              *vdd1;
-       struct regulator_init_data              *vdd2;
        struct regulator_init_data              *vintana1;
        struct regulator_init_data              *vintana2;
        struct regulator_init_data              *vintdig;