Skip to content

Commit aca48b6

Browse files
Rajendra Nayakvireshk
authored andcommitted
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 <[email protected]> Signed-off-by: Viresh Kumar <[email protected]>
1 parent 8f3d9f3 commit aca48b6

File tree

1 file changed

+14
-0
lines changed

1 file changed

+14
-0
lines changed

drivers/opp/core.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -819,6 +819,8 @@ int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
819819
if (unlikely(!target_freq)) {
820820
if (opp_table->required_opp_tables) {
821821
ret = _set_required_opps(dev, opp_table, NULL);
822+
} else if (!_get_opp_count(opp_table)) {
823+
return 0;
822824
} else {
823825
dev_err(dev, "target frequency can't be 0\n");
824826
ret = -EINVAL;
@@ -849,6 +851,18 @@ int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
849851
goto put_opp_table;
850852
}
851853

854+
/*
855+
* For IO devices which require an OPP on some platforms/SoCs
856+
* while just needing to scale the clock on some others
857+
* we look for empty OPP tables with just a clock handle and
858+
* scale only the clk. This makes dev_pm_opp_set_rate()
859+
* equivalent to a clk_set_rate()
860+
*/
861+
if (!_get_opp_count(opp_table)) {
862+
ret = _generic_set_opp_clk_only(dev, clk, freq);
863+
goto put_opp_table;
864+
}
865+
852866
temp_freq = old_freq;
853867
old_opp = _find_freq_ceil(opp_table, &temp_freq);
854868
if (IS_ERR(old_opp)) {

0 commit comments

Comments
 (0)