diff options
author | Viresh Kumar <viresh.kumar@linaro.org> | 2016-02-09 00:00:34 -0500 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2016-02-09 19:11:53 -0500 |
commit | 7d34d56ef3349cd5f29cf7aab6650f3414fa81b9 (patch) | |
tree | f4080b4da251ec01a6b973a672254f7bc7dca2c6 /drivers/base/power/opp/core.c | |
parent | 9f8ea969d5cfdd4353d2adb004e8e2286b984369 (diff) |
PM / OPP: Disable OPPs that aren't supported by the regulator
Disable any OPPs where the connected regulator isn't able to provide the
specified voltage.
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Reviewed-by: Stephen Boyd <sboyd@codeaurora.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/base/power/opp/core.c')
-rw-r--r-- | drivers/base/power/opp/core.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/base/power/opp/core.c b/drivers/base/power/opp/core.c index 1e22b71abf1e..71545becfca1 100644 --- a/drivers/base/power/opp/core.c +++ b/drivers/base/power/opp/core.c | |||
@@ -687,6 +687,22 @@ static struct dev_pm_opp *_allocate_opp(struct device *dev, | |||
687 | return opp; | 687 | return opp; |
688 | } | 688 | } |
689 | 689 | ||
690 | static bool _opp_supported_by_regulators(struct dev_pm_opp *opp, | ||
691 | struct device_opp *dev_opp) | ||
692 | { | ||
693 | struct regulator *reg = dev_opp->regulator; | ||
694 | |||
695 | if (!IS_ERR(reg) && | ||
696 | !regulator_is_supported_voltage(reg, opp->u_volt_min, | ||
697 | opp->u_volt_max)) { | ||
698 | pr_warn("%s: OPP minuV: %lu maxuV: %lu, not supported by regulator\n", | ||
699 | __func__, opp->u_volt_min, opp->u_volt_max); | ||
700 | return false; | ||
701 | } | ||
702 | |||
703 | return true; | ||
704 | } | ||
705 | |||
690 | static int _opp_add(struct device *dev, struct dev_pm_opp *new_opp, | 706 | static int _opp_add(struct device *dev, struct dev_pm_opp *new_opp, |
691 | struct device_opp *dev_opp) | 707 | struct device_opp *dev_opp) |
692 | { | 708 | { |
@@ -728,6 +744,12 @@ static int _opp_add(struct device *dev, struct dev_pm_opp *new_opp, | |||
728 | dev_err(dev, "%s: Failed to register opp to debugfs (%d)\n", | 744 | dev_err(dev, "%s: Failed to register opp to debugfs (%d)\n", |
729 | __func__, ret); | 745 | __func__, ret); |
730 | 746 | ||
747 | if (!_opp_supported_by_regulators(new_opp, dev_opp)) { | ||
748 | new_opp->available = false; | ||
749 | dev_warn(dev, "%s: OPP not supported by regulators (%lu)\n", | ||
750 | __func__, new_opp->rate); | ||
751 | } | ||
752 | |||
731 | return 0; | 753 | return 0; |
732 | } | 754 | } |
733 | 755 | ||