cpufreq: elanfreq cleanup and compile fix
PATCH 1/1 cpufreq: elanfreq cleanup and compile fix
Clean up searching code for best frequency multiplier, and add a safety check.
Dominik
arch/i386/kernel/cpu/cpufreq/elanfreq.c +23 -34
@@ -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;