diff options
author | Axel Lin <axel.lin@ingics.com> | 2013-04-07 11:12:28 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2013-04-08 06:23:31 -0400 |
commit | 438e695b87e03953fc4ba1aff59feab33c9c79a7 (patch) | |
tree | 64320ec2f972748d641ab32c47c6ed5d4b8b2ed1 /drivers/regulator/ab8500.c | |
parent | cd2a55d2eb8b58672d2805388aa4a8e354381c96 (diff) |
regulator: ab8500: Get rid of is_enabled from struct ab8500_regulator_info
The intention of this patch is to simplify the code.
Maintain the is_enabled flag is not trivial, it not only needs to set/clear the
flag in disable()/enable() but also needs to set the flag in is_enable() to get
initial status. The only benefit of keeping is_enabled flag is just save a
register read when set_mode(). Remove is_enabled flag makes the code simpler.
This patch also moves ab8500_regulator_is_enabled() close to
ab8500_regulator_[en|dis]able functions.
This is required to avoid a forward declaration because now we call
ab8500_regulator_is_enabled() in ab8500_regulator_set_mode().
This change also makes the code better in readability by moving similar
functions to one place.
Signed-off-by: Axel Lin <axel.lin@ingics.com>
Acked-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers/regulator/ab8500.c')
-rw-r--r-- | drivers/regulator/ab8500.c | 72 |
1 files changed, 32 insertions, 40 deletions
diff --git a/drivers/regulator/ab8500.c b/drivers/regulator/ab8500.c index 517305e20126..9ebd131b2ec6 100644 --- a/drivers/regulator/ab8500.c +++ b/drivers/regulator/ab8500.c | |||
@@ -46,7 +46,6 @@ struct ab8500_shared_mode { | |||
46 | * @desc: regulator description | 46 | * @desc: regulator description |
47 | * @regulator_dev: regulator device | 47 | * @regulator_dev: regulator device |
48 | * @shared_mode: used when mode is shared between two regulators | 48 | * @shared_mode: used when mode is shared between two regulators |
49 | * @is_enabled: status of regulator (on/off) | ||
50 | * @load_lp_uA: maximum load in idle (low power) mode | 49 | * @load_lp_uA: maximum load in idle (low power) mode |
51 | * @update_bank: bank to control on/off | 50 | * @update_bank: bank to control on/off |
52 | * @update_reg: register to control on/off | 51 | * @update_reg: register to control on/off |
@@ -69,7 +68,6 @@ struct ab8500_regulator_info { | |||
69 | struct regulator_desc desc; | 68 | struct regulator_desc desc; |
70 | struct regulator_dev *regulator; | 69 | struct regulator_dev *regulator; |
71 | struct ab8500_shared_mode *shared_mode; | 70 | struct ab8500_shared_mode *shared_mode; |
72 | bool is_enabled; | ||
73 | int load_lp_uA; | 71 | int load_lp_uA; |
74 | u8 update_bank; | 72 | u8 update_bank; |
75 | u8 update_reg; | 73 | u8 update_reg; |
@@ -259,8 +257,6 @@ static int ab8500_regulator_enable(struct regulator_dev *rdev) | |||
259 | return ret; | 257 | return ret; |
260 | } | 258 | } |
261 | 259 | ||
262 | info->is_enabled = true; | ||
263 | |||
264 | dev_vdbg(rdev_get_dev(rdev), | 260 | dev_vdbg(rdev_get_dev(rdev), |
265 | "%s-enable (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x\n", | 261 | "%s-enable (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x\n", |
266 | info->desc.name, info->update_bank, info->update_reg, | 262 | info->desc.name, info->update_bank, info->update_reg, |
@@ -288,8 +284,6 @@ static int ab8500_regulator_disable(struct regulator_dev *rdev) | |||
288 | return ret; | 284 | return ret; |
289 | } | 285 | } |
290 | 286 | ||
291 | info->is_enabled = false; | ||
292 | |||
293 | dev_vdbg(rdev_get_dev(rdev), | 287 | dev_vdbg(rdev_get_dev(rdev), |
294 | "%s-disable (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x\n", | 288 | "%s-disable (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x\n", |
295 | info->desc.name, info->update_bank, info->update_reg, | 289 | info->desc.name, info->update_bank, info->update_reg, |
@@ -298,6 +292,37 @@ static int ab8500_regulator_disable(struct regulator_dev *rdev) | |||
298 | return ret; | 292 | return ret; |
299 | } | 293 | } |
300 | 294 | ||
295 | static int ab8500_regulator_is_enabled(struct regulator_dev *rdev) | ||
296 | { | ||
297 | int ret; | ||
298 | struct ab8500_regulator_info *info = rdev_get_drvdata(rdev); | ||
299 | u8 regval; | ||
300 | |||
301 | if (info == NULL) { | ||
302 | dev_err(rdev_get_dev(rdev), "regulator info null pointer\n"); | ||
303 | return -EINVAL; | ||
304 | } | ||
305 | |||
306 | ret = abx500_get_register_interruptible(info->dev, | ||
307 | info->update_bank, info->update_reg, ®val); | ||
308 | if (ret < 0) { | ||
309 | dev_err(rdev_get_dev(rdev), | ||
310 | "couldn't read 0x%x register\n", info->update_reg); | ||
311 | return ret; | ||
312 | } | ||
313 | |||
314 | dev_vdbg(rdev_get_dev(rdev), | ||
315 | "%s-is_enabled (bank, reg, mask, value): 0x%x, 0x%x, 0x%x," | ||
316 | " 0x%x\n", | ||
317 | info->desc.name, info->update_bank, info->update_reg, | ||
318 | info->update_mask, regval); | ||
319 | |||
320 | if (regval & info->update_mask) | ||
321 | return 1; | ||
322 | else | ||
323 | return 0; | ||
324 | } | ||
325 | |||
301 | static unsigned int ab8500_regulator_get_optimum_mode( | 326 | static unsigned int ab8500_regulator_get_optimum_mode( |
302 | struct regulator_dev *rdev, int input_uV, | 327 | struct regulator_dev *rdev, int input_uV, |
303 | int output_uV, int load_uA) | 328 | int output_uV, int load_uA) |
@@ -398,7 +423,7 @@ static int ab8500_regulator_set_mode(struct regulator_dev *rdev, | |||
398 | mask = info->update_mask; | 423 | mask = info->update_mask; |
399 | } | 424 | } |
400 | 425 | ||
401 | if (info->is_enabled || dmr) { | 426 | if (dmr || ab8500_regulator_is_enabled(rdev)) { |
402 | ret = abx500_mask_and_set_register_interruptible(info->dev, | 427 | ret = abx500_mask_and_set_register_interruptible(info->dev, |
403 | bank, reg, mask, val); | 428 | bank, reg, mask, val); |
404 | if (ret < 0) | 429 | if (ret < 0) |
@@ -464,39 +489,6 @@ static unsigned int ab8500_regulator_get_mode(struct regulator_dev *rdev) | |||
464 | return ret; | 489 | return ret; |
465 | } | 490 | } |
466 | 491 | ||
467 | static int ab8500_regulator_is_enabled(struct regulator_dev *rdev) | ||
468 | { | ||
469 | int ret; | ||
470 | struct ab8500_regulator_info *info = rdev_get_drvdata(rdev); | ||
471 | u8 regval; | ||
472 | |||
473 | if (info == NULL) { | ||
474 | dev_err(rdev_get_dev(rdev), "regulator info null pointer\n"); | ||
475 | return -EINVAL; | ||
476 | } | ||
477 | |||
478 | ret = abx500_get_register_interruptible(info->dev, | ||
479 | info->update_bank, info->update_reg, ®val); | ||
480 | if (ret < 0) { | ||
481 | dev_err(rdev_get_dev(rdev), | ||
482 | "couldn't read 0x%x register\n", info->update_reg); | ||
483 | return ret; | ||
484 | } | ||
485 | |||
486 | dev_vdbg(rdev_get_dev(rdev), | ||
487 | "%s-is_enabled (bank, reg, mask, value): 0x%x, 0x%x, 0x%x," | ||
488 | " 0x%x\n", | ||
489 | info->desc.name, info->update_bank, info->update_reg, | ||
490 | info->update_mask, regval); | ||
491 | |||
492 | if (regval & info->update_mask) | ||
493 | info->is_enabled = true; | ||
494 | else | ||
495 | info->is_enabled = false; | ||
496 | |||
497 | return info->is_enabled; | ||
498 | } | ||
499 | |||
500 | static int ab8500_regulator_get_voltage_sel(struct regulator_dev *rdev) | 492 | static int ab8500_regulator_get_voltage_sel(struct regulator_dev *rdev) |
501 | { | 493 | { |
502 | int ret, val; | 494 | int ret, val; |