mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 11:19:37 +00:00
[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: Rafal Bilski <rafalbilski@interia.pl> Signed-off-by: Dave Jones <davej@redhat.com>
This commit is contained in:
parent
0d44b2ba28
commit
46ef955f5c
1 changed files with 9 additions and 21 deletions
|
@ -318,31 +318,19 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
|
|||
|
||||
#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)
|
||||
{
|
||||
int speed = (cpu_khz/1000);
|
||||
int speed = cpu_khz / 1000;
|
||||
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++) {
|
||||
if (_guess(speeds[i], mult) == speed)
|
||||
return speeds[i];
|
||||
for (i = 0; i < 4; i++) {
|
||||
f_max = ((speeds[i] * mult) + 50) / 100;
|
||||
f_max += (ROUNDING / 2);
|
||||
f_min = f_max - ROUNDING;
|
||||
if ((speed <= f_max) && (speed >= f_min))
|
||||
return speeds[i] / 10;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue