generic: 6.1: add pending OPP set opp improvement patch
authorChristian Marangi <ansuelsmth@gmail.com>
Tue, 18 Oct 2022 23:12:04 +0000 (01:12 +0200)
committerChristian Marangi <ansuelsmth@gmail.com>
Mon, 22 May 2023 20:28:16 +0000 (22:28 +0200)
Add pending OPP set opp improvement patch to better handle _set_opp
function in clock scaling.

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
target/linux/generic/pending-6.1/802-OPP-Provide-old-opp-to-config_clks-on-_set_opp.patch [new file with mode: 0644]

diff --git a/target/linux/generic/pending-6.1/802-OPP-Provide-old-opp-to-config_clks-on-_set_opp.patch b/target/linux/generic/pending-6.1/802-OPP-Provide-old-opp-to-config_clks-on-_set_opp.patch
new file mode 100644 (file)
index 0000000..477b10c
--- /dev/null
@@ -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
+