aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorViresh Kumar <viresh.kumar@linaro.org>2014-12-04 09:42:02 +0530
committerKevin Hilman <khilman@linaro.org>2015-06-05 15:42:22 -0700
commit1dfed5a62eb90ebcbe803d3e789ebca1f61af9e9 (patch)
treeb363d4d284735ff7fa1389df605c32798643429b
parentaa578d0787433105af0f5c5450c34dc6a374a590 (diff)
thermal: cpu_cooling: find max level during device registration
CPU frequency tables don't update after the driver is registered and so we don't need to iterate over them to find total number of states every time cpufreq_get_max_state() is called. Do it once at boot time. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Eduardo Valentin <edubezval@gmail.com> (cherry picked from commit dcc6c7fdef9e705b1300be22213fb23e3fd1994d) Signed-off-by: Kevin Hilman <khilman@linaro.org>
-rw-r--r--drivers/thermal/cpu_cooling.c28
1 files changed, 15 insertions, 13 deletions
diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c
index 2c4c4853cd9f..d34cc5b27021 100644
--- a/drivers/thermal/cpu_cooling.c
+++ b/drivers/thermal/cpu_cooling.c
@@ -52,6 +52,8 @@
* cooling devices.
* @cpufreq_val: integer value representing the absolute value of the clipped
* frequency.
+ * @max_level: maximum cooling level. One less than total number of valid
+ * cpufreq frequencies.
* @allowed_cpus: all the cpus involved for this cpufreq_cooling_device.
*
* This structure is required for keeping information of each registered
@@ -62,6 +64,7 @@ struct cpufreq_cooling_device {
struct thermal_cooling_device *cool_dev;
unsigned int cpufreq_state;
unsigned int cpufreq_val;
+ unsigned int max_level;
struct cpumask allowed_cpus;
struct list_head node;
};
@@ -283,19 +286,9 @@ static int cpufreq_get_max_state(struct thermal_cooling_device *cdev,
unsigned long *state)
{
struct cpufreq_cooling_device *cpufreq_device = cdev->devdata;
- struct cpumask *mask = &cpufreq_device->allowed_cpus;
- unsigned int cpu;
- unsigned int count = 0;
- int ret;
-
- cpu = cpumask_any(mask);
-
- ret = get_property(cpu, 0, &count, GET_MAXL);
-
- if (count > 0)
- *state = count;
- return ret;
+ *state = cpufreq_device->max_level;
+ return 0;
}
/**
@@ -385,9 +378,11 @@ __cpufreq_cooling_register(struct device_node *np,
struct thermal_cooling_device *cool_dev;
struct cpufreq_cooling_device *cpufreq_dev;
char dev_name[THERMAL_NAME_LENGTH];
+ struct cpufreq_frequency_table *pos, *table;
int ret;
- if (!cpufreq_frequency_get_table(cpumask_first(clip_cpus))) {
+ table = cpufreq_frequency_get_table(cpumask_first(clip_cpus));
+ if (!table) {
pr_debug("%s: CPUFreq table not found\n", __func__);
return ERR_PTR(-EPROBE_DEFER);
}
@@ -404,6 +399,13 @@ __cpufreq_cooling_register(struct device_node *np,
goto free_cdev;
}
+ /* Find max levels */
+ cpufreq_for_each_valid_entry(pos, table)
+ cpufreq_dev->max_level++;
+
+ /* max_level is an index, not a counter */
+ cpufreq_dev->max_level--;
+
cpumask_copy(&cpufreq_dev->allowed_cpus, clip_cpus);
ret = get_idr(&cpufreq_idr, &cpufreq_dev->id);