aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/opp
diff options
context:
space:
mode:
authorViresh Kumar <viresh.kumar@linaro.org>2018-11-02 05:06:42 -0400
committerViresh Kumar <viresh.kumar@linaro.org>2018-12-14 05:58:09 -0500
commitc8a59103e22b191e363fc0a90e08515a915b278d (patch)
tree5cf817834776a2d0b22a9d52d95da02dd71165d8 /drivers/opp
parent699e21e4170add1c4c954838d94feec2014ee83c (diff)
OPP: Add dev_pm_opp_xlate_performance_state() helper
dev_pm_genpd_set_performance_state() needs to handle performance state propagation going forward. Currently this routine only gets the required performance state of the device's genpd as an argument, but it doesn't know how to translate that to master genpd(s) of the device's genpd. Introduce a new helper dev_pm_opp_xlate_performance_state() which will be used to translate from performance state of a device (or genpd sub-domain) to another device (or master genpd). Normally the src_table (of genpd sub-domain) will have the "required_opps" property set to point to one of the OPPs in the dst_table (of master genpd), but in some cases the genpd and its master have one to one mapping of performance states and so none of them have the "required-opps" property set. Return the performance state of the src_table as it is in such cases. Tested-by: Rajendra Nayak <rnayak@codeaurora.org> Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Diffstat (limited to 'drivers/opp')
-rw-r--r--drivers/opp/core.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/drivers/opp/core.c b/drivers/opp/core.c
index 0eaa954b3f6c..eec1b60d7781 100644
--- a/drivers/opp/core.c
+++ b/drivers/opp/core.c
@@ -1708,6 +1708,69 @@ void dev_pm_opp_put_genpd_virt_dev(struct opp_table *opp_table,
1708} 1708}
1709 1709
1710/** 1710/**
1711 * dev_pm_opp_xlate_performance_state() - Find required OPP's pstate for src_table.
1712 * @src_table: OPP table which has dst_table as one of its required OPP table.
1713 * @dst_table: Required OPP table of the src_table.
1714 * @pstate: Current performance state of the src_table.
1715 *
1716 * This Returns pstate of the OPP (present in @dst_table) pointed out by the
1717 * "required-opps" property of the OPP (present in @src_table) which has
1718 * performance state set to @pstate.
1719 *
1720 * Return: Zero or positive performance state on success, otherwise negative
1721 * value on errors.
1722 */
1723int dev_pm_opp_xlate_performance_state(struct opp_table *src_table,
1724 struct opp_table *dst_table,
1725 unsigned int pstate)
1726{
1727 struct dev_pm_opp *opp;
1728 int dest_pstate = -EINVAL;
1729 int i;
1730
1731 if (!pstate)
1732 return 0;
1733
1734 /*
1735 * Normally the src_table will have the "required_opps" property set to
1736 * point to one of the OPPs in the dst_table, but in some cases the
1737 * genpd and its master have one to one mapping of performance states
1738 * and so none of them have the "required-opps" property set. Return the
1739 * pstate of the src_table as it is in such cases.
1740 */
1741 if (!src_table->required_opp_count)
1742 return pstate;
1743
1744 for (i = 0; i < src_table->required_opp_count; i++) {
1745 if (src_table->required_opp_tables[i]->np == dst_table->np)
1746 break;
1747 }
1748
1749 if (unlikely(i == src_table->required_opp_count)) {
1750 pr_err("%s: Couldn't find matching OPP table (%p: %p)\n",
1751 __func__, src_table, dst_table);
1752 return -EINVAL;
1753 }
1754
1755 mutex_lock(&src_table->lock);
1756
1757 list_for_each_entry(opp, &src_table->opp_list, node) {
1758 if (opp->pstate == pstate) {
1759 dest_pstate = opp->required_opps[i]->pstate;
1760 goto unlock;
1761 }
1762 }
1763
1764 pr_err("%s: Couldn't find matching OPP (%p: %p)\n", __func__, src_table,
1765 dst_table);
1766
1767unlock:
1768 mutex_unlock(&src_table->lock);
1769
1770 return dest_pstate;
1771}
1772
1773/**
1711 * dev_pm_opp_add() - Add an OPP table from a table definitions 1774 * dev_pm_opp_add() - Add an OPP table from a table definitions
1712 * @dev: device for which we do this operation 1775 * @dev: device for which we do this operation
1713 * @freq: Frequency in Hz for this OPP 1776 * @freq: Frequency in Hz for this OPP