Skip to content

Commit

Permalink
thermal: cpu_cooling: find max level during device registration
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Viresh Kumar authored and Eduardo Valentin committed Dec 8, 2014
1 parent 521a2e5 commit dcc6c7f
Showing 1 changed file with 15 additions and 13 deletions.
28 changes: 15 additions & 13 deletions drivers/thermal/cpu_cooling.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
};
Expand Down Expand Up @@ -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;
}

/**
Expand Down Expand Up @@ -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);
}
Expand All @@ -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);
Expand Down

0 comments on commit dcc6c7f

Please sign in to comment.