qcom-cpufreq: Register cooling device in ready callback
Thermal cooling device has to be registered when the policy for a CPU is ready. Cpufreq will get a callback when a cpufreq policy is ready and register CPU cooling device as a part of this callback, so that the CPU can be mitigated immediately if needed. Ignore cpu cooling device registration when there is platform cooling device available. Change-Id: I7cfb8598aa8ead4091a617da3faddf86ff0fe6a8 Signed-off-by: Ram Chandrasekar <rkumbako@codeaurora.org> Signed-off-by: Manaf Meethalavalappu Pallikunhi <manafm@codeaurora.org> [avilaj@codeaurora.org: Modify to support 4.19 API changes] Signed-off-by: Jonathan Avila <avilaj@codeaurora.org>
This commit is contained in:
committed by
Jonathan Avila
parent
96871e06b0
commit
6eebbaf2d7
@@ -19,10 +19,13 @@
|
|||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
#include <linux/cpu_cooling.h>
|
||||||
#include <trace/events/power.h>
|
#include <trace/events/power.h>
|
||||||
|
|
||||||
static DEFINE_MUTEX(l2bw_lock);
|
static DEFINE_MUTEX(l2bw_lock);
|
||||||
|
|
||||||
|
static struct thermal_cooling_device *cdev[NR_CPUS];
|
||||||
static struct clk *cpu_clk[NR_CPUS];
|
static struct clk *cpu_clk[NR_CPUS];
|
||||||
static struct clk *l2_clk;
|
static struct clk *l2_clk;
|
||||||
static DEFINE_PER_CPU(struct cpufreq_frequency_table *, freq_table);
|
static DEFINE_PER_CPU(struct cpufreq_frequency_table *, freq_table);
|
||||||
@@ -299,6 +302,41 @@ static struct freq_attr *msm_freq_attr[] = {
|
|||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void msm_cpufreq_ready(struct cpufreq_policy *policy)
|
||||||
|
{
|
||||||
|
struct device_node *np, *lmh_node;
|
||||||
|
unsigned int cpu = policy->cpu;
|
||||||
|
|
||||||
|
if (cdev[cpu])
|
||||||
|
return;
|
||||||
|
|
||||||
|
np = of_cpu_device_node_get(cpu);
|
||||||
|
if (WARN_ON(!np))
|
||||||
|
return;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For now, just loading the cooling device;
|
||||||
|
* thermal DT code takes care of matching them.
|
||||||
|
*/
|
||||||
|
if (of_find_property(np, "#cooling-cells", NULL)) {
|
||||||
|
lmh_node = of_parse_phandle(np, "qcom,lmh-dcvs", 0);
|
||||||
|
if (lmh_node) {
|
||||||
|
of_node_put(lmh_node);
|
||||||
|
goto ready_exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
cdev[cpu] = of_cpufreq_cooling_register(policy);
|
||||||
|
if (IS_ERR(cdev[cpu])) {
|
||||||
|
pr_err("running cpufreq for CPU%d without cooling dev: %ld\n",
|
||||||
|
cpu, PTR_ERR(cdev[cpu]));
|
||||||
|
cdev[cpu] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ready_exit:
|
||||||
|
of_node_put(np);
|
||||||
|
}
|
||||||
|
|
||||||
static struct cpufreq_driver msm_cpufreq_driver = {
|
static struct cpufreq_driver msm_cpufreq_driver = {
|
||||||
/* lps calculations are handled here. */
|
/* lps calculations are handled here. */
|
||||||
.flags = CPUFREQ_STICKY | CPUFREQ_CONST_LOOPS |
|
.flags = CPUFREQ_STICKY | CPUFREQ_CONST_LOOPS |
|
||||||
@@ -310,6 +348,7 @@ static struct cpufreq_driver msm_cpufreq_driver = {
|
|||||||
.get = msm_cpufreq_get_freq,
|
.get = msm_cpufreq_get_freq,
|
||||||
.name = "msm",
|
.name = "msm",
|
||||||
.attr = msm_freq_attr,
|
.attr = msm_freq_attr,
|
||||||
|
.ready = msm_cpufreq_ready,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct cpufreq_frequency_table *cpufreq_parse_dt(struct device *dev,
|
static struct cpufreq_frequency_table *cpufreq_parse_dt(struct device *dev,
|
||||||
|
|||||||
Reference in New Issue
Block a user