Loading drivers/opp/core.c +34 −0 Original line number Diff line number Diff line Loading @@ -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) Loading include/linux/pm_opp.h +10 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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 Loading
drivers/opp/core.c +34 −0 Original line number Diff line number Diff line Loading @@ -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) Loading
include/linux/pm_opp.h +10 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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