diff options
| author | Dominik Brodowski <linux@brodo.de> | 2002-12-29 20:29:28 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2002-12-29 20:29:28 -0800 |
| commit | f8e94f0ea422fe7cdacdea457638a02a6a20efc7 (patch) | |
| tree | 5e0f914e48feb44e95ca45972123eb3e212f337e | |
| parent | c26545184e87696b156c35b77cfee479afb4cdd9 (diff) | |
[PATCH] cpufreq: powernow-k6 cleanup
Clean up searching for best frequency, and add one safety check.
| -rw-r--r-- | arch/i386/kernel/cpu/cpufreq/powernow-k6.c | 64 |
1 files changed, 29 insertions, 35 deletions
diff --git a/arch/i386/kernel/cpu/cpufreq/powernow-k6.c b/arch/i386/kernel/cpu/cpufreq/powernow-k6.c index 8a3404123f44..b6ae33f21254 100644 --- a/arch/i386/kernel/cpu/cpufreq/powernow-k6.c +++ b/arch/i386/kernel/cpu/cpufreq/powernow-k6.c @@ -144,6 +144,9 @@ static int powernow_k6_verify(struct cpufreq_policy *policy) policy->max = clock_ratio[j] * busfreq; + cpufreq_verify_within_limits(policy, (20 * busfreq), + (max_multiplier * busfreq)); + return 0; } @@ -156,53 +159,44 @@ static int powernow_k6_verify(struct cpufreq_policy *policy) */ static int powernow_k6_setpolicy (struct cpufreq_policy *policy) { - unsigned int number_states = 0; - unsigned int i, j=4; + unsigned int i; + unsigned int optimal; - if (!powernow_driver) + if (!powernow_driver || !policy || policy->cpu) return -EINVAL; - for (i=0; i<8; i++) - if ((policy->min <= (busfreq * clock_ratio[i])) && - (policy->max >= (busfreq * clock_ratio[i]))) - { - number_states++; - j = i; - } - - if (number_states == 1) { - /* if only one state is within the limit borders, it - is easily detected and set */ - powernow_k6_set_state(j); - return 0; - } - - /* more than one state within limit */ - switch (policy->policy) { + switch(policy->policy) { case CPUFREQ_POLICY_POWERSAVE: - j = 6; - for (i=0; i<8; i++) - if ((policy->min <= (busfreq * clock_ratio[i])) && - (policy->max >= (busfreq * clock_ratio[i])) && - (clock_ratio[i] < clock_ratio[j])) - j = i; + optimal = 6; break; case CPUFREQ_POLICY_PERFORMANCE: - j = 4; - for (i=0; i<8; i++) - if ((policy->min <= (busfreq * clock_ratio[i])) && - (policy->max >= (busfreq * clock_ratio[i])) && - (clock_ratio[i] > clock_ratio[j])) - j = i; + optimal = max_multiplier; break; default: return -EINVAL; } - if (clock_ratio[i] > max_multiplier) - return -EINVAL; + for (i=0;i<8;i++) { + unsigned int freq = busfreq * clock_ratio[i]; + if (clock_ratio[i] > max_multiplier) + continue; + if ((freq > policy->max) || + (freq < policy->min)) + continue; + switch(policy->policy) { + case CPUFREQ_POLICY_POWERSAVE: + if (freq < (clock_ratio[optimal] * busfreq)) + optimal = i; + break; + case CPUFREQ_POLICY_PERFORMANCE: + if (freq > (clock_ratio[optimal] * busfreq)) + optimal = i; + break; + } + } + + powernow_k6_set_state(optimal); - powernow_k6_set_state(j); return 0; } |
