regulator: max8907: Add driver specific data for regulator
Alok Chauhan [Fri, 17 Feb 2012 09:47:38 +0000 (14:47 +0530)]
Adding the regulator driver specific information and passing
this information through regulator driver data. This struture
is containing delay operation which is require to voltage to
be settle down after enabling rail.

Bug 939242

Change-Id: I7da6ec487fe5f04857d3fd5f06a383b4a8fbcc7b
Signed-off-by: Alok Chauhan <alokc@nvidia.com>
Reviewed-on: http://git-master/r/94500
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Venkat Moganty <vmoganty@nvidia.com>
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>

drivers/regulator/max8907c-regulator.c
include/linux/regulator/max8907c-regulator.h

index 925f161..bc86f92 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);
        if (IS_ERR(rdev)) {
index ddc5f0a..4d071b9 100644 (file)
 #define MAX8907C_VRTC   27
 #define MAX8907C_WLED   27
 
+/*
+ * struct max8907c_chip_regulator_data - max8907c chip regulator data.
+ *
+ * @enable_time_us: microseconds delay required after enabling rail regulator.
+ */
+struct max8907c_chip_regulator_data {
+       int enable_time_us;
+};
 #endif