Commit f5f263fe authored by Viresh Kumar's avatar Viresh Kumar Committed by Rafael J. Wysocki

cpu_cooling: Make of_cpufreq_power_cooling_register() parse DT

All the callers of of_cpufreq_power_cooling_register() have almost
identical code and it makes more sense to move that code into the helper
as its all about reading DT properties.

This got rid of lot of redundant code.
Acked-by: default avatarEduardo Valentin <edubezval@gmail.com>
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent ae64f9bd
...@@ -51,8 +51,7 @@ Dynamic power). "plat_static_func" is a function to calculate the ...@@ -51,8 +51,7 @@ Dynamic power). "plat_static_func" is a function to calculate the
static power consumed by these cpus (See 2.2 Static power). static power consumed by these cpus (See 2.2 Static power).
1.1.4 struct thermal_cooling_device *of_cpufreq_power_cooling_register( 1.1.4 struct thermal_cooling_device *of_cpufreq_power_cooling_register(
struct device_node *np, const struct cpumask *clip_cpus, u32 capacitance, struct cpufreq_policy *policy)
get_static_t plat_static_func)
Similar to cpufreq_power_cooling_register, this function register a Similar to cpufreq_power_cooling_register, this function register a
cpufreq cooling device with power extensions using the device tree cpufreq cooling device with power extensions using the device tree
...@@ -76,8 +75,8 @@ cpu. If you are using CONFIG_CPUFREQ_DT then the ...@@ -76,8 +75,8 @@ cpu. If you are using CONFIG_CPUFREQ_DT then the
device. device.
The `plat_static_func` parameter of `cpufreq_power_cooling_register()` The `plat_static_func` parameter of `cpufreq_power_cooling_register()`
and `of_cpufreq_power_cooling_register()` is optional. If you don't is optional. If you don't provide it, only dynamic power will be
provide it, only dynamic power will be considered. considered.
2.1 Dynamic power 2.1 Dynamic power
......
...@@ -526,34 +526,13 @@ static int bL_cpufreq_exit(struct cpufreq_policy *policy) ...@@ -526,34 +526,13 @@ static int bL_cpufreq_exit(struct cpufreq_policy *policy)
static void bL_cpufreq_ready(struct cpufreq_policy *policy) static void bL_cpufreq_ready(struct cpufreq_policy *policy)
{ {
struct device *cpu_dev = get_cpu_device(policy->cpu);
int cur_cluster = cpu_to_cluster(policy->cpu); int cur_cluster = cpu_to_cluster(policy->cpu);
struct device_node *np;
/* Do not register a cpu_cooling device if we are in IKS mode */ /* Do not register a cpu_cooling device if we are in IKS mode */
if (cur_cluster >= MAX_CLUSTERS) if (cur_cluster >= MAX_CLUSTERS)
return; return;
np = of_node_get(cpu_dev->of_node); cdev[cur_cluster] = of_cpufreq_power_cooling_register(policy);
if (WARN_ON(!np))
return;
if (of_find_property(np, "#cooling-cells", NULL)) {
u32 power_coefficient = 0;
of_property_read_u32(np, "dynamic-power-coefficient",
&power_coefficient);
cdev[cur_cluster] = of_cpufreq_power_cooling_register(np,
policy, power_coefficient, NULL);
if (IS_ERR(cdev[cur_cluster])) {
dev_err(cpu_dev,
"running cpufreq without cooling device: %ld\n",
PTR_ERR(cdev[cur_cluster]));
cdev[cur_cluster] = NULL;
}
}
of_node_put(np);
} }
static struct cpufreq_driver bL_cpufreq_driver = { static struct cpufreq_driver bL_cpufreq_driver = {
......
...@@ -319,33 +319,8 @@ static int cpufreq_exit(struct cpufreq_policy *policy) ...@@ -319,33 +319,8 @@ static int cpufreq_exit(struct cpufreq_policy *policy)
static void cpufreq_ready(struct cpufreq_policy *policy) static void cpufreq_ready(struct cpufreq_policy *policy)
{ {
struct private_data *priv = policy->driver_data; struct private_data *priv = policy->driver_data;
struct device_node *np = of_node_get(priv->cpu_dev->of_node);
if (WARN_ON(!np)) priv->cdev = of_cpufreq_power_cooling_register(policy);
return;
/*
* For now, just loading the cooling device;
* thermal DT code takes care of matching them.
*/
if (of_find_property(np, "#cooling-cells", NULL)) {
u32 power_coefficient = 0;
of_property_read_u32(np, "dynamic-power-coefficient",
&power_coefficient);
priv->cdev = of_cpufreq_power_cooling_register(np,
policy, power_coefficient, NULL);
if (IS_ERR(priv->cdev)) {
dev_err(priv->cpu_dev,
"running cpufreq without cooling device: %ld\n",
PTR_ERR(priv->cdev));
priv->cdev = NULL;
}
}
of_node_put(np);
} }
static struct cpufreq_driver dt_cpufreq_driver = { static struct cpufreq_driver dt_cpufreq_driver = {
......
...@@ -310,28 +310,8 @@ static int mtk_cpufreq_set_target(struct cpufreq_policy *policy, ...@@ -310,28 +310,8 @@ static int mtk_cpufreq_set_target(struct cpufreq_policy *policy,
static void mtk_cpufreq_ready(struct cpufreq_policy *policy) static void mtk_cpufreq_ready(struct cpufreq_policy *policy)
{ {
struct mtk_cpu_dvfs_info *info = policy->driver_data; struct mtk_cpu_dvfs_info *info = policy->driver_data;
struct device_node *np = of_node_get(info->cpu_dev->of_node);
u32 capacitance = 0;
if (WARN_ON(!np)) info->cdev = of_cpufreq_power_cooling_register(policy);
return;
if (of_find_property(np, "#cooling-cells", NULL)) {
of_property_read_u32(np, DYNAMIC_POWER, &capacitance);
info->cdev = of_cpufreq_power_cooling_register(np,
policy, capacitance, NULL);
if (IS_ERR(info->cdev)) {
dev_err(info->cpu_dev,
"running cpufreq without cooling device: %ld\n",
PTR_ERR(info->cdev));
info->cdev = NULL;
}
}
of_node_put(np);
} }
static int mtk_cpu_dvfs_info_init(struct mtk_cpu_dvfs_info *info, int cpu) static int mtk_cpu_dvfs_info_init(struct mtk_cpu_dvfs_info *info, int cpu)
......
...@@ -275,20 +275,8 @@ static int qoriq_cpufreq_target(struct cpufreq_policy *policy, ...@@ -275,20 +275,8 @@ static int qoriq_cpufreq_target(struct cpufreq_policy *policy,
static void qoriq_cpufreq_ready(struct cpufreq_policy *policy) static void qoriq_cpufreq_ready(struct cpufreq_policy *policy)
{ {
struct cpu_data *cpud = policy->driver_data; struct cpu_data *cpud = policy->driver_data;
struct device_node *np = of_get_cpu_node(policy->cpu, NULL);
if (of_find_property(np, "#cooling-cells", NULL)) { cpud->cdev = of_cpufreq_power_cooling_register(policy);
cpud->cdev = of_cpufreq_cooling_register(np, policy);
if (IS_ERR(cpud->cdev) && PTR_ERR(cpud->cdev) != -ENOSYS) {
pr_err("cpu%d is not running as cooling device: %ld\n",
policy->cpu, PTR_ERR(cpud->cdev));
cpud->cdev = NULL;
}
}
of_node_put(np);
} }
static struct cpufreq_driver qoriq_cpufreq_driver = { static struct cpufreq_driver qoriq_cpufreq_driver = {
......
...@@ -873,38 +873,51 @@ EXPORT_SYMBOL(cpufreq_power_cooling_register); ...@@ -873,38 +873,51 @@ EXPORT_SYMBOL(cpufreq_power_cooling_register);
/** /**
* of_cpufreq_power_cooling_register() - create cpufreq cooling device with power extensions * of_cpufreq_power_cooling_register() - create cpufreq cooling device with power extensions
* @np: a valid struct device_node to the cooling device device tree node * @policy: CPUFreq policy.
* @policy: cpufreq policy
* @capacitance: dynamic power coefficient for these cpus
* @plat_static_func: function to calculate the static power consumed by these
* cpus (optional)
* *
* This interface function registers the cpufreq cooling device with * This interface function registers the cpufreq cooling device with
* the name "thermal-cpufreq-%x". This api can support multiple * the name "thermal-cpufreq-%x". This api can support multiple
* instances of cpufreq cooling devices. Using this API, the cpufreq * instances of cpufreq cooling devices. Using this API, the cpufreq
* cooling device will be linked to the device tree node provided. * cooling device will be linked to the device tree node of the provided
* policy's CPU.
* Using this function, the cooling device will implement the power * Using this function, the cooling device will implement the power
* extensions by using a simple cpu power model. The cpus must have * extensions by using a simple cpu power model. The cpus must have
* registered their OPPs using the OPP library. * registered their OPPs using the OPP library.
* *
* An optional @plat_static_func may be provided to calculate the * It also takes into account, if property present in policy CPU node, the
* static power consumed by these cpus. If the platform's static * static power consumed by the cpu.
* power consumption is unknown or negligible, make it NULL.
* *
* Return: a valid struct thermal_cooling_device pointer on success, * Return: a valid struct thermal_cooling_device pointer on success,
* on failure, it returns a corresponding ERR_PTR(). * and NULL on failure.
*/ */
struct thermal_cooling_device * struct thermal_cooling_device *
of_cpufreq_power_cooling_register(struct device_node *np, of_cpufreq_power_cooling_register(struct cpufreq_policy *policy)
struct cpufreq_policy *policy,
u32 capacitance,
get_static_t plat_static_func)
{ {
if (!np) struct device_node *np = of_get_cpu_node(policy->cpu, NULL);
return ERR_PTR(-EINVAL); struct thermal_cooling_device *cdev = NULL;
u32 capacitance = 0;
if (!np) {
pr_err("cpu_cooling: OF node not available for cpu%d\n",
policy->cpu);
return NULL;
}
return __cpufreq_cooling_register(np, policy, capacitance, if (of_find_property(np, "#cooling-cells", NULL)) {
plat_static_func); of_property_read_u32(np, "dynamic-power-coefficient",
&capacitance);
cdev = __cpufreq_cooling_register(np, policy, capacitance,
NULL);
if (IS_ERR(cdev)) {
pr_err("cpu_cooling: cpu%d is not running as cooling device: %ld\n",
policy->cpu, PTR_ERR(cdev));
cdev = NULL;
}
}
of_node_put(np);
return cdev;
} }
EXPORT_SYMBOL(of_cpufreq_power_cooling_register); EXPORT_SYMBOL(of_cpufreq_power_cooling_register);
......
...@@ -56,10 +56,7 @@ of_cpufreq_cooling_register(struct device_node *np, ...@@ -56,10 +56,7 @@ of_cpufreq_cooling_register(struct device_node *np,
struct cpufreq_policy *policy); struct cpufreq_policy *policy);
struct thermal_cooling_device * struct thermal_cooling_device *
of_cpufreq_power_cooling_register(struct device_node *np, of_cpufreq_power_cooling_register(struct cpufreq_policy *policy);
struct cpufreq_policy *policy,
u32 capacitance,
get_static_t plat_static_func);
#else #else
static inline struct thermal_cooling_device * static inline struct thermal_cooling_device *
of_cpufreq_cooling_register(struct device_node *np, of_cpufreq_cooling_register(struct device_node *np,
...@@ -69,10 +66,7 @@ of_cpufreq_cooling_register(struct device_node *np, ...@@ -69,10 +66,7 @@ of_cpufreq_cooling_register(struct device_node *np,
} }
static inline struct thermal_cooling_device * static inline struct thermal_cooling_device *
of_cpufreq_power_cooling_register(struct device_node *np, of_cpufreq_power_cooling_register(struct cpufreq_policy *policy)
struct cpufreq_policy *policy,
u32 capacitance,
get_static_t plat_static_func)
{ {
return NULL; return NULL;
} }
...@@ -105,10 +99,7 @@ of_cpufreq_cooling_register(struct device_node *np, ...@@ -105,10 +99,7 @@ of_cpufreq_cooling_register(struct device_node *np,
} }
static inline struct thermal_cooling_device * static inline struct thermal_cooling_device *
of_cpufreq_power_cooling_register(struct device_node *np, of_cpufreq_power_cooling_register(struct cpufreq_policy *policy)
struct cpufreq_policy *policy,
u32 capacitance,
get_static_t plat_static_func)
{ {
return NULL; return NULL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment