regulator: palmas: fix build warnings
[linux-2.6.git] / drivers / regulator / max8907c-regulator.c
index 9471b75..7d4b31f 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/err.h>
 #include <linux/platform_device.h>
 #include <linux/regulator/driver.h>
+#include <linux/regulator/machine.h>
 #include <linux/mfd/max8907c.h>
 #include <linux/regulator/max8907c-regulator.h>
 
@@ -29,7 +30,9 @@ struct max8907c_regulator_info {
        u32 max_uV;
        u32 step_uV;
        u8 reg_base;
+       u32 enable_time_us;
        struct regulator_desc desc;
+       struct i2c_client *i2c;
 };
 
 #define REG_LDO(ids, base, min, max, step) \
@@ -128,6 +131,7 @@ static int max8907c_regulator_out5v_enable(struct regulator_dev *dev);
 static int max8907c_regulator_ldo_disable(struct regulator_dev *dev);
 static int max8907c_regulator_out5v_disable(struct regulator_dev *dev);
 static int max8907c_regulator_ldo_is_enabled(struct regulator_dev *dev);
+static int max8907c_regulator_ldo_enable_time(struct regulator_dev *dev);
 static int max8907c_regulator_out5v_is_enabled(struct regulator_dev *dev);
 
 static struct regulator_ops max8907c_ldo_ops = {
@@ -137,6 +141,7 @@ static struct regulator_ops max8907c_ldo_ops = {
        .enable = max8907c_regulator_ldo_enable,
        .disable = max8907c_regulator_ldo_disable,
        .is_enabled = max8907c_regulator_ldo_is_enabled,
+       .enable_time = max8907c_regulator_ldo_enable_time,
 };
 
 static struct regulator_ops max8907c_fixed_ops = {
@@ -209,7 +214,6 @@ static int max8907c_regulator_ldo_set_voltage(struct regulator_dev *rdev,
                                              int min_uV, int max_uV)
 {
        const struct max8907c_regulator_info *info = rdev_get_drvdata(rdev);
-       struct device *parent = rdev_get_dev(rdev)->parent->parent;
        int val;
 
        if (min_uV < info->min_uV || max_uV > info->max_uV)
@@ -217,14 +221,13 @@ static int max8907c_regulator_ldo_set_voltage(struct regulator_dev *rdev,
 
        val = (min_uV - info->min_uV) / info->step_uV;
 
-       return max8907c_reg_write(parent, info->reg_base + MAX8907C_VOUT, val);
+       return max8907c_reg_write(info->i2c, info->reg_base + MAX8907C_VOUT, val);
 }
 
 static int max8907c_regulator_bbat_set_voltage(struct regulator_dev *rdev,
                                               int min_uV, int max_uV)
 {
        const struct max8907c_regulator_info *info = rdev_get_drvdata(rdev);
-       struct device *parent = rdev_get_dev(rdev)->parent->parent;
        int val;
 
        if (min_uV < info->min_uV || max_uV > info->max_uV)
@@ -232,17 +235,16 @@ static int max8907c_regulator_bbat_set_voltage(struct regulator_dev *rdev,
 
        val = (min_uV - info->min_uV) / info->step_uV;
 
-       return max8907c_set_bits(parent, info->reg_base, MAX8907C_MASK_VBBATTCV,
+       return max8907c_set_bits(info->i2c, info->reg_base, MAX8907C_MASK_VBBATTCV,
                                 val);
 }
 
 static int max8907c_regulator_ldo_get_voltage(struct regulator_dev *rdev)
 {
        const struct max8907c_regulator_info *info = rdev_get_drvdata(rdev);
-       struct device *parent = rdev_get_dev(rdev)->parent->parent;
        int val;
 
-       val = max8907c_reg_read(parent, info->reg_base + MAX8907C_VOUT);
+       val = max8907c_reg_read(info->i2c, info->reg_base + MAX8907C_VOUT);
        return val * info->step_uV + info->min_uV;
 }
 
@@ -256,11 +258,10 @@ static int max8907c_regulator_fixed_get_voltage(struct regulator_dev *rdev)
 static int max8907c_regulator_bbat_get_voltage(struct regulator_dev *rdev)
 {
        const struct max8907c_regulator_info *info = rdev_get_drvdata(rdev);
-       struct device *parent = rdev_get_dev(rdev)->parent->parent;
        int val;
 
        val =
-           max8907c_reg_read(parent, info->reg_base) & MAX8907C_MASK_VBBATTCV;
+           max8907c_reg_read(info->i2c, info->reg_base) & MAX8907C_MASK_VBBATTCV;
        return val * info->step_uV + info->min_uV;
 }
 
@@ -268,30 +269,27 @@ static int max8907c_regulator_wled_set_current_limit(struct regulator_dev *rdev,
                                                     int min_uA, int max_uA)
 {
        const struct max8907c_regulator_info *info = rdev_get_drvdata(rdev);
-       struct device *parent = rdev_get_dev(rdev)->parent->parent;
 
        if (min_uA > 25500)
                return -EDOM;
 
-       return max8907c_reg_write(parent, info->reg_base, min_uA / 100);
+       return max8907c_reg_write(info->i2c, info->reg_base, min_uA / 100);
 }
 
 static int max8907c_regulator_wled_get_current_limit(struct regulator_dev *rdev)
 {
        const struct max8907c_regulator_info *info = rdev_get_drvdata(rdev);
-       struct device *parent = rdev_get_dev(rdev)->parent->parent;
        int val;
 
-       val = max8907c_reg_read(parent, info->reg_base);
+       val = max8907c_reg_read(info->i2c, info->reg_base);
        return val * 100;
 }
 
 static int max8907c_regulator_ldo_enable(struct regulator_dev *rdev)
 {
        const struct max8907c_regulator_info *info = rdev_get_drvdata(rdev);
-       struct device *parent = rdev_get_dev(rdev)->parent->parent;
 
-       return max8907c_set_bits(parent, info->reg_base + MAX8907C_CTL,
+       return max8907c_set_bits(info->i2c, info->reg_base + MAX8907C_CTL,
                                 MAX8907C_MASK_LDO_EN | MAX8907C_MASK_LDO_SEQ,
                                 MAX8907C_MASK_LDO_EN | MAX8907C_MASK_LDO_SEQ);
 }
@@ -299,9 +297,8 @@ static int max8907c_regulator_ldo_enable(struct regulator_dev *rdev)
 static int max8907c_regulator_out5v_enable(struct regulator_dev *rdev)
 {
        const struct max8907c_regulator_info *info = rdev_get_drvdata(rdev);
-       struct device *parent = rdev_get_dev(rdev)->parent->parent;
 
-       return max8907c_set_bits(parent, info->reg_base,
+       return max8907c_set_bits(info->i2c, info->reg_base,
                                 MAX8907C_MASK_OUT5V_VINEN |
                                 MAX8907C_MASK_OUT5V_ENSRC |
                                 MAX8907C_MASK_OUT5V_EN,
@@ -312,9 +309,8 @@ static int max8907c_regulator_out5v_enable(struct regulator_dev *rdev)
 static int max8907c_regulator_ldo_disable(struct regulator_dev *rdev)
 {
        const struct max8907c_regulator_info *info = rdev_get_drvdata(rdev);
-       struct device *parent = rdev_get_dev(rdev)->parent->parent;
 
-       return max8907c_set_bits(parent, info->reg_base + MAX8907C_CTL,
+       return max8907c_set_bits(info->i2c, info->reg_base + MAX8907C_CTL,
                                 MAX8907C_MASK_LDO_EN | MAX8907C_MASK_LDO_SEQ,
                                 MAX8907C_MASK_LDO_SEQ);
 }
@@ -322,9 +318,8 @@ static int max8907c_regulator_ldo_disable(struct regulator_dev *rdev)
 static int max8907c_regulator_out5v_disable(struct regulator_dev *rdev)
 {
        const struct max8907c_regulator_info *info = rdev_get_drvdata(rdev);
-       struct device *parent = rdev_get_dev(rdev)->parent->parent;
 
-       return max8907c_set_bits(parent, info->reg_base,
+       return max8907c_set_bits(info->i2c, info->reg_base,
                                 MAX8907C_MASK_OUT5V_VINEN |
                                 MAX8907C_MASK_OUT5V_ENSRC |
                                 MAX8907C_MASK_OUT5V_EN,
@@ -334,23 +329,28 @@ static int max8907c_regulator_out5v_disable(struct regulator_dev *rdev)
 static int max8907c_regulator_ldo_is_enabled(struct regulator_dev *rdev)
 {
        const struct max8907c_regulator_info *info = rdev_get_drvdata(rdev);
-       struct device *parent = rdev_get_dev(rdev)->parent->parent;
        int val;
 
-       val = max8907c_reg_read(parent, info->reg_base + MAX8907C_CTL);
+       val = max8907c_reg_read(info->i2c, info->reg_base + MAX8907C_CTL);
        if (val < 0)
                return -EDOM;
 
        return (val & MAX8907C_MASK_LDO_EN) || !(val & MAX8907C_MASK_LDO_SEQ);
 }
 
+static int max8907c_regulator_ldo_enable_time(struct regulator_dev *rdev)
+{
+       struct max8907c_regulator_info *info = rdev_get_drvdata(rdev);
+
+       return info->enable_time_us;
+}
+
 static int max8907c_regulator_out5v_is_enabled(struct regulator_dev *rdev)
 {
        const struct max8907c_regulator_info *info = rdev_get_drvdata(rdev);
-       struct device *parent = rdev_get_dev(rdev)->parent->parent;
        int val;
 
-       val = max8907c_reg_read(parent, info->reg_base);
+       val = max8907c_reg_read(info->i2c, info->reg_base);
        if (val < 0)
                return -EDOM;
 
@@ -365,12 +365,15 @@ static int max8907c_regulator_out5v_is_enabled(struct regulator_dev *rdev)
 
 static int max8907c_regulator_probe(struct platform_device *pdev)
 {
+       struct max8907c *max8907c = dev_get_drvdata(pdev->dev.parent);
        struct max8907c_regulator_info *info;
        struct regulator_dev *rdev;
+       struct regulator_init_data *p = pdev->dev.platform_data;
+       struct max8907c_chip_regulator_data *chip_data = p->driver_data;;
        u8 version;
 
        /* Backwards compatibility with max8907b, SD1 uses different voltages */
-       version = max8907c_reg_read(pdev->dev.parent, MAX8907C_REG_II2RR);
+       version = max8907c_reg_read(max8907c->i2c_power, MAX8907C_REG_II2RR);
        if ((version & MAX8907C_II2RR_VERSION_MASK) == MAX8907C_II2RR_VERSION_REV_B) {
                max8907c_regulators[MAX8907C_SD1].min_uV = 637500;
                max8907c_regulators[MAX8907C_SD1].max_uV = 1425000;
@@ -378,9 +381,13 @@ static int max8907c_regulator_probe(struct platform_device *pdev)
        }
 
        info = &max8907c_regulators[pdev->id];
+       info->i2c = max8907c->i2c_power;
+
+       if (chip_data != NULL)
+               info->enable_time_us = chip_data->enable_time_us;
 
-       rdev = regulator_register(&info->desc,
-                                 &pdev->dev, pdev->dev.platform_data, info);
+       rdev = regulator_register(&info->desc, &pdev->dev,
+                               pdev->dev.platform_data, info, NULL);
        if (IS_ERR(rdev)) {
                dev_err(&pdev->dev, "Cannot register regulator \"%s\", %ld\n",
                        info->desc.name, PTR_ERR(rdev));