Commit c5d28fb2 authored by Dave Jones's avatar Dave Jones

[CPUFREQ] Recalibrate cpu_khz [2/2]

Some cpufreq drivers (at that time, only powernow-k7) need to recalibrate the
cpu_khz at runtime.
Signed-off-by: default avatarBruno Ducrot <ducrot@poupinou.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarDave Jones <davej@redhat.com>
parent 91350ed4
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include <linux/timex.h> #include <linux/timex.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/jiffies.h> #include <linux/jiffies.h>
#include <linux/module.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/timer.h> #include <asm/timer.h>
...@@ -24,7 +25,7 @@ ...@@ -24,7 +25,7 @@
#define CALIBRATE_TIME (5 * 1000020/HZ) #define CALIBRATE_TIME (5 * 1000020/HZ)
unsigned long __init calibrate_tsc(void) unsigned long calibrate_tsc(void)
{ {
mach_prepare_counter(); mach_prepare_counter();
...@@ -139,7 +140,7 @@ unsigned long __init calibrate_tsc_hpet(unsigned long *tsc_hpet_quotient_ptr) ...@@ -139,7 +140,7 @@ unsigned long __init calibrate_tsc_hpet(unsigned long *tsc_hpet_quotient_ptr)
#endif #endif
/* calculate cpu_khz */ /* calculate cpu_khz */
void __init init_cpu_khz(void) void init_cpu_khz(void)
{ {
if (cpu_has_tsc) { if (cpu_has_tsc) {
unsigned long tsc_quotient = calibrate_tsc(); unsigned long tsc_quotient = calibrate_tsc();
...@@ -158,3 +159,4 @@ void __init init_cpu_khz(void) ...@@ -158,3 +159,4 @@ void __init init_cpu_khz(void)
} }
} }
} }
...@@ -320,6 +320,26 @@ core_initcall(cpufreq_tsc); ...@@ -320,6 +320,26 @@ core_initcall(cpufreq_tsc);
static inline void cpufreq_delayed_get(void) { return; } static inline void cpufreq_delayed_get(void) { return; }
#endif #endif
int recalibrate_cpu_khz(void)
{
#ifndef CONFIG_SMP
unsigned long cpu_khz_old = cpu_khz;
if (cpu_has_tsc) {
init_cpu_khz();
cpu_data[0].loops_per_jiffy =
cpufreq_scale(cpu_data[0].loops_per_jiffy,
cpu_khz_old,
cpu_khz);
return 0;
} else
return -ENODEV;
#else
return -ENODEV;
#endif
}
EXPORT_SYMBOL(recalibrate_cpu_khz);
static void mark_offset_tsc(void) static void mark_offset_tsc(void)
{ {
unsigned long lost,delay; unsigned long lost,delay;
......
...@@ -53,6 +53,7 @@ extern struct init_timer_opts timer_cyclone_init; ...@@ -53,6 +53,7 @@ extern struct init_timer_opts timer_cyclone_init;
extern unsigned long calibrate_tsc(void); extern unsigned long calibrate_tsc(void);
extern void init_cpu_khz(void); extern void init_cpu_khz(void);
extern int recalibrate_cpu_khz(void);
#ifdef CONFIG_HPET_TIMER #ifdef CONFIG_HPET_TIMER
extern struct init_timer_opts timer_hpet_init; extern struct init_timer_opts timer_hpet_init;
extern unsigned long calibrate_tsc_hpet(unsigned long *tsc_hpet_quotient_ptr); extern unsigned long calibrate_tsc_hpet(unsigned long *tsc_hpet_quotient_ptr);
......
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