Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

opp: Manage empty OPP tables with clk handle

With OPP core now supporting DVFS for IO devices, we have instances of
IO devices (same IP block) which require an OPP on some platforms/SoCs
while just needing to scale the clock on some others.

In order to avoid conditional code in every driver which supports such
devices (to check for availability of OPPs and then deciding to do
either dev_pm_opp_set_rate() or clk_set_rate()) add support to manage
empty OPP tables with a clk handle.

This makes dev_pm_opp_set_rate() equivalent of a clk_set_rate() for
devices with just a clk and no OPPs specified, and makes
dev_pm_opp_set_rate(0) bail out without throwing an error.

Signed-off-by: Rajendra Nayak <rnayak@codeaurora.org>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>

authored by

Rajendra Nayak and committed by
Viresh Kumar
aca48b61 8f3d9f35

+14
+14
drivers/opp/core.c
··· 819 819 if (unlikely(!target_freq)) { 820 820 if (opp_table->required_opp_tables) { 821 821 ret = _set_required_opps(dev, opp_table, NULL); 822 + } else if (!_get_opp_count(opp_table)) { 823 + return 0; 822 824 } else { 823 825 dev_err(dev, "target frequency can't be 0\n"); 824 826 ret = -EINVAL; ··· 848 846 dev_dbg(dev, "%s: old/new frequencies (%lu Hz) are same, nothing to do\n", 849 847 __func__, freq); 850 848 ret = 0; 849 + goto put_opp_table; 850 + } 851 + 852 + /* 853 + * For IO devices which require an OPP on some platforms/SoCs 854 + * while just needing to scale the clock on some others 855 + * we look for empty OPP tables with just a clock handle and 856 + * scale only the clk. This makes dev_pm_opp_set_rate() 857 + * equivalent to a clk_set_rate() 858 + */ 859 + if (!_get_opp_count(opp_table)) { 860 + ret = _generic_set_opp_clk_only(dev, clk, freq); 851 861 goto put_opp_table; 852 862 } 853 863