generic: 6.1: add pending OPP set opp improvement patch
Add pending OPP set opp improvement patch to better handle _set_opp function in clock scaling. Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
This commit is contained in:
		| @@ -0,0 +1,117 @@ | ||||
| From fd59b838dd90452f61a17dc9e5ff175205003068 Mon Sep 17 00:00:00 2001 | ||||
| From: Christian Marangi <ansuelsmth@gmail.com> | ||||
| Date: Thu, 15 Sep 2022 18:49:43 +0200 | ||||
| Subject: [PATCH] OPP: Provide old opp to config_clks on _set_opp | ||||
|  | ||||
| With the target opp, also pass the old opp to config_clks function. | ||||
| This can be useful when a driver needs to take decision on what fequency | ||||
| to set based on what is the current frequency without using a | ||||
| clk_get_freq call. | ||||
| Update the only user of custom config_clks (tegra30 devfreq driver) to | ||||
| this new implementation. | ||||
|  | ||||
| Signed-off-by: Christian Marangi <ansuelsmth@gmail.com> | ||||
| --- | ||||
|  drivers/devfreq/tegra30-devfreq.c |  5 +++-- | ||||
|  drivers/opp/core.c                | 11 ++++++----- | ||||
|  include/linux/pm_opp.h            | 11 ++++++----- | ||||
|  3 files changed, 15 insertions(+), 12 deletions(-) | ||||
|  | ||||
| diff --git a/drivers/devfreq/tegra30-devfreq.c b/drivers/devfreq/tegra30-devfreq.c | ||||
| index 503376b894b6..92cdb6bf9a89 100644 | ||||
| --- a/drivers/devfreq/tegra30-devfreq.c | ||||
| +++ b/drivers/devfreq/tegra30-devfreq.c | ||||
| @@ -823,8 +823,9 @@ static int devm_tegra_devfreq_init_hw(struct device *dev, | ||||
|   | ||||
|  static int tegra_devfreq_config_clks_nop(struct device *dev, | ||||
|  					 struct opp_table *opp_table, | ||||
| -					 struct dev_pm_opp *opp, void *data, | ||||
| -					 bool scaling_down) | ||||
| +					 struct dev_pm_opp *old_opp, | ||||
| +					 struct dev_pm_opp *opp, | ||||
| +					 void *data, bool scaling_down) | ||||
|  { | ||||
|  	/* We want to skip clk configuration via dev_pm_opp_set_opp() */ | ||||
|  	return 0; | ||||
| diff --git a/drivers/opp/core.c b/drivers/opp/core.c | ||||
| index e87567dbe99f..2f44ceaf8d3c 100644 | ||||
| --- a/drivers/opp/core.c | ||||
| +++ b/drivers/opp/core.c | ||||
| @@ -816,7 +816,8 @@ static int _set_opp_voltage(struct device *dev, struct regulator *reg, | ||||
|   | ||||
|  static int | ||||
|  _opp_config_clk_single(struct device *dev, struct opp_table *opp_table, | ||||
| -		       struct dev_pm_opp *opp, void *data, bool scaling_down) | ||||
| +		       struct dev_pm_opp *old_opp, struct dev_pm_opp *opp, | ||||
| +		       void *data, bool scaling_down) | ||||
|  { | ||||
|  	unsigned long *target = data; | ||||
|  	unsigned long freq; | ||||
| @@ -848,8 +849,8 @@ _opp_config_clk_single(struct device *dev, struct opp_table *opp_table, | ||||
|   * 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) | ||||
| +		struct opp_table *opp_table, struct dev_pm_opp *old_opp, | ||||
| +		struct dev_pm_opp *opp, void *data, bool scaling_down) | ||||
|  { | ||||
|  	int ret, i; | ||||
|   | ||||
| @@ -1121,7 +1122,7 @@ static int _set_opp(struct device *dev, struct opp_table *opp_table, | ||||
|  	} | ||||
|   | ||||
|  	if (opp_table->config_clks) { | ||||
| -		ret = opp_table->config_clks(dev, opp_table, opp, clk_data, scaling_down); | ||||
| +		ret = opp_table->config_clks(dev, opp_table, old_opp, opp, clk_data, scaling_down); | ||||
|  		if (ret) | ||||
|  			return ret; | ||||
|  	} | ||||
| @@ -1196,7 +1197,7 @@ int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq) | ||||
|  		 * equivalent to a clk_set_rate() | ||||
|  		 */ | ||||
|  		if (!_get_opp_count(opp_table)) { | ||||
| -			ret = opp_table->config_clks(dev, opp_table, NULL, | ||||
| +			ret = opp_table->config_clks(dev, opp_table, NULL, NULL, | ||||
|  						     &target_freq, false); | ||||
|  			goto put_opp_table; | ||||
|  		} | ||||
| diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h | ||||
| index dc1fb5890792..6c24a4f9fc49 100644 | ||||
| --- a/include/linux/pm_opp.h | ||||
| +++ b/include/linux/pm_opp.h | ||||
| @@ -61,7 +61,8 @@ typedef int (*config_regulators_t)(struct device *dev, | ||||
|  			struct dev_pm_opp *old_opp, struct dev_pm_opp *new_opp, | ||||
|  			struct regulator **regulators, unsigned int count); | ||||
|   | ||||
| -typedef int (*config_clks_t)(struct device *dev, struct opp_table *opp_table, | ||||
| +typedef int (*config_clks_t)(struct device *dev, | ||||
| +			struct opp_table *opp_table, struct dev_pm_opp *old_opp,  | ||||
|  			struct dev_pm_opp *opp, void *data, bool scaling_down); | ||||
|   | ||||
|  /** | ||||
| @@ -160,8 +161,8 @@ 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 opp_table *opp_table, struct dev_pm_opp *old_opp, | ||||
| +		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); | ||||
| @@ -346,8 +347,8 @@ 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) | ||||
| +		struct opp_table *opp_table, struct dev_pm_opp *old_opp, | ||||
| +		struct dev_pm_opp *opp, void *data, bool scaling_down) | ||||
|  { | ||||
|  	return -EOPNOTSUPP; | ||||
|  } | ||||
| --  | ||||
| 2.37.2 | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Christian Marangi
					Christian Marangi