Clean up searching code for best frequency multiplier, and add a
safety check.
Dominik
diff -ruN linux-original/arch/i386/kernel/cpu/cpufreq/elanfreq.c linux/arch/i386/kernel/cpu/cpufreq/elanfreq.c
--- linux-original/arch/i386/kernel/cpu/cpufreq/elanfreq.c 2003-01-02 20:56:45.000000000 +0100
+++ linux/arch/i386/kernel/cpu/cpufreq/elanfreq.c 2003-01-02 20:59:57.000000000 +0100
@@ -184,7 +184,7 @@
cpufreq_verify_within_limits(policy, 1000, max_freq);
- for (i=(sizeof(elan_multiplier)/sizeof(struct s_elan_multiplier) - 1); i>=0; i--)
+ for (i=7; i>=0; i--)
if ((elan_multiplier[i].clock >= policy->min) &&
(elan_multiplier[i].clock <= policy->max))
number_states++;
@@ -192,57 +192,46 @@
if (number_states)
return 0;
- for (i=(sizeof(elan_multiplier)/sizeof(struct s_elan_multiplier) - 1); i>=0; i--)
+ for (i=7; i>=0; i--)
if (elan_multiplier[i].clock < policy->max)
break;
policy->max = elan_multiplier[i+1].clock;
+ cpufreq_verify_within_limits(policy, 1000, max_freq);
+
return 0;
}
static int elanfreq_setpolicy (struct cpufreq_policy *policy)
{
- unsigned int number_states = 0;
- unsigned int i, j=4;
+ unsigned int i;
+ unsigned int optimal = 8;
if (!elanfreq_driver)
return -EINVAL;
- for (i=(sizeof(elan_multiplier)/sizeof(struct s_elan_multiplier) - 1); i>=0; i--)
- if ((elan_multiplier[i].clock >= policy->min) &&
- (elan_multiplier[i].clock <= policy->max))
- {
- number_states++;
- j = i;
+ for (i=0; i<8; i++) {
+ if ((elan_multiplier[i].clock > policy->max) ||
+ (elan_multiplier[i].clock < policy->min))
+ continue;
+ switch(policy->policy) {
+ case CPUFREQ_POLICY_POWERSAVE:
+ if (optimal == 8)
+ optimal = i;
+ break;
+ case CPUFREQ_POLICY_PERFORMANCE:
+ optimal = i;
+ break;
+ default:
+ return -EINVAL;
}
-
- if (number_states == 1) {
- elanfreq_set_cpu_state(j);
- return 0;
}
-
- switch (policy->policy) {
- case CPUFREQ_POLICY_POWERSAVE:
- for (i=(sizeof(elan_multiplier)/sizeof(struct s_elan_multiplier) - 1); i>=0; i--)
- if ((elan_multiplier[i].clock >= policy->min) &&
- (elan_multiplier[i].clock <= policy->max))
- j = i;
- break;
- case CPUFREQ_POLICY_PERFORMANCE:
- for (i=0; i<(sizeof(elan_multiplier)/sizeof(struct s_elan_multiplier) - 1); i++)
- if ((elan_multiplier[i].clock >= policy->min) &&
- (elan_multiplier[i].clock <= policy->max))
- j = i;
- break;
- default:
+ if ((optimal == 8) || (elan_multiplier[optimal].clock > max_freq))
return -EINVAL;
- }
- if (elan_multiplier[j].clock > max_freq)
- return -EINVAL;
+ elanfreq_set_cpu_state(optimal);
- elanfreq_set_cpu_state(j);
return 0;
}
@@ -307,7 +296,7 @@
driver->policy[0].max = max_freq;
driver->policy[0].policy = CPUFREQ_POLICY_PERFORMANCE;
driver->policy[0].cpuinfo.max_freq = max_freq;
- driver->policy[0].cpuinfo.min_freq = min_freq;
+ driver->policy[0].cpuinfo.min_freq = 1000;
driver->policy[0].cpuinfo.transition_latency = CPUFREQ_ETERNAL;
elanfreq_driver = driver;