Commit 46ef955f authored by Rafa Bilski's avatar Rafa Bilski Committed by Dave Jones

[CPUFREQ] Longhaul - Fix guess_fsb function

This is bug reported by John-Marc Chandonia:
> Detected 1002.292 MHz processor.
> longhaul: VIA C3 'Nehemiah B' [C5N] CPU detected.  Powersaver supported.
> longhaul: Using throttling support.
> longhaul: Invalid (reserved) FSB!
FSB is correcly guessed for 999.554 MHz CPU.
To fix this error:
- ROUNDING should be range, not mask - at it's current value it is +7 -8,
- more precise calculations inside guess_fsb - 7.5x133MHz is 1000MHz now.
Signed-off-by: default avatarRafal Bilski <rafalbilski@interia.pl>
Signed-off-by: default avatarDave Jones <davej@redhat.com>
parent 0d44b2ba
...@@ -318,31 +318,19 @@ static void longhaul_setstate(unsigned int clock_ratio_index) ...@@ -318,31 +318,19 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
#define ROUNDING 0xf #define ROUNDING 0xf
static int _guess(int guess, int mult)
{
int target;
target = ((mult/10)*guess);
if (mult%10 != 0)
target += (guess/2);
target += ROUNDING/2;
target &= ~ROUNDING;
return target;
}
static int guess_fsb(int mult) static int guess_fsb(int mult)
{ {
int speed = (cpu_khz/1000); int speed = cpu_khz / 1000;
int i; int i;
int speeds[] = { 66, 100, 133, 200 }; int speeds[] = { 666, 1000, 1333, 2000 };
int f_max, f_min;
speed += ROUNDING/2;
speed &= ~ROUNDING; for (i = 0; i < 4; i++) {
f_max = ((speeds[i] * mult) + 50) / 100;
for (i=0; i<4; i++) { f_max += (ROUNDING / 2);
if (_guess(speeds[i], mult) == speed) f_min = f_max - ROUNDING;
return speeds[i]; if ((speed <= f_max) && (speed >= f_min))
return speeds[i] / 10;
} }
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment