diff options
| -rw-r--r-- | drivers/regulator/helpers.c | 48 | ||||
| -rw-r--r-- | include/linux/regulator/driver.h | 8 |
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 | } |
| 45 | EXPORT_SYMBOL_GPL(regulator_is_enabled_regmap); | 52 | EXPORT_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 | }; |
