summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Brodowski <linux@brodo.de>2002-12-29 20:29:28 -0800
committerLinus Torvalds <torvalds@home.transmeta.com>2002-12-29 20:29:28 -0800
commitf8e94f0ea422fe7cdacdea457638a02a6a20efc7 (patch)
tree5e0f914e48feb44e95ca45972123eb3e212f337e
parentc26545184e87696b156c35b77cfee479afb4cdd9 (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.c64
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;
}