mirror of
https://github.com/torvalds/linux.git
synced 2024-12-28 05:41:55 +00:00
OPP: Provide a simple implementation to configure multiple clocks
This provides a simple implementation to configure multiple clocks for a device. Tested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
This commit is contained in:
parent
f123ea7451
commit
8174a3a613
@ -843,6 +843,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)
|
||||
|
@ -159,6 +159,9 @@ int dev_pm_opp_unregister_notifier(struct device *dev, struct notifier_block *nb
|
||||
int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config);
|
||||
int devm_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config);
|
||||
void dev_pm_opp_clear_config(int token);
|
||||
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);
|
||||
|
||||
struct dev_pm_opp *dev_pm_opp_xlate_required_opp(struct opp_table *src_table, struct opp_table *dst_table, struct dev_pm_opp *src_opp);
|
||||
int dev_pm_opp_xlate_performance_state(struct opp_table *src_table, struct opp_table *dst_table, unsigned int pstate);
|
||||
@ -342,6 +345,13 @@ static inline int devm_pm_opp_set_config(struct device *dev, struct dev_pm_opp_c
|
||||
|
||||
static inline void dev_pm_opp_clear_config(int token) {}
|
||||
|
||||
static inline 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)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline struct dev_pm_opp *dev_pm_opp_xlate_required_opp(struct opp_table *src_table,
|
||||
struct opp_table *dst_table, struct dev_pm_opp *src_opp)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user