diff options
author | Viresh Kumar <viresh.kumar@linaro.org> | 2022-06-10 12:37:25 +0530 |
---|---|---|
committer | Viresh Kumar <viresh.kumar@linaro.org> | 2022-06-24 10:53:13 +0530 |
commit | 9715181d17b4309cc4813ae7793fe6cef43a0bc5 (patch) | |
tree | 46a4eb6e100bcdbbae8e916aa86310714b071be2 /drivers/opp | |
parent | 23cc3338971a1bcff3e7cb5e602e624479f9162e (diff) | |
download | linux-next-9715181d17b4309cc4813ae7793fe6cef43a0bc5.tar.gz |
OPP: Provide a simple implementation to configure multiple clocks
This provides a simple implementation to configure multiple clocks for a
device.
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Diffstat (limited to 'drivers/opp')
-rw-r--r-- | drivers/opp/core.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/drivers/opp/core.c b/drivers/opp/core.c index bb74aedcb955..2d95d9472ef7 100644 --- a/drivers/opp/core.c +++ b/drivers/opp/core.c @@ -839,6 +839,40 @@ _opp_config_clk_single(struct device *dev, struct opp_table *opp_table, return ret; } +/* + * Simple implementation for configuring multiple clocks. Configure clocks in + * the order in which they are present in the array while scaling up. + */ +int dev_pm_opp_config_clks_simple(struct device *dev, + struct opp_table *opp_table, struct dev_pm_opp *opp, void *data, + bool scaling_down) +{ + int ret, i; + + if (scaling_down) { + for (i = opp_table->clk_count - 1; i >= 0; i--) { + ret = clk_set_rate(opp_table->clks[i], opp->rates[i]); + if (ret) { + dev_err(dev, "%s: failed to set clock rate: %d\n", __func__, + ret); + return ret; + } + } + } else { + for (i = 0; i < opp_table->clk_count; i++) { + ret = clk_set_rate(opp_table->clks[i], opp->rates[i]); + if (ret) { + dev_err(dev, "%s: failed to set clock rate: %d\n", __func__, + ret); + return ret; + } + } + } + + return ret; +} +EXPORT_SYMBOL_GPL(dev_pm_opp_config_clks_simple); + static int _opp_config_regulator_single(struct device *dev, struct dev_pm_opp *old_opp, struct dev_pm_opp *new_opp, struct regulator **regulators, unsigned int count) |