Skip to content

Commit

Permalink
PM / OPP: Disable OPPs that aren't supported by the regulator
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Viresh Kumar authored and Rafael J. Wysocki committed Feb 10, 2016
1 parent 9f8ea96 commit 7d34d56
Showing 1 changed file with 22 additions and 0 deletions.
22 changes: 22 additions & 0 deletions drivers/base/power/opp/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -687,6 +687,22 @@ static struct dev_pm_opp *_allocate_opp(struct device *dev,
return opp;
}

static bool _opp_supported_by_regulators(struct dev_pm_opp *opp,
struct device_opp *dev_opp)
{
struct regulator *reg = dev_opp->regulator;

if (!IS_ERR(reg) &&
!regulator_is_supported_voltage(reg, opp->u_volt_min,
opp->u_volt_max)) {
pr_warn("%s: OPP minuV: %lu maxuV: %lu, not supported by regulator\n",
__func__, opp->u_volt_min, opp->u_volt_max);
return false;
}

return true;
}

static int _opp_add(struct device *dev, struct dev_pm_opp *new_opp,
struct device_opp *dev_opp)
{
Expand Down Expand Up @@ -728,6 +744,12 @@ static int _opp_add(struct device *dev, struct dev_pm_opp *new_opp,
dev_err(dev, "%s: Failed to register opp to debugfs (%d)\n",
__func__, ret);

if (!_opp_supported_by_regulators(new_opp, dev_opp)) {
new_opp->available = false;
dev_warn(dev, "%s: OPP not supported by regulators (%lu)\n",
__func__, new_opp->rate);
}

return 0;
}

Expand Down

0 comments on commit 7d34d56

Please sign in to comment.