]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge remote-tracking branch 'regulator/topic/enable-invert' into regulator-next
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Fri, 8 Mar 2013 09:45:40 +0000 (17:45 +0800)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Fri, 8 Mar 2013 09:45:40 +0000 (17:45 +0800)
drivers/regulator/88pm8607.c
drivers/regulator/core.c
drivers/regulator/max8649.c
include/linux/regulator/driver.h

index c79ab843333ee9d3eea9b46067c1c777050154f4..493948a38fcab596eb71e920277dc2b9cad22567 100644 (file)
@@ -220,35 +220,6 @@ static int pm8607_list_voltage(struct regulator_dev *rdev, unsigned index)
        return ret;
 }
 
-static int pm8606_preg_enable(struct regulator_dev *rdev)
-{
-       struct pm8607_regulator_info *info = rdev_get_drvdata(rdev);
-
-       return pm860x_set_bits(info->i2c, rdev->desc->enable_reg,
-                              1 << rdev->desc->enable_mask, 0);
-}
-
-static int pm8606_preg_disable(struct regulator_dev *rdev)
-{
-       struct pm8607_regulator_info *info = rdev_get_drvdata(rdev);
-
-       return pm860x_set_bits(info->i2c, rdev->desc->enable_reg,
-                              1 << rdev->desc->enable_mask,
-                              1 << rdev->desc->enable_mask);
-}
-
-static int pm8606_preg_is_enabled(struct regulator_dev *rdev)
-{
-       struct pm8607_regulator_info *info = rdev_get_drvdata(rdev);
-       int ret;
-
-       ret = pm860x_reg_read(info->i2c, rdev->desc->enable_reg);
-       if (ret < 0)
-               return ret;
-
-       return !((unsigned char)ret & (1 << rdev->desc->enable_mask));
-}
-
 static struct regulator_ops pm8607_regulator_ops = {
        .list_voltage   = pm8607_list_voltage,
        .set_voltage_sel = regulator_set_voltage_sel_regmap,
@@ -259,9 +230,9 @@ static struct regulator_ops pm8607_regulator_ops = {
 };
 
 static struct regulator_ops pm8606_preg_ops = {
-       .enable         = pm8606_preg_enable,
-       .disable        = pm8606_preg_disable,
-       .is_enabled     = pm8606_preg_is_enabled,
+       .enable         = regulator_enable_regmap,
+       .disable        = regulator_disable_regmap,
+       .is_enabled     = regulator_is_enabled_regmap,
 };
 
 #define PM8606_PREG(ereg, ebit)                                                \
@@ -274,6 +245,7 @@ static struct regulator_ops pm8606_preg_ops = {
                .owner  = THIS_MODULE,                                  \
                .enable_reg = PM8606_##ereg,                            \
                .enable_mask = (ebit),                                  \
+               .enable_is_inverted = true,                             \
        },                                                              \
 }
 
index da9782bd27d0a182d32578c4779481072d0657ef..d887b9f5b2135e378ed76667c0a3b7970900d47c 100644 (file)
@@ -1794,7 +1794,10 @@ int regulator_is_enabled_regmap(struct regulator_dev *rdev)
        if (ret != 0)
                return ret;
 
-       return (val & rdev->desc->enable_mask) != 0;
+       if (rdev->desc->enable_is_inverted)
+               return (val & rdev->desc->enable_mask) == 0;
+       else
+               return (val & rdev->desc->enable_mask) != 0;
 }
 EXPORT_SYMBOL_GPL(regulator_is_enabled_regmap);
 
@@ -1809,9 +1812,15 @@ EXPORT_SYMBOL_GPL(regulator_is_enabled_regmap);
  */
 int regulator_enable_regmap(struct regulator_dev *rdev)
 {
+       unsigned int val;
+
+       if (rdev->desc->enable_is_inverted)
+               val = 0;
+       else
+               val = rdev->desc->enable_mask;
+
        return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
-                                 rdev->desc->enable_mask,
-                                 rdev->desc->enable_mask);
+                                 rdev->desc->enable_mask, val);
 }
 EXPORT_SYMBOL_GPL(regulator_enable_regmap);
 
@@ -1826,8 +1835,15 @@ EXPORT_SYMBOL_GPL(regulator_enable_regmap);
  */
 int regulator_disable_regmap(struct regulator_dev *rdev)
 {
+       unsigned int val;
+
+       if (rdev->desc->enable_is_inverted)
+               val = rdev->desc->enable_mask;
+       else
+               val = 0;
+
        return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
-                                 rdev->desc->enable_mask, 0);
+                                 rdev->desc->enable_mask, val);
 }
 EXPORT_SYMBOL_GPL(regulator_disable_regmap);
 
@@ -2830,7 +2846,7 @@ EXPORT_SYMBOL_GPL(regulator_get_bypass_regmap);
  * regulator_allow_bypass - allow the regulator to go into bypass mode
  *
  * @regulator: Regulator to configure
- * @allow: enable or disable bypass mode
+ * @enable: enable or disable bypass mode
  *
  * Allow the regulator to go into bypass mode if all other consumers
  * for the regulator also enable bypass mode and the machine
index 3ca14380f22db06aba4338544cf62967d48fa900..fdb67ff9812908188c54de0ba0fb42e0ae21c217 100644 (file)
@@ -60,36 +60,6 @@ struct max8649_regulator_info {
        unsigned        ramp_down:1;
 };
 
-/* EN_PD means pulldown on EN input */
-static int max8649_enable(struct regulator_dev *rdev)
-{
-       struct max8649_regulator_info *info = rdev_get_drvdata(rdev);
-       return regmap_update_bits(info->regmap, MAX8649_CONTROL, MAX8649_EN_PD, 0);
-}
-
-/*
- * Applied internal pulldown resistor on EN input pin.
- * If pulldown EN pin outside, it would be better.
- */
-static int max8649_disable(struct regulator_dev *rdev)
-{
-       struct max8649_regulator_info *info = rdev_get_drvdata(rdev);
-       return regmap_update_bits(info->regmap, MAX8649_CONTROL, MAX8649_EN_PD,
-                               MAX8649_EN_PD);
-}
-
-static int max8649_is_enabled(struct regulator_dev *rdev)
-{
-       struct max8649_regulator_info *info = rdev_get_drvdata(rdev);
-       unsigned int val;
-       int ret;
-
-       ret = regmap_read(info->regmap, MAX8649_CONTROL, &val);
-       if (ret != 0)
-               return ret;
-       return !((unsigned char)val & MAX8649_EN_PD);
-}
-
 static int max8649_enable_time(struct regulator_dev *rdev)
 {
        struct max8649_regulator_info *info = rdev_get_drvdata(rdev);
@@ -151,9 +121,9 @@ static struct regulator_ops max8649_dcdc_ops = {
        .get_voltage_sel = regulator_get_voltage_sel_regmap,
        .list_voltage   = regulator_list_voltage_linear,
        .map_voltage    = regulator_map_voltage_linear,
-       .enable         = max8649_enable,
-       .disable        = max8649_disable,
-       .is_enabled     = max8649_is_enabled,
+       .enable         = regulator_enable_regmap,
+       .disable        = regulator_disable_regmap,
+       .is_enabled     = regulator_is_enabled_regmap,
        .enable_time    = max8649_enable_time,
        .set_mode       = max8649_set_mode,
        .get_mode       = max8649_get_mode,
@@ -169,6 +139,9 @@ static struct regulator_desc dcdc_desc = {
        .vsel_mask      = MAX8649_VOL_MASK,
        .min_uV         = MAX8649_DCDC_VMIN,
        .uV_step        = MAX8649_DCDC_STEP,
+       .enable_reg     = MAX8649_CONTROL,
+       .enable_mask    = MAX8649_EN_PD,
+       .enable_is_inverted = true,
 };
 
 static struct regmap_config max8649_regmap_config = {
index 23070fd83872004cdb91367ef1857c0d6ca04a52..07ea8f1a127e1455b9cb9b4d447a482989d31983 100644 (file)
@@ -199,6 +199,10 @@ enum regulator_type {
  *                output when using regulator_set_voltage_sel_regmap
  * @enable_reg: Register for control when using regmap enable/disable ops
  * @enable_mask: Mask for control when using regmap enable/disable ops
+ * @enable_is_inverted: A flag to indicate set enable_mask bits to disable
+ *                      when using regulator_enable_regmap and friends APIs.
+ * @bypass_reg: Register for control when using regmap set_bypass
+ * @bypass_mask: Mask for control when using regmap set_bypass
  *
  * @enable_time: Time taken for initial enable of regulator (in uS).
  */
@@ -226,6 +230,7 @@ struct regulator_desc {
        unsigned int apply_bit;
        unsigned int enable_reg;
        unsigned int enable_mask;
+       bool enable_is_inverted;
        unsigned int bypass_reg;
        unsigned int bypass_mask;