aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAndrew-sh.Cheng <andrew-sh.cheng@mediatek.com>2019-03-29 02:46:10 -0400
committerViresh Kumar <viresh.kumar@linaro.org>2019-04-10 02:43:31 -0400
commit2f36bde0fc8f1ab79d54bd2caa7c1cf874fd2206 (patch)
treea48df1456492be0d18de709395bfca06fdc9d261 /drivers
parent9e98c678c2d6ae3a17cb2de55d17f69dddaa231b (diff)
OPP: Introduce dev_pm_opp_find_freq_ceil_by_volt()
This patch introduces a new helper routine in the OPP core, which returns the OPP with the highest frequency which has voltage less than or equal to the target voltage passed to the helper. Signed-off-by: Andrew-sh.Cheng <andrew-sh.cheng@mediatek.com> [ Viresh: Massaged the commit log and renamed the helper with some cleanups. ] Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/opp/core.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/drivers/opp/core.c b/drivers/opp/core.c
index 0420f7e8ad5b..0e7703fe733f 100644
--- a/drivers/opp/core.c
+++ b/drivers/opp/core.c
@@ -526,6 +526,60 @@ struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
526} 526}
527EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_floor); 527EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_floor);
528 528
529/**
530 * dev_pm_opp_find_freq_ceil_by_volt() - Find OPP with highest frequency for
531 * target voltage.
532 * @dev: Device for which we do this operation.
533 * @u_volt: Target voltage.
534 *
535 * Search for OPP with highest (ceil) frequency and has voltage <= u_volt.
536 *
537 * Return: matching *opp, else returns ERR_PTR in case of error which should be
538 * handled using IS_ERR.
539 *
540 * Error return values can be:
541 * EINVAL: bad parameters
542 *
543 * The callers are required to call dev_pm_opp_put() for the returned OPP after
544 * use.
545 */
546struct dev_pm_opp *dev_pm_opp_find_freq_ceil_by_volt(struct device *dev,
547 unsigned long u_volt)
548{
549 struct opp_table *opp_table;
550 struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE);
551
552 if (!dev || !u_volt) {
553 dev_err(dev, "%s: Invalid argument volt=%lu\n", __func__,
554 u_volt);
555 return ERR_PTR(-EINVAL);
556 }
557
558 opp_table = _find_opp_table(dev);
559 if (IS_ERR(opp_table))
560 return ERR_CAST(opp_table);
561
562 mutex_lock(&opp_table->lock);
563
564 list_for_each_entry(temp_opp, &opp_table->opp_list, node) {
565 if (temp_opp->available) {
566 if (temp_opp->supplies[0].u_volt > u_volt)
567 break;
568 opp = temp_opp;
569 }
570 }
571
572 /* Increment the reference count of OPP */
573 if (!IS_ERR(opp))
574 dev_pm_opp_get(opp);
575
576 mutex_unlock(&opp_table->lock);
577 dev_pm_opp_put_opp_table(opp_table);
578
579 return opp;
580}
581EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_ceil_by_volt);
582
529static int _set_opp_voltage(struct device *dev, struct regulator *reg, 583static int _set_opp_voltage(struct device *dev, struct regulator *reg,
530 struct dev_pm_opp_supply *supply) 584 struct dev_pm_opp_supply *supply)
531{ 585{