mirror of
git://git.openwrt.org/openwrt/openwrt.git
synced 2025-01-05 14:16:17 +00:00
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:
parent
7f7ee27d5f
commit
ce345dd0df
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user