diff options
author | Axel Lin <axel.lin@ingics.com> | 2013-04-10 02:46:20 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2013-04-16 07:23:27 -0400 |
commit | 241896ce8d112f10dae5538be41fad9eeb9e5e46 (patch) | |
tree | 153ba7a7da953356171e09eb0cd37a9477d61c01 /drivers/regulator/ab8500.c | |
parent | 375dc9c141b4d62b92bb171817039ef764c61d9f (diff) |
regulator: ab8500: Optimize ab8540_aux3_regulator_get_voltage_sel
We can save a register read operation in some case if read
expand_register first.
If info->expand_register.voltage_mask bit is set, no need to read
voltage_reg.
Signed-off-by: Axel Lin <axel.lin@ingics.com>
Acked-by: Bengt Jonsson <bengt.g.jonsson@stericsson.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'drivers/regulator/ab8500.c')
-rw-r--r-- | drivers/regulator/ab8500.c | 42 |
1 files changed, 18 insertions, 24 deletions
diff --git a/drivers/regulator/ab8500.c b/drivers/regulator/ab8500.c index 0a62ef942cfb..29a727ca399b 100644 --- a/drivers/regulator/ab8500.c +++ b/drivers/regulator/ab8500.c | |||
@@ -521,7 +521,7 @@ static int ab8500_regulator_get_voltage_sel(struct regulator_dev *rdev) | |||
521 | 521 | ||
522 | static int ab8540_aux3_regulator_get_voltage_sel(struct regulator_dev *rdev) | 522 | static int ab8540_aux3_regulator_get_voltage_sel(struct regulator_dev *rdev) |
523 | { | 523 | { |
524 | int ret, val; | 524 | int ret; |
525 | struct ab8500_regulator_info *info = rdev_get_drvdata(rdev); | 525 | struct ab8500_regulator_info *info = rdev_get_drvdata(rdev); |
526 | u8 regval, regval_expand; | 526 | u8 regval, regval_expand; |
527 | 527 | ||
@@ -531,18 +531,25 @@ static int ab8540_aux3_regulator_get_voltage_sel(struct regulator_dev *rdev) | |||
531 | } | 531 | } |
532 | 532 | ||
533 | ret = abx500_get_register_interruptible(info->dev, | 533 | ret = abx500_get_register_interruptible(info->dev, |
534 | info->voltage_bank, info->voltage_reg, ®val); | 534 | info->expand_register.voltage_bank, |
535 | 535 | info->expand_register.voltage_reg, ®val_expand); | |
536 | if (ret < 0) { | 536 | if (ret < 0) { |
537 | dev_err(rdev_get_dev(rdev), | 537 | dev_err(rdev_get_dev(rdev), |
538 | "couldn't read voltage reg for regulator\n"); | 538 | "couldn't read voltage expand reg for regulator\n"); |
539 | return ret; | 539 | return ret; |
540 | } | 540 | } |
541 | 541 | ||
542 | ret = abx500_get_register_interruptible(info->dev, | 542 | dev_vdbg(rdev_get_dev(rdev), |
543 | info->expand_register.voltage_bank, | 543 | "%s-get_voltage expand (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x\n", |
544 | info->expand_register.voltage_reg, ®val_expand); | 544 | info->desc.name, info->expand_register.voltage_bank, |
545 | info->expand_register.voltage_reg, | ||
546 | info->expand_register.voltage_mask, regval_expand); | ||
545 | 547 | ||
548 | if (regval_expand & info->expand_register.voltage_mask) | ||
549 | return info->expand_register.voltage_limit; | ||
550 | |||
551 | ret = abx500_get_register_interruptible(info->dev, | ||
552 | info->voltage_bank, info->voltage_reg, ®val); | ||
546 | if (ret < 0) { | 553 | if (ret < 0) { |
547 | dev_err(rdev_get_dev(rdev), | 554 | dev_err(rdev_get_dev(rdev), |
548 | "couldn't read voltage reg for regulator\n"); | 555 | "couldn't read voltage reg for regulator\n"); |
@@ -550,24 +557,11 @@ static int ab8540_aux3_regulator_get_voltage_sel(struct regulator_dev *rdev) | |||
550 | } | 557 | } |
551 | 558 | ||
552 | dev_vdbg(rdev_get_dev(rdev), | 559 | dev_vdbg(rdev_get_dev(rdev), |
553 | "%s-get_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x," | 560 | "%s-get_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x\n", |
554 | " 0x%x\n", | 561 | info->desc.name, info->voltage_bank, info->voltage_reg, |
555 | info->desc.name, info->voltage_bank, info->voltage_reg, | 562 | info->voltage_mask, regval); |
556 | info->voltage_mask, regval); | ||
557 | dev_vdbg(rdev_get_dev(rdev), | ||
558 | "%s-get_voltage expand (bank, reg, mask, value): 0x%x, 0x%x, 0x%x," | ||
559 | " 0x%x\n", | ||
560 | info->desc.name, info->expand_register.voltage_bank, | ||
561 | info->expand_register.voltage_reg, | ||
562 | info->expand_register.voltage_mask, regval_expand); | ||
563 | |||
564 | if (regval_expand&(info->expand_register.voltage_mask)) | ||
565 | /* Vaux3 has a different layout */ | ||
566 | val = info->expand_register.voltage_limit; | ||
567 | else | ||
568 | val = (regval & info->voltage_mask) >> info->voltage_shift; | ||
569 | 563 | ||
570 | return val; | 564 | return (regval & info->voltage_mask) >> info->voltage_shift; |
571 | } | 565 | } |
572 | 566 | ||
573 | static int ab8500_regulator_set_voltage_sel(struct regulator_dev *rdev, | 567 | static int ab8500_regulator_set_voltage_sel(struct regulator_dev *rdev, |