regulator: palma: Disable smps10 boost during suspend
[linux-2.6.git] / drivers / regulator / tps6586x-regulator.c
index 5173e9f..0c7cad3 100644 (file)
@@ -80,6 +80,11 @@ static int tps6586x_ldo_list_voltage(struct regulator_dev *rdev,
                                     unsigned selector)
 {
        struct tps6586x_regulator *info = rdev_get_drvdata(rdev);
+       int rid = rdev_get_id(rdev);
+
+       /* LDO0 has minimal voltage 1.2V rather than 1.25V */
+       if ((rid == TPS6586X_ID_LDO_0) && (selector == 0))
+               return (info->voltages[0] - 50) * 1000;
 
        return info->voltages[selector] * 1000;
 }
@@ -96,10 +101,6 @@ static int __tps6586x_ldo_set_voltage(struct device *parent,
        for (val = 0; val < ri->desc.n_voltages; val++) {
                uV = ri->voltages[val] * 1000;
 
-               /* LDO0 has minimal voltage 1.2 rather than 1.25 */
-               if (ri->desc.id == TPS6586X_ID_LDO_0 && val == 0)
-                       uV -= 50 * 1000;
-
                /* use the first in-range value */
                if (min_uV <= uV && uV <= max_uV) {
 
@@ -223,6 +224,10 @@ static int tps6586x_ldo_voltages[] = {
        1250, 1500, 1800, 2500, 2700, 2850, 3100, 3300,
 };
 
+static int tps6586x_ldo0_voltages[] = {
+       1200, 1500, 1800, 2500, 2700, 2850, 3100, 3300,
+};
+
 static int tps6586x_ldo4_voltages[] = {
        1700, 1725, 1750, 1775, 1800, 1825, 1850, 1875,
        1900, 1925, 1950, 1975, 2000, 2025, 2050, 2075,
@@ -284,7 +289,7 @@ static int tps6586x_dvm_voltages[] = {
 }
 
 static struct tps6586x_regulator tps6586x_regulator[] = {
-       TPS6586X_LDO(LDO_0, ldo, SUPPLYV1, 5, 3, ENC, 0, END, 0, 4000),
+       TPS6586X_LDO(LDO_0, ldo0, SUPPLYV1, 5, 3, ENC, 0, END, 0, 4000),
        TPS6586X_LDO(LDO_1, dvm, SUPPLYV1, 0, 5, ENC, 1, END, 1, 4000),
        TPS6586X_LDO(LDO_3, ldo, SUPPLYV4, 0, 3, ENC, 2, END, 2, 3000),
        TPS6586X_LDO(LDO_5, ldo, SUPPLYV6, 0, 3, ENE, 6, ENE, 6, 3000),
@@ -372,6 +377,39 @@ static int tps6586x_regulator_set_slew_rate(struct platform_device *pdev)
                        setting->slew_rate & TPS6586X_SLEW_RATE_MASK);
 }
 
+static inline int tps6586x_regulator_set_pwm_mode(struct platform_device *pdev)
+{
+       struct device *parent = pdev->dev.parent;
+       struct regulator_init_data *p = pdev->dev.platform_data;
+       struct tps6586x_settings *setting = p->driver_data;
+       int ret = 0;
+       uint8_t mask;
+
+       if (setting == NULL)
+               return 0;
+
+       switch (pdev->id) {
+       case TPS6586X_ID_SM_0:
+               mask = 1 << SM0_PWM_BIT;
+               break;
+       case TPS6586X_ID_SM_1:
+               mask = 1 << SM1_PWM_BIT;
+               break;
+       case TPS6586X_ID_SM_2:
+               mask = 1 << SM2_PWM_BIT;
+               break;
+       default:
+               /* not all regulators have PWM/PFM option */
+               return 0;
+       }
+
+       if (setting->sm_pwm_mode == PWM_ONLY)
+               ret = tps6586x_set_bits(parent, TPS6586X_SMODE1, mask);
+       else if (setting->sm_pwm_mode == AUTO_PWM_PFM)
+               ret = tps6586x_clr_bits(parent, TPS6586X_SMODE1, mask);
+
+       return ret;
+}
 static inline struct tps6586x_regulator *find_regulator_info(int id)
 {
        struct tps6586x_regulator *ri;
@@ -392,7 +430,7 @@ static int __devinit tps6586x_regulator_probe(struct platform_device *pdev)
        int id = pdev->id;
        int err;
 
-       dev_dbg(&pdev->dev, "Probing reulator %d\n", id);
+       dev_dbg(&pdev->dev, "Probing regulator %d\n", id);
 
        ri = find_regulator_info(id);
        if (ri == NULL) {
@@ -414,7 +452,11 @@ static int __devinit tps6586x_regulator_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, rdev);
 
-       return tps6586x_regulator_set_slew_rate(pdev);
+       err = tps6586x_regulator_set_slew_rate(pdev);
+       if (err)
+               return err;
+
+       return tps6586x_regulator_set_pwm_mode(pdev);
 }
 
 static int __devexit tps6586x_regulator_remove(struct platform_device *pdev)