CHROMIUM: regulator: s5m8767: Enable configureable opmodes.
authorTodd Broch <tbroch@chromium.org>
Fri, 8 Feb 2013 22:21:53 +0000 (14:21 -0800)
committerChromeBot <chrome-bot@google.com>
Mon, 11 Feb 2013 16:37:41 +0000 (08:37 -0800)
Allow the voltage regulators operating mode to be configured via
device tree node 'reg_op_mode'.  Previously operating modes were set
to 0x3 (always on) which is still the default for systems not using
device tree.

BUG=chrome-os-partner:16430
TEST=compile & boot kernel

Signed-off-by: Todd Broch <tbroch@chromium.org>
Change-Id: I474d92330854251dfc47a45a14eb0bc5af3e7889
Reviewed-on: https://gerrit.chromium.org/gerrit/42953
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
drivers/regulator/s5m8767.c

index ad7d8fc..77afda0 100644 (file)
@@ -24,7 +24,9 @@
 #include <linux/mfd/s5m87xx/s5m-core.h>
 #include <linux/mfd/s5m87xx/s5m-pmic.h>
 
-#define S5M8767_OPMODE_MASK                    0x3
+#define S5M8767_OPMODE_MASK    0x3
+#define S5M8767_OPMODE_SHIFT   6
+#define S5M8767_OPMODE_SM       (S5M8767_OPMODE_MASK << S5M8767_OPMODE_SHIFT)
 
 struct s5m8767_info {
        struct device *dev;
@@ -144,9 +146,25 @@ static int s5m8767_list_voltage(struct regulator_dev *rdev,
        return val;
 }
 
-static int s5m8767_get_register(struct regulator_dev *rdev, int *reg)
+static int s5m8767_get_register(struct regulator_dev *rdev,
+                               int *reg, int *pattern)
 {
        int reg_id = rdev_get_id(rdev);
+       struct s5m8767_info *s5m8767 = rdev_get_drvdata(rdev);
+       int i;
+       int op_mode = 0x3;
+       for (i = 0; i < s5m8767->iodev->pdata->num_regulators; i++)
+               if (reg_id == s5m8767->iodev->pdata->regulators[i].id)
+                       break;
+
+       if (i == s5m8767->iodev->pdata->num_regulators) {
+               dev_err(s5m8767->iodev->dev, "No matching regulators\n");
+               return -ENODEV;
+       }
+#ifdef CONFIG_OF
+       op_mode = s5m8767->iodev->pdata->regulators[i].reg_op_mode;
+#endif
+       *pattern = op_mode << S5M8767_OPMODE_SHIFT;
 
        switch (reg_id) {
        case S5M8767_LDO1 ... S5M8767_LDO2:
@@ -177,11 +195,10 @@ static int s5m8767_get_register(struct regulator_dev *rdev, int *reg)
 static int s5m8767_reg_is_enabled(struct regulator_dev *rdev)
 {
        struct s5m8767_info *s5m8767 = rdev_get_drvdata(rdev);
-       int ret, reg;
-       int mask = 0xc0, pattern = 0xc0;
+       int ret, reg, pattern;
        u8 val;
 
-       ret = s5m8767_get_register(rdev, &reg);
+       ret = s5m8767_get_register(rdev, &reg, &pattern);
        if (ret == -EINVAL)
                return 1;
        else if (ret)
@@ -191,33 +208,31 @@ static int s5m8767_reg_is_enabled(struct regulator_dev *rdev)
        if (ret)
                return ret;
 
-       return (val & mask) == pattern;
+       return (val & S5M8767_OPMODE_SM) == pattern;
 }
 
 static int s5m8767_reg_enable(struct regulator_dev *rdev)
 {
        struct s5m8767_info *s5m8767 = rdev_get_drvdata(rdev);
-       int ret, reg;
-       int mask = 0xc0, pattern = 0xc0;
+       int ret, reg, pattern;
 
-       ret = s5m8767_get_register(rdev, &reg);
+       ret = s5m8767_get_register(rdev, &reg, &pattern);
        if (ret)
                return ret;
 
-       return s5m_reg_update(s5m8767->iodev, reg, pattern, mask);
+       return s5m_reg_update(s5m8767->iodev, reg, pattern, S5M8767_OPMODE_SM);
 }
 
 static int s5m8767_reg_disable(struct regulator_dev *rdev)
 {
        struct s5m8767_info *s5m8767 = rdev_get_drvdata(rdev);
-       int ret, reg;
-       int  mask = 0xc0, pattern = 0xc0;
+       int ret, reg, pattern;
 
-       ret = s5m8767_get_register(rdev, &reg);
+       ret = s5m8767_get_register(rdev, &reg, &pattern);
        if (ret)
                return ret;
 
-       return s5m_reg_update(s5m8767->iodev, reg, ~pattern, mask);
+       return s5m_reg_update(s5m8767->iodev, reg, ~pattern, S5M8767_OPMODE_SM);
 }
 
 static int s5m8767_get_voltage_register(struct regulator_dev *rdev, int *_reg)