regulator: regulator driver for Palmas series chips
[linux-2.6.git] / drivers / regulator / max8907c-regulator.c
index 2982568..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,6 +30,7 @@ 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;
 };
@@ -129,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 = {
@@ -138,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 = {
@@ -334,6 +338,13 @@ static int max8907c_regulator_ldo_is_enabled(struct regulator_dev *rdev)
        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);
@@ -357,6 +368,8 @@ 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 */
@@ -370,6 +383,9 @@ 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, NULL);
        if (IS_ERR(rdev)) {