]> Pileus Git - ~andy/linux/blobdiff - drivers/regulator/tps6586x-regulator.c
ext2: Implement freezing
[~andy/linux] / drivers / regulator / tps6586x-regulator.c
index cfc1f16f777125152678dfbdef3402d28e80c1cd..c0a214575380020473f593f43beb8c34bbe7fed5 100644 (file)
@@ -75,8 +75,7 @@ static inline struct device *to_tps6586x_dev(struct regulator_dev *rdev)
        return rdev_get_dev(rdev)->parent->parent;
 }
 
-static int tps6586x_ldo_list_voltage(struct regulator_dev *rdev,
-                                    unsigned selector)
+static int tps6586x_list_voltage(struct regulator_dev *rdev, unsigned selector)
 {
        struct tps6586x_regulator *info = rdev_get_drvdata(rdev);
        int rid = rdev_get_id(rdev);
@@ -89,47 +88,34 @@ static int tps6586x_ldo_list_voltage(struct regulator_dev *rdev,
 }
 
 
-static int __tps6586x_ldo_set_voltage(struct device *parent,
-                                     struct tps6586x_regulator *ri,
-                                     int min_uV, int max_uV,
-                                     unsigned *selector)
+static int tps6586x_set_voltage_sel(struct regulator_dev *rdev,
+                                   unsigned selector)
 {
-       int val, uV;
+       struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
+       struct device *parent = to_tps6586x_dev(rdev);
+       int ret, val, rid = rdev_get_id(rdev);
        uint8_t mask;
 
-       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) {
-
-                       *selector = val;
+       val = selector << ri->volt_shift;
+       mask = ((1 << ri->volt_nbits) - 1) << ri->volt_shift;
 
-                       val <<= ri->volt_shift;
-                       mask = ((1 << ri->volt_nbits) - 1) << ri->volt_shift;
+       ret = tps6586x_update(parent, ri->volt_reg, val, mask);
+       if (ret)
+               return ret;
 
-                       return tps6586x_update(parent, ri->volt_reg, val, mask);
-               }
+       /* Update go bit for DVM regulators */
+       switch (rid) {
+       case TPS6586X_ID_LDO_2:
+       case TPS6586X_ID_LDO_4:
+       case TPS6586X_ID_SM_0:
+       case TPS6586X_ID_SM_1:
+               ret = tps6586x_set_bits(parent, ri->go_reg, 1 << ri->go_bit);
+               break;
        }
-
-       return -EINVAL;
-}
-
-static int tps6586x_ldo_set_voltage(struct regulator_dev *rdev,
-                                   int min_uV, int max_uV, unsigned *selector)
-{
-       struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
-       struct device *parent = to_tps6586x_dev(rdev);
-
-       return __tps6586x_ldo_set_voltage(parent, ri, min_uV, max_uV,
-                                         selector);
+       return ret;
 }
 
-static int tps6586x_ldo_get_voltage(struct regulator_dev *rdev)
+static int tps6586x_get_voltage_sel(struct regulator_dev *rdev)
 {
        struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
        struct device *parent = to_tps6586x_dev(rdev);
@@ -146,22 +132,7 @@ static int tps6586x_ldo_get_voltage(struct regulator_dev *rdev)
        if (val >= ri->desc.n_voltages)
                BUG();
 
-       return ri->voltages[val] * 1000;
-}
-
-static int tps6586x_dvm_set_voltage(struct regulator_dev *rdev,
-                                   int min_uV, int max_uV, unsigned *selector)
-{
-       struct tps6586x_regulator *ri = rdev_get_drvdata(rdev);
-       struct device *parent = to_tps6586x_dev(rdev);
-       int ret;
-
-       ret = __tps6586x_ldo_set_voltage(parent, ri, min_uV, max_uV,
-                                        selector);
-       if (ret)
-               return ret;
-
-       return tps6586x_set_bits(parent, ri->go_reg, 1 << ri->go_bit);
+       return val;
 }
 
 static int tps6586x_regulator_enable(struct regulator_dev *rdev)
@@ -196,20 +167,10 @@ static int tps6586x_regulator_is_enabled(struct regulator_dev *rdev)
        return !!(reg_val & (1 << ri->enable_bit[0]));
 }
 
-static struct regulator_ops tps6586x_regulator_ldo_ops = {
-       .list_voltage = tps6586x_ldo_list_voltage,
-       .get_voltage = tps6586x_ldo_get_voltage,
-       .set_voltage = tps6586x_ldo_set_voltage,
-
-       .is_enabled = tps6586x_regulator_is_enabled,
-       .enable = tps6586x_regulator_enable,
-       .disable = tps6586x_regulator_disable,
-};
-
-static struct regulator_ops tps6586x_regulator_dvm_ops = {
-       .list_voltage = tps6586x_ldo_list_voltage,
-       .get_voltage = tps6586x_ldo_get_voltage,
-       .set_voltage = tps6586x_dvm_set_voltage,
+static struct regulator_ops tps6586x_regulator_ops = {
+       .list_voltage = tps6586x_list_voltage,
+       .get_voltage_sel = tps6586x_get_voltage_sel,
+       .set_voltage_sel = tps6586x_set_voltage_sel,
 
        .is_enabled = tps6586x_regulator_is_enabled,
        .enable = tps6586x_regulator_enable,
@@ -241,11 +202,11 @@ static int tps6586x_dvm_voltages[] = {
        1325, 1350, 1375, 1400, 1425, 1450, 1475, 1500,
 };
 
-#define TPS6586X_REGULATOR(_id, vdata, _ops, vreg, shift, nbits,       \
+#define TPS6586X_REGULATOR(_id, vdata, vreg, shift, nbits,             \
                           ereg0, ebit0, ereg1, ebit1)                  \
        .desc   = {                                                     \
                .name   = "REG-" #_id,                                  \
-               .ops    = &tps6586x_regulator_##_ops,                   \
+               .ops    = &tps6586x_regulator_ops,                      \
                .type   = REGULATOR_VOLTAGE,                            \
                .id     = TPS6586X_ID_##_id,                            \
                .n_voltages = ARRAY_SIZE(tps6586x_##vdata##_voltages),  \
@@ -267,14 +228,14 @@ static int tps6586x_dvm_voltages[] = {
 #define TPS6586X_LDO(_id, vdata, vreg, shift, nbits,                   \
                     ereg0, ebit0, ereg1, ebit1)                        \
 {                                                                      \
-       TPS6586X_REGULATOR(_id, vdata, ldo_ops, vreg, shift, nbits,     \
+       TPS6586X_REGULATOR(_id, vdata, vreg, shift, nbits,              \
                           ereg0, ebit0, ereg1, ebit1)                  \
 }
 
 #define TPS6586X_DVM(_id, vdata, vreg, shift, nbits,                   \
                     ereg0, ebit0, ereg1, ebit1, goreg, gobit)          \
 {                                                                      \
-       TPS6586X_REGULATOR(_id, vdata, dvm_ops, vreg, shift, nbits,     \
+       TPS6586X_REGULATOR(_id, vdata, vreg, shift, nbits,              \
                           ereg0, ebit0, ereg1, ebit1)                  \
        TPS6586X_REGULATOR_DVM_GOREG(goreg, gobit)                      \
 }
@@ -384,6 +345,7 @@ static inline struct tps6586x_regulator *find_regulator_info(int id)
 static int __devinit tps6586x_regulator_probe(struct platform_device *pdev)
 {
        struct tps6586x_regulator *ri = NULL;
+       struct regulator_config config = { };
        struct regulator_dev *rdev;
        int id = pdev->id;
        int err;
@@ -400,8 +362,12 @@ static int __devinit tps6586x_regulator_probe(struct platform_device *pdev)
        if (err)
                return err;
 
-       rdev = regulator_register(&ri->desc, &pdev->dev,
-                                 pdev->dev.platform_data, ri, NULL);
+       config.dev = &pdev->dev;
+       config.of_node = pdev->dev.of_node;
+       config.init_data = pdev->dev.platform_data;
+       config.driver_data = ri;
+
+       rdev = regulator_register(&ri->desc, &config);
        if (IS_ERR(rdev)) {
                dev_err(&pdev->dev, "failed to register regulator %s\n",
                                ri->desc.name);