summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/thermal/cpu_cooling.c53
1 files changed, 25 insertions, 28 deletions
diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c
index 67ec52d5f7fc..11735dba1456 100644
--- a/drivers/thermal/cpu_cooling.c
+++ b/drivers/thermal/cpu_cooling.c
@@ -62,6 +62,16 @@ struct freq_table {
};
/**
+ * struct time_in_idle - Idle time stats
+ * @time: previous reading of the absolute time that this cpu was idle
+ * @timestamp: wall time of the last invocation of get_cpu_idle_time_us()
+ */
+struct time_in_idle {
+ u64 time;
+ u64 timestamp;
+};
+
+/**
* struct cpufreq_cooling_device - data for cooling device with cpufreq
* @id: unique integer value corresponding to each cpufreq_cooling_device
* registered.
@@ -76,9 +86,7 @@ struct freq_table {
* cpufreq frequencies.
* @node: list_head to link all cpufreq_cooling_device together.
* @last_load: load measured by the latest call to cpufreq_get_requested_power()
- * @time_in_idle: previous reading of the absolute time that this cpu was idle
- * @time_in_idle_timestamp: wall time of the last invocation of
- * get_cpu_idle_time_us()
+ * @idle_time: idle time stats
* @cpu_dev: the cpu_device of policy->cpu.
* @plat_get_static_power: callback to calculate the static power
*
@@ -95,8 +103,7 @@ struct cpufreq_cooling_device {
struct freq_table *freq_table; /* In descending order */
struct list_head node;
u32 last_load;
- u64 *time_in_idle;
- u64 *time_in_idle_timestamp;
+ struct time_in_idle *idle_time;
struct device *cpu_dev;
get_static_t plat_get_static_power;
};
@@ -300,18 +307,19 @@ static u32 get_load(struct cpufreq_cooling_device *cpufreq_cdev, int cpu,
{
u32 load;
u64 now, now_idle, delta_time, delta_idle;
+ struct time_in_idle *idle_time = &cpufreq_cdev->idle_time[cpu_idx];
now_idle = get_cpu_idle_time(cpu, &now, 0);
- delta_idle = now_idle - cpufreq_cdev->time_in_idle[cpu_idx];
- delta_time = now - cpufreq_cdev->time_in_idle_timestamp[cpu_idx];
+ delta_idle = now_idle - idle_time->time;
+ delta_time = now - idle_time->timestamp;
if (delta_time <= delta_idle)
load = 0;
else
load = div64_u64(100 * (delta_time - delta_idle), delta_time);
- cpufreq_cdev->time_in_idle[cpu_idx] = now_idle;
- cpufreq_cdev->time_in_idle_timestamp[cpu_idx] = now;
+ idle_time->time = now_idle;
+ idle_time->timestamp = now;
return load;
}
@@ -715,22 +723,14 @@ __cpufreq_cooling_register(struct device_node *np,
cpufreq_cdev->policy = policy;
num_cpus = cpumask_weight(policy->related_cpus);
- cpufreq_cdev->time_in_idle = kcalloc(num_cpus,
- sizeof(*cpufreq_cdev->time_in_idle),
- GFP_KERNEL);
- if (!cpufreq_cdev->time_in_idle) {
+ cpufreq_cdev->idle_time = kcalloc(num_cpus,
+ sizeof(*cpufreq_cdev->idle_time),
+ GFP_KERNEL);
+ if (!cpufreq_cdev->idle_time) {
cdev = ERR_PTR(-ENOMEM);
goto free_cdev;
}
- cpufreq_cdev->time_in_idle_timestamp =
- kcalloc(num_cpus, sizeof(*cpufreq_cdev->time_in_idle_timestamp),
- GFP_KERNEL);
- if (!cpufreq_cdev->time_in_idle_timestamp) {
- cdev = ERR_PTR(-ENOMEM);
- goto free_time_in_idle;
- }
-
/* max_level is an index, not a counter */
cpufreq_cdev->max_level = i - 1;
@@ -738,7 +738,7 @@ __cpufreq_cooling_register(struct device_node *np,
GFP_KERNEL);
if (!cpufreq_cdev->freq_table) {
cdev = ERR_PTR(-ENOMEM);
- goto free_time_in_idle_timestamp;
+ goto free_idle_time;
}
ret = ida_simple_get(&cpufreq_ida, 0, 0, GFP_KERNEL);
@@ -801,10 +801,8 @@ remove_ida:
ida_simple_remove(&cpufreq_ida, cpufreq_cdev->id);
free_table:
kfree(cpufreq_cdev->freq_table);
-free_time_in_idle_timestamp:
- kfree(cpufreq_cdev->time_in_idle_timestamp);
-free_time_in_idle:
- kfree(cpufreq_cdev->time_in_idle);
+free_idle_time:
+ kfree(cpufreq_cdev->idle_time);
free_cdev:
kfree(cpufreq_cdev);
return cdev;
@@ -947,8 +945,7 @@ void cpufreq_cooling_unregister(struct thermal_cooling_device *cdev)
thermal_cooling_device_unregister(cpufreq_cdev->cdev);
ida_simple_remove(&cpufreq_ida, cpufreq_cdev->id);
- kfree(cpufreq_cdev->time_in_idle_timestamp);
- kfree(cpufreq_cdev->time_in_idle);
+ kfree(cpufreq_cdev->idle_time);
kfree(cpufreq_cdev->freq_table);
kfree(cpufreq_cdev);
}