diff options
| author | Dominik Brodowski <linux@brodo.de> | 2002-12-14 19:50:32 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2002-12-14 19:50:32 -0800 |
| commit | 8d13373b408f1e9df4238d0df17c40d7a77e5b02 (patch) | |
| tree | 897508d6100f02c844db2f9db6094700f8e9297b /kernel | |
| parent | 9aa5637c07edef20c893e73d17a6ba27fa36841f (diff) | |
[PATCH] cpufreq: clean up CPU information
This patch moves some basic per-CPU static information (minimum frequency,
maximum frequency and maximum transition latency) into a struct
cpufreq_cpuinfo. This offers a much cleaner struct cpufreq_driver and
struct cpufreq_policy.
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/cpufreq.c | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/kernel/cpufreq.c b/kernel/cpufreq.c index 1cfc2489a08a..c8208fb2191a 100644 --- a/kernel/cpufreq.c +++ b/kernel/cpufreq.c @@ -119,8 +119,8 @@ static int cpufreq_parse_policy(char input_string[42], struct cpufreq_policy *po if (sscanf(input_string, "%d%%%d%%%d%%%s", &cpu, &min, &max, policy_string) == 4) { if (!cpufreq_get_policy(¤t_policy, cpu)) { - policy->min = (min * current_policy.max_cpu_freq) / 100; - policy->max = (max * current_policy.max_cpu_freq) / 100; + policy->min = (min * current_policy.cpuinfo.max_freq) / 100; + policy->max = (max * current_policy.cpuinfo.max_freq) / 100; policy->cpu = cpu; result = 0; goto scan_policy; @@ -138,8 +138,8 @@ static int cpufreq_parse_policy(char input_string[42], struct cpufreq_policy *po if (sscanf(input_string, "%d%%%d%%%s", &min, &max, policy_string) == 3) { if (!cpufreq_get_policy(¤t_policy, cpu)) { - policy->min = (min * current_policy.max_cpu_freq) / 100; - policy->max = (max * current_policy.max_cpu_freq) / 100; + policy->min = (min * current_policy.cpuinfo.max_freq) / 100; + policy->max = (max * current_policy.cpuinfo.max_freq) / 100; result = 0; goto scan_policy; } @@ -229,11 +229,11 @@ static int cpufreq_proc_read ( cpufreq_get_policy(&policy, i); - if (!policy.max_cpu_freq) + if (!policy.cpuinfo.max_freq) continue; - min_pctg = (policy.min * 100) / policy.max_cpu_freq; - max_pctg = (policy.max * 100) / policy.max_cpu_freq; + min_pctg = (policy.min * 100) / policy.cpuinfo.max_freq; + max_pctg = (policy.max * 100) / policy.cpuinfo.max_freq; p += sprintf(p, "CPU%3d %9d kHz (%3d %%) - %9d kHz (%3d %%) - ", i , policy.min, min_pctg, policy.max, max_pctg); @@ -279,6 +279,7 @@ static int cpufreq_proc_write ( int result = 0; char proc_string[42] = {'\0'}; struct cpufreq_policy policy; + unsigned int i = 0; if ((count > sizeof(proc_string) - 1)) @@ -293,7 +294,17 @@ static int cpufreq_proc_write ( if (result) return -EFAULT; - cpufreq_set_policy(&policy); + if (policy.cpu == CPUFREQ_ALL_CPUS) + { + for (i=0; i<NR_CPUS; i++) + { + policy.cpu = i; + if (cpu_online(i)) + cpufreq_set_policy(&policy); + } + } + else + cpufreq_set_policy(&policy); return count; } @@ -811,7 +822,9 @@ int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu) policy->min = cpufreq_driver->policy[cpu].min; policy->max = cpufreq_driver->policy[cpu].max; policy->policy = cpufreq_driver->policy[cpu].policy; - policy->max_cpu_freq = cpufreq_driver->policy[cpu].max_cpu_freq; + policy->cpuinfo.max_freq = cpufreq_driver->policy[cpu].cpuinfo.max_freq; + policy->cpuinfo.min_freq = cpufreq_driver->policy[cpu].cpuinfo.min_freq; + policy->cpuinfo.transition_latency = cpufreq_driver->policy[cpu].cpuinfo.transition_latency; policy->cpu = cpu; up(&cpufreq_driver_sem); @@ -835,16 +848,14 @@ int cpufreq_set_policy(struct cpufreq_policy *policy) down(&cpufreq_driver_sem); if (!cpufreq_driver || !cpufreq_driver->verify || !cpufreq_driver->setpolicy || !policy || - (policy->cpu > NR_CPUS)) { + (policy->cpu >= NR_CPUS) || (!cpu_online(policy->cpu))) { up(&cpufreq_driver_sem); return -EINVAL; } - if (policy->cpu == CPUFREQ_ALL_CPUS) - policy->max_cpu_freq = cpufreq_driver->policy[0].max_cpu_freq; - else - policy->max_cpu_freq = cpufreq_driver->policy[policy->cpu].max_cpu_freq; - + policy->cpuinfo.max_freq = cpufreq_driver->policy[policy->cpu].cpuinfo.max_freq; + policy->cpuinfo.min_freq = cpufreq_driver->policy[policy->cpu].cpuinfo.min_freq; + policy->cpuinfo.transition_latency = cpufreq_driver->policy[policy->cpu].cpuinfo.transition_latency; /* verify the cpu speed can be set within this limit */ ret = cpufreq_driver->verify(policy); @@ -1039,8 +1050,8 @@ int cpufreq_register(struct cpufreq_driver *driver_data) down(&cpufreq_driver_sem); for (i=0; i<NR_CPUS; i++) { - cpu_min_freq[i] = driver_data->cpu_min_freq[i]; - cpu_max_freq[i] = driver_data->policy[i].max_cpu_freq; + cpu_min_freq[i] = driver_data->policy[i].cpuinfo.min_freq; + cpu_max_freq[i] = driver_data->policy[i].cpuinfo.max_freq; cpu_cur_freq[i] = driver_data->cpu_cur_freq[i]; } up(&cpufreq_driver_sem); |
