aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/regulator/helpers.c48
-rw-r--r--include/linux/regulator/driver.h8
2 files changed, 40 insertions, 16 deletions
diff --git a/drivers/regulator/helpers.c b/drivers/regulator/helpers.c
index e221a271ba56..cbc39096c78d 100644
--- a/drivers/regulator/helpers.c
+++ b/drivers/regulator/helpers.c
@@ -37,10 +37,17 @@ int regulator_is_enabled_regmap(struct regulator_dev *rdev)
37 if (ret != 0) 37 if (ret != 0)
38 return ret; 38 return ret;
39 39
40 if (rdev->desc->enable_is_inverted) 40 val &= rdev->desc->enable_mask;
41 return (val & rdev->desc->enable_mask) == 0; 41
42 else 42 if (rdev->desc->enable_is_inverted) {
43 return (val & rdev->desc->enable_mask) != 0; 43 if (rdev->desc->enable_val)
44 return val != rdev->desc->enable_val;
45 return val == 0;
46 } else {
47 if (rdev->desc->enable_val)
48 return val == rdev->desc->enable_val;
49 return val != 0;
50 }
44} 51}
45EXPORT_SYMBOL_GPL(regulator_is_enabled_regmap); 52EXPORT_SYMBOL_GPL(regulator_is_enabled_regmap);
46 53
@@ -57,10 +64,13 @@ int regulator_enable_regmap(struct regulator_dev *rdev)
57{ 64{
58 unsigned int val; 65 unsigned int val;
59 66
60 if (rdev->desc->enable_is_inverted) 67 if (rdev->desc->enable_is_inverted) {
61 val = 0; 68 val = rdev->desc->disable_val;
62 else 69 } else {
63 val = rdev->desc->enable_mask; 70 val = rdev->desc->enable_val;
71 if (!val)
72 val = rdev->desc->enable_mask;
73 }
64 74
65 return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 75 return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
66 rdev->desc->enable_mask, val); 76 rdev->desc->enable_mask, val);
@@ -80,10 +90,13 @@ int regulator_disable_regmap(struct regulator_dev *rdev)
80{ 90{
81 unsigned int val; 91 unsigned int val;
82 92
83 if (rdev->desc->enable_is_inverted) 93 if (rdev->desc->enable_is_inverted) {
84 val = rdev->desc->enable_mask; 94 val = rdev->desc->enable_val;
85 else 95 if (!val)
86 val = 0; 96 val = rdev->desc->enable_mask;
97 } else {
98 val = rdev->desc->disable_val;
99 }
87 100
88 return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 101 return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
89 rdev->desc->enable_mask, val); 102 rdev->desc->enable_mask, val);
@@ -419,10 +432,13 @@ int regulator_set_bypass_regmap(struct regulator_dev *rdev, bool enable)
419{ 432{
420 unsigned int val; 433 unsigned int val;
421 434
422 if (enable) 435 if (enable) {
423 val = rdev->desc->bypass_mask; 436 val = rdev->desc->bypass_val_on;
424 else 437 if (!val)
425 val = 0; 438 val = rdev->desc->bypass_mask;
439 } else {
440 val = rdev->desc->bypass_val_off;
441 }
426 442
427 return regmap_update_bits(rdev->regmap, rdev->desc->bypass_reg, 443 return regmap_update_bits(rdev->regmap, rdev->desc->bypass_reg,
428 rdev->desc->bypass_mask, val); 444 rdev->desc->bypass_mask, val);
diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h
index 9370e65348a4..bbe03a1924c0 100644
--- a/include/linux/regulator/driver.h
+++ b/include/linux/regulator/driver.h
@@ -228,10 +228,14 @@ enum regulator_type {
228 * output when using regulator_set_voltage_sel_regmap 228 * output when using regulator_set_voltage_sel_regmap
229 * @enable_reg: Register for control when using regmap enable/disable ops 229 * @enable_reg: Register for control when using regmap enable/disable ops
230 * @enable_mask: Mask for control when using regmap enable/disable ops 230 * @enable_mask: Mask for control when using regmap enable/disable ops
231 * @enable_val: Enabling value for control when using regmap enable/disable ops
232 * @disable_val: Disabling value for control when using regmap enable/disable ops
231 * @enable_is_inverted: A flag to indicate set enable_mask bits to disable 233 * @enable_is_inverted: A flag to indicate set enable_mask bits to disable
232 * when using regulator_enable_regmap and friends APIs. 234 * when using regulator_enable_regmap and friends APIs.
233 * @bypass_reg: Register for control when using regmap set_bypass 235 * @bypass_reg: Register for control when using regmap set_bypass
234 * @bypass_mask: Mask for control when using regmap set_bypass 236 * @bypass_mask: Mask for control when using regmap set_bypass
237 * @bypass_val_on: Enabling value for control when using regmap set_bypass
238 * @bypass_val_off: Disabling value for control when using regmap set_bypass
235 * 239 *
236 * @enable_time: Time taken for initial enable of regulator (in uS). 240 * @enable_time: Time taken for initial enable of regulator (in uS).
237 */ 241 */
@@ -263,9 +267,13 @@ struct regulator_desc {
263 unsigned int apply_bit; 267 unsigned int apply_bit;
264 unsigned int enable_reg; 268 unsigned int enable_reg;
265 unsigned int enable_mask; 269 unsigned int enable_mask;
270 unsigned int enable_val;
271 unsigned int disable_val;
266 bool enable_is_inverted; 272 bool enable_is_inverted;
267 unsigned int bypass_reg; 273 unsigned int bypass_reg;
268 unsigned int bypass_mask; 274 unsigned int bypass_mask;
275 unsigned int bypass_val_on;
276 unsigned int bypass_val_off;
269 277
270 unsigned int enable_time; 278 unsigned int enable_time;
271}; 279};