aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2009-08-19 09:37:03 -0400
committerThomas Gleixner <tglx@linutronix.de>2009-08-31 03:35:46 -0400
commit845b3944bbdf9e9247849bf037f27ff3a3f26d87 (patch)
treeb14b40b5ba650996c646ed760cfa4b3283e04953 /arch
parent736decac643e8982655e22ac7f0e5e61c5b7f9bd (diff)
x86: Add timer_init to x86_init_ops
The timer init code is convoluted with several quirks and the paravirt timer chooser. Figuring out which code path is actually taken is not for the faint hearted. Move the numaq TSC quirk to tsc_pre_init x86_init_ops function and replace the paravirt time chooser and the remaining x86 quirk with a simple x86_init_ops function. Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/include/asm/paravirt.h5
-rw-r--r--arch/x86/include/asm/paravirt_types.h2
-rw-r--r--arch/x86/include/asm/setup.h21
-rw-r--r--arch/x86/include/asm/time.h1
-rw-r--r--arch/x86/include/asm/timer.h3
-rw-r--r--arch/x86/include/asm/x86_init.h4
-rw-r--r--arch/x86/kernel/apic/numaq_32.c10
-rw-r--r--arch/x86/kernel/paravirt.c1
-rw-r--r--arch/x86/kernel/setup.c43
-rw-r--r--arch/x86/kernel/time_32.c34
-rw-r--r--arch/x86/kernel/time_64.c9
-rw-r--r--arch/x86/kernel/tsc.c2
-rw-r--r--arch/x86/kernel/visws_quirks.c20
-rw-r--r--arch/x86/kernel/vmi_32.c2
-rw-r--r--arch/x86/kernel/x86_init.c3
-rw-r--r--arch/x86/lguest/boot.c2
-rw-r--r--arch/x86/xen/enlighten.c4
17 files changed, 53 insertions, 113 deletions
diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h
index 825674a968d1..11a4ba7b209c 100644
--- a/arch/x86/include/asm/paravirt.h
+++ b/arch/x86/include/asm/paravirt.h
@@ -34,11 +34,6 @@ static inline int set_wallclock(unsigned long nowtime)
34 return PVOP_CALL1(int, pv_time_ops.set_wallclock, nowtime); 34 return PVOP_CALL1(int, pv_time_ops.set_wallclock, nowtime);
35} 35}
36 36
37static inline void (*choose_time_init(void))(void)
38{
39 return pv_time_ops.time_init;
40}
41
42/* The paravirtualized CPUID instruction. */ 37/* The paravirtualized CPUID instruction. */
43static inline void __cpuid(unsigned int *eax, unsigned int *ebx, 38static inline void __cpuid(unsigned int *eax, unsigned int *ebx,
44 unsigned int *ecx, unsigned int *edx) 39 unsigned int *ecx, unsigned int *edx)
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
index 1da89276d142..0d812e592e3b 100644
--- a/arch/x86/include/asm/paravirt_types.h
+++ b/arch/x86/include/asm/paravirt_types.h
@@ -88,8 +88,6 @@ struct pv_lazy_ops {
88}; 88};
89 89
90struct pv_time_ops { 90struct pv_time_ops {
91 void (*time_init)(void);
92
93 /* Set and set time of day */ 91 /* Set and set time of day */
94 unsigned long (*get_wallclock)(void); 92 unsigned long (*get_wallclock)(void);
95 int (*set_wallclock)(unsigned long); 93 int (*set_wallclock)(unsigned long);
diff --git a/arch/x86/include/asm/setup.h b/arch/x86/include/asm/setup.h
index 58b58952b80d..861e1fe2303b 100644
--- a/arch/x86/include/asm/setup.h
+++ b/arch/x86/include/asm/setup.h
@@ -5,24 +5,6 @@
5 5
6#define COMMAND_LINE_SIZE 2048 6#define COMMAND_LINE_SIZE 2048
7 7
8#ifndef __ASSEMBLY__
9
10#include <asm/x86_init.h>
11
12/*
13 * Any setup quirks to be performed?
14 */
15
16struct x86_quirks {
17 int (*arch_pre_time_init)(void);
18 int (*arch_time_init)(void);
19};
20
21extern void x86_quirk_pre_time_init(void);
22extern void x86_quirk_time_init(void);
23
24#endif /* __ASSEMBLY__ */
25
26#ifdef __i386__ 8#ifdef __i386__
27 9
28#include <linux/pfn.h> 10#include <linux/pfn.h>
@@ -42,6 +24,7 @@ extern void x86_quirk_time_init(void);
42 24
43#ifndef __ASSEMBLY__ 25#ifndef __ASSEMBLY__
44#include <asm/bootparam.h> 26#include <asm/bootparam.h>
27#include <asm/x86_init.h>
45 28
46/* Interrupt control for vSMPowered x86_64 systems */ 29/* Interrupt control for vSMPowered x86_64 systems */
47#ifdef CONFIG_X86_64 30#ifdef CONFIG_X86_64
@@ -60,11 +43,11 @@ static inline void visws_early_detect(void) { }
60static inline int is_visws_box(void) { return 0; } 43static inline int is_visws_box(void) { return 0; }
61#endif 44#endif
62 45
63extern struct x86_quirks *x86_quirks;
64extern unsigned long saved_video_mode; 46extern unsigned long saved_video_mode;
65 47
66extern void reserve_standard_io_resources(void); 48extern void reserve_standard_io_resources(void);
67extern void i386_reserve_resources(void); 49extern void i386_reserve_resources(void);
50extern void setup_default_timer_irq(void);
68 51
69#ifndef _SETUP 52#ifndef _SETUP
70 53
diff --git a/arch/x86/include/asm/time.h b/arch/x86/include/asm/time.h
index 50c733aac421..91bb162b5a31 100644
--- a/arch/x86/include/asm/time.h
+++ b/arch/x86/include/asm/time.h
@@ -54,7 +54,6 @@ extern void time_init(void);
54 54
55#define get_wallclock() native_get_wallclock() 55#define get_wallclock() native_get_wallclock()
56#define set_wallclock(x) native_set_wallclock(x) 56#define set_wallclock(x) native_set_wallclock(x)
57#define choose_time_init() hpet_time_init
58 57
59#endif /* CONFIG_PARAVIRT */ 58#endif /* CONFIG_PARAVIRT */
60 59
diff --git a/arch/x86/include/asm/timer.h b/arch/x86/include/asm/timer.h
index 20ca9c4d4686..e854c7ab4169 100644
--- a/arch/x86/include/asm/timer.h
+++ b/arch/x86/include/asm/timer.h
@@ -12,8 +12,7 @@ unsigned long native_calibrate_tsc(void);
12 12
13#ifdef CONFIG_X86_32 13#ifdef CONFIG_X86_32
14extern int timer_ack; 14extern int timer_ack;
15extern irqreturn_t timer_interrupt(int irq, void *dev_id); 15#endif
16#endif /* CONFIG_X86_32 */
17extern int recalibrate_cpu_khz(void); 16extern int recalibrate_cpu_khz(void);
18 17
19extern int no_timer_check; 18extern int no_timer_check;
diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h
index b7d258f4c401..f8bdd2271a04 100644
--- a/arch/x86/include/asm/x86_init.h
+++ b/arch/x86/include/asm/x86_init.h
@@ -82,9 +82,13 @@ struct x86_init_paging {
82 * struct x86_init_timers - platform specific timer setup 82 * struct x86_init_timers - platform specific timer setup
83 * @setup_perpcu_clockev: set up the per cpu clock event device for the 83 * @setup_perpcu_clockev: set up the per cpu clock event device for the
84 * boot cpu 84 * boot cpu
85 * @tsc_pre_init: platform function called before TSC init
86 * @timer_init: initialize the platform timer (default PIT/HPET)
85 */ 87 */
86struct x86_init_timers { 88struct x86_init_timers {
87 void (*setup_percpu_clockev)(void); 89 void (*setup_percpu_clockev)(void);
90 void (*tsc_pre_init)(void);
91 void (*timer_init)(void);
88}; 92};
89 93
90/** 94/**
diff --git a/arch/x86/kernel/apic/numaq_32.c b/arch/x86/kernel/apic/numaq_32.c
index 71c5ea645865..f1ebed6bd150 100644
--- a/arch/x86/kernel/apic/numaq_32.c
+++ b/arch/x86/kernel/apic/numaq_32.c
@@ -129,10 +129,9 @@ void __cpuinit numaq_tsc_disable(void)
129 } 129 }
130} 130}
131 131
132static int __init numaq_pre_time_init(void) 132static void __init numaq_tsc_init(void)
133{ 133{
134 numaq_tsc_disable(); 134 numaq_tsc_disable();
135 return 0;
136} 135}
137 136
138static inline int generate_logical_apicid(int quad, int phys_apicid) 137static inline int generate_logical_apicid(int quad, int phys_apicid)
@@ -262,11 +261,6 @@ static void __init smp_read_mpc_oem(struct mpc_table *mpc)
262 } 261 }
263} 262}
264 263
265static struct x86_quirks numaq_x86_quirks __initdata = {
266 .arch_pre_time_init = numaq_pre_time_init,
267 .arch_time_init = NULL,
268};
269
270static __init void early_check_numaq(void) 264static __init void early_check_numaq(void)
271{ 265{
272 /* 266 /*
@@ -281,13 +275,13 @@ static __init void early_check_numaq(void)
281 early_get_smp_config(); 275 early_get_smp_config();
282 276
283 if (found_numaq) { 277 if (found_numaq) {
284 x86_quirks = &numaq_x86_quirks;
285 x86_init.mpparse.mpc_record = numaq_mpc_record; 278 x86_init.mpparse.mpc_record = numaq_mpc_record;
286 x86_init.mpparse.setup_ioapic_ids = x86_init_noop; 279 x86_init.mpparse.setup_ioapic_ids = x86_init_noop;
287 x86_init.mpparse.mpc_apic_id = mpc_apic_id; 280 x86_init.mpparse.mpc_apic_id = mpc_apic_id;
288 x86_init.mpparse.smp_read_mpc_oem = smp_read_mpc_oem; 281 x86_init.mpparse.smp_read_mpc_oem = smp_read_mpc_oem;
289 x86_init.mpparse.mpc_oem_pci_bus = mpc_oem_pci_bus; 282 x86_init.mpparse.mpc_oem_pci_bus = mpc_oem_pci_bus;
290 x86_init.mpparse.mpc_oem_bus_info = mpc_oem_bus_info; 283 x86_init.mpparse.mpc_oem_bus_info = mpc_oem_bus_info;
284 x86_init.timers.tsc_pre_init = numaq_tsc_init;
291 } 285 }
292} 286}
293 287
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c
index 1ed32c79679d..9c0e644a76dc 100644
--- a/arch/x86/kernel/paravirt.c
+++ b/arch/x86/kernel/paravirt.c
@@ -306,7 +306,6 @@ struct pv_init_ops pv_init_ops = {
306}; 306};
307 307
308struct pv_time_ops pv_time_ops = { 308struct pv_time_ops pv_time_ops = {
309 .time_init = hpet_time_init,
310 .get_wallclock = native_get_wallclock, 309 .get_wallclock = native_get_wallclock,
311 .set_wallclock = native_set_wallclock, 310 .set_wallclock = native_set_wallclock,
312 .sched_clock = native_sched_clock, 311 .sched_clock = native_sched_clock,
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 43ec6aa175bd..bb207a47c631 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -626,10 +626,6 @@ static int __init setup_elfcorehdr(char *arg)
626early_param("elfcorehdr", setup_elfcorehdr); 626early_param("elfcorehdr", setup_elfcorehdr);
627#endif 627#endif
628 628
629static struct x86_quirks default_x86_quirks __initdata;
630
631struct x86_quirks *x86_quirks __initdata = &default_x86_quirks;
632
633#ifdef CONFIG_X86_RESERVE_LOW_64K 629#ifdef CONFIG_X86_RESERVE_LOW_64K
634static int __init dmi_low_memory_corruption(const struct dmi_system_id *d) 630static int __init dmi_low_memory_corruption(const struct dmi_system_id *d)
635{ 631{
@@ -1016,45 +1012,6 @@ void __init setup_arch(char **cmdline_p)
1016 1012
1017#ifdef CONFIG_X86_32 1013#ifdef CONFIG_X86_32
1018 1014
1019static struct irqaction irq0 = {
1020 .handler = timer_interrupt,
1021 .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER,
1022 .name = "timer"
1023};
1024
1025/**
1026 * x86_quirk_pre_time_init - do any specific initialisations before.
1027 *
1028 **/
1029void __init x86_quirk_pre_time_init(void)
1030{
1031 if (x86_quirks->arch_pre_time_init)
1032 x86_quirks->arch_pre_time_init();
1033}
1034
1035/**
1036 * x86_quirk_time_init - do any specific initialisations for the system timer.
1037 *
1038 * Description:
1039 * Must plug the system timer interrupt source at HZ into the IRQ listed
1040 * in irq_vectors.h:TIMER_IRQ
1041 **/
1042void __init x86_quirk_time_init(void)
1043{
1044 if (x86_quirks->arch_time_init) {
1045 /*
1046 * A nonzero return code does not mean failure, it means
1047 * that the architecture quirk does not want any
1048 * generic (timer) setup to be performed after this:
1049 */
1050 if (x86_quirks->arch_time_init())
1051 return;
1052 }
1053
1054 irq0.mask = cpumask_of_cpu(0);
1055 setup_irq(0, &irq0);
1056}
1057
1058static struct resource video_ram_resource = { 1015static struct resource video_ram_resource = {
1059 .name = "Video RAM area", 1016 .name = "Video RAM area",
1060 .start = 0xa0000, 1017 .start = 0xa0000,
diff --git a/arch/x86/kernel/time_32.c b/arch/x86/kernel/time_32.c
index 5c5d87f0b2e1..89bbb52218b8 100644
--- a/arch/x86/kernel/time_32.c
+++ b/arch/x86/kernel/time_32.c
@@ -72,7 +72,7 @@ EXPORT_SYMBOL(profile_pc);
72 * Time Stamp Counter value at the time of the timer interrupt, so that 72 * Time Stamp Counter value at the time of the timer interrupt, so that
73 * we later on can estimate the time of day more exactly. 73 * we later on can estimate the time of day more exactly.
74 */ 74 */
75irqreturn_t timer_interrupt(int irq, void *dev_id) 75static irqreturn_t timer_interrupt(int irq, void *dev_id)
76{ 76{
77 /* Keep nmi watchdog up to date */ 77 /* Keep nmi watchdog up to date */
78 inc_irq_stat(irq0_irqs); 78 inc_irq_stat(irq0_irqs);
@@ -113,25 +113,37 @@ irqreturn_t timer_interrupt(int irq, void *dev_id)
113 return IRQ_HANDLED; 113 return IRQ_HANDLED;
114} 114}
115 115
116/* Duplicate of time_init() below, with hpet_enable part added */ 116static struct irqaction irq0 = {
117 .handler = timer_interrupt,
118 .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER,
119 .name = "timer"
120};
121
122void __init setup_default_timer_irq(void)
123{
124 irq0.mask = cpumask_of_cpu(0);
125 setup_irq(0, &irq0);
126}
127
128/* Default timer init function */
117void __init hpet_time_init(void) 129void __init hpet_time_init(void)
118{ 130{
119 if (!hpet_enable()) 131 if (!hpet_enable())
120 setup_pit_timer(); 132 setup_pit_timer();
121 x86_quirk_time_init(); 133 setup_default_timer_irq();
134}
135
136static void x86_late_time_init(void)
137{
138 x86_init.timers.timer_init();
122} 139}
123 140
124/* 141/*
125 * This is called directly from init code; we must delay timer setup in the 142 * Initialize TSC and delay the periodic timer init to
126 * HPET case as we can't make the decision to turn on HPET this early in the 143 * late x86_late_time_init() so ioremap works.
127 * boot process.
128 *
129 * The chosen time_init function will usually be hpet_time_init, above, but
130 * in the case of virtual hardware, an alternative function may be substituted.
131 */ 144 */
132void __init time_init(void) 145void __init time_init(void)
133{ 146{
134 x86_quirk_pre_time_init();
135 tsc_init(); 147 tsc_init();
136 late_time_init = choose_time_init(); 148 late_time_init = x86_late_time_init;
137} 149}
diff --git a/arch/x86/kernel/time_64.c b/arch/x86/kernel/time_64.c
index 5ba343e61844..38a7df94c107 100644
--- a/arch/x86/kernel/time_64.c
+++ b/arch/x86/kernel/time_64.c
@@ -19,6 +19,7 @@
19#include <linux/mca.h> 19#include <linux/mca.h>
20#include <linux/nmi.h> 20#include <linux/nmi.h>
21 21
22#include <asm/x86_init.h>
22#include <asm/i8253.h> 23#include <asm/i8253.h>
23#include <asm/hpet.h> 24#include <asm/hpet.h>
24#include <asm/vgtod.h> 25#include <asm/vgtod.h>
@@ -127,9 +128,13 @@ void __init hpet_time_init(void)
127 setup_irq(0, &irq0); 128 setup_irq(0, &irq0);
128} 129}
129 130
131static void x86_late_time_init(void)
132{
133 x86_init.timers.timer_init();
134}
135
130void __init time_init(void) 136void __init time_init(void)
131{ 137{
132 tsc_init(); 138 tsc_init();
133 139 late_time_init = x86_late_time_init;
134 late_time_init = choose_time_init();
135} 140}
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c
index 71f4368b357e..652bc214eebf 100644
--- a/arch/x86/kernel/tsc.c
+++ b/arch/x86/kernel/tsc.c
@@ -857,6 +857,8 @@ void __init tsc_init(void)
857 u64 lpj; 857 u64 lpj;
858 int cpu; 858 int cpu;
859 859
860 x86_init.timers.tsc_pre_init();
861
860 if (!cpu_has_tsc) 862 if (!cpu_has_tsc)
861 return; 863 return;
862 864
diff --git a/arch/x86/kernel/visws_quirks.c b/arch/x86/kernel/visws_quirks.c
index 2719091b3351..f068553a1b17 100644
--- a/arch/x86/kernel/visws_quirks.c
+++ b/arch/x86/kernel/visws_quirks.c
@@ -30,6 +30,7 @@
30#include <asm/setup.h> 30#include <asm/setup.h>
31#include <asm/apic.h> 31#include <asm/apic.h>
32#include <asm/e820.h> 32#include <asm/e820.h>
33#include <asm/time.h>
33#include <asm/io.h> 34#include <asm/io.h>
34 35
35#include <linux/kernel_stat.h> 36#include <linux/kernel_stat.h>
@@ -53,7 +54,7 @@ int is_visws_box(void)
53 return visws_board_type >= 0; 54 return visws_board_type >= 0;
54} 55}
55 56
56static int __init visws_time_init(void) 57static void __init visws_time_init(void)
57{ 58{
58 printk(KERN_INFO "Starting Cobalt Timer system clock\n"); 59 printk(KERN_INFO "Starting Cobalt Timer system clock\n");
59 60
@@ -66,11 +67,7 @@ static int __init visws_time_init(void)
66 /* Enable (unmask) the timer interrupt */ 67 /* Enable (unmask) the timer interrupt */
67 co_cpu_write(CO_CPU_CTRL, co_cpu_read(CO_CPU_CTRL) & ~CO_CTRL_TIMEMASK); 68 co_cpu_write(CO_CPU_CTRL, co_cpu_read(CO_CPU_CTRL) & ~CO_CTRL_TIMEMASK);
68 69
69 /* 70 setup_default_timer_irq();
70 * Zero return means the generic timer setup code will set up
71 * the standard vector:
72 */
73 return 0;
74} 71}
75 72
76/* Replaces the default init_ISA_irqs in the generic setup */ 73/* Replaces the default init_ISA_irqs in the generic setup */
@@ -226,10 +223,6 @@ static void __init visws_find_smp_config(unsigned int reserve)
226 223
227static void visws_trap_init(void); 224static void visws_trap_init(void);
228 225
229static struct x86_quirks visws_x86_quirks __initdata = {
230 .arch_time_init = visws_time_init,
231};
232
233void __init visws_early_detect(void) 226void __init visws_early_detect(void)
234{ 227{
235 int raw; 228 int raw;
@@ -241,17 +234,14 @@ void __init visws_early_detect(void)
241 return; 234 return;
242 235
243 /* 236 /*
244 * Install special quirks for timer, interrupt and memory setup: 237 * Override the default platform setup functions
245 * Fall back to generic behavior for traps:
246 * Override generic MP-table parsing:
247 */ 238 */
248 x86_quirks = &visws_x86_quirks;
249
250 x86_init.resources.memory_setup = visws_memory_setup; 239 x86_init.resources.memory_setup = visws_memory_setup;
251 x86_init.mpparse.get_smp_config = visws_get_smp_config; 240 x86_init.mpparse.get_smp_config = visws_get_smp_config;
252 x86_init.mpparse.find_smp_config = visws_find_smp_config; 241 x86_init.mpparse.find_smp_config = visws_find_smp_config;
253 x86_init.irqs.pre_vector_init = visws_pre_intr_init; 242 x86_init.irqs.pre_vector_init = visws_pre_intr_init;
254 x86_init.irqs.trap_init = visws_trap_init; 243 x86_init.irqs.trap_init = visws_trap_init;
244 x86_init.timers.timer_init = visws_time_init;
255 245
256 /* 246 /*
257 * Install reboot quirks: 247 * Install reboot quirks:
diff --git a/arch/x86/kernel/vmi_32.c b/arch/x86/kernel/vmi_32.c
index b43b6685cae1..cd7d0fbbf66e 100644
--- a/arch/x86/kernel/vmi_32.c
+++ b/arch/x86/kernel/vmi_32.c
@@ -817,7 +817,7 @@ static inline int __init activate_vmi(void)
817 vmi_timer_ops.set_alarm = vmi_get_function(VMI_CALL_SetAlarm); 817 vmi_timer_ops.set_alarm = vmi_get_function(VMI_CALL_SetAlarm);
818 vmi_timer_ops.cancel_alarm = 818 vmi_timer_ops.cancel_alarm =
819 vmi_get_function(VMI_CALL_CancelAlarm); 819 vmi_get_function(VMI_CALL_CancelAlarm);
820 pv_time_ops.time_init = vmi_time_init; 820 x86_init.timers.timer_init = vmi_time_init;
821 pv_time_ops.get_wallclock = vmi_get_wallclock; 821 pv_time_ops.get_wallclock = vmi_get_wallclock;
822 pv_time_ops.set_wallclock = vmi_set_wallclock; 822 pv_time_ops.set_wallclock = vmi_set_wallclock;
823#ifdef CONFIG_X86_LOCAL_APIC 823#ifdef CONFIG_X86_LOCAL_APIC
diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c
index e666a98db7cd..4790b92714a6 100644
--- a/arch/x86/kernel/x86_init.c
+++ b/arch/x86/kernel/x86_init.c
@@ -11,6 +11,7 @@
11#include <asm/setup.h> 11#include <asm/setup.h>
12#include <asm/apic.h> 12#include <asm/apic.h>
13#include <asm/e820.h> 13#include <asm/e820.h>
14#include <asm/time.h>
14#include <asm/irq.h> 15#include <asm/irq.h>
15 16
16void __cpuinit x86_init_noop(void) { } 17void __cpuinit x86_init_noop(void) { }
@@ -58,6 +59,8 @@ struct __initdata x86_init_ops x86_init = {
58 59
59 .timers = { 60 .timers = {
60 .setup_percpu_clockev = setup_boot_APIC_clock, 61 .setup_percpu_clockev = setup_boot_APIC_clock,
62 .tsc_pre_init = x86_init_noop,
63 .timer_init = hpet_time_init,
61 }, 64 },
62}; 65};
63 66
diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c
index 1ff986511f1d..6caa8c0c793b 100644
--- a/arch/x86/lguest/boot.c
+++ b/arch/x86/lguest/boot.c
@@ -1320,11 +1320,11 @@ __init void lguest_init(void)
1320 1320
1321 /* Time operations */ 1321 /* Time operations */
1322 pv_time_ops.get_wallclock = lguest_get_wallclock; 1322 pv_time_ops.get_wallclock = lguest_get_wallclock;
1323 pv_time_ops.time_init = lguest_time_init;
1324 pv_time_ops.get_tsc_khz = lguest_tsc_khz; 1323 pv_time_ops.get_tsc_khz = lguest_tsc_khz;
1325 1324
1326 x86_init.resources.memory_setup = lguest_memory_setup; 1325 x86_init.resources.memory_setup = lguest_memory_setup;
1327 x86_init.irqs.intr_init = lguest_init_IRQ; 1326 x86_init.irqs.intr_init = lguest_init_IRQ;
1327 x86_init.timers.timer_init = lguest_time_init;
1328 1328
1329 /* 1329 /*
1330 * Now is a good time to look at the implementations of these functions 1330 * Now is a good time to look at the implementations of these functions
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index 14e597e0c160..84826b842b54 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -842,8 +842,6 @@ static const struct pv_init_ops xen_init_ops __initdata = {
842}; 842};
843 843
844static const struct pv_time_ops xen_time_ops __initdata = { 844static const struct pv_time_ops xen_time_ops __initdata = {
845 .time_init = xen_time_init,
846
847 .set_wallclock = xen_set_wallclock, 845 .set_wallclock = xen_set_wallclock,
848 .get_wallclock = xen_get_wallclock, 846 .get_wallclock = xen_get_wallclock,
849 .get_tsc_khz = xen_tsc_khz, 847 .get_tsc_khz = xen_tsc_khz,
@@ -977,6 +975,8 @@ asmlinkage void __init xen_start_kernel(void)
977 x86_init.resources.memory_setup = xen_memory_setup; 975 x86_init.resources.memory_setup = xen_memory_setup;
978 x86_init.oem.arch_setup = xen_arch_setup; 976 x86_init.oem.arch_setup = xen_arch_setup;
979 x86_init.oem.banner = xen_banner; 977 x86_init.oem.banner = xen_banner;
978
979 x86_init.timers.timer_init = xen_time_init;
980 x86_init.timers.setup_percpu_clockev = x86_init_noop; 980 x86_init.timers.setup_percpu_clockev = x86_init_noop;
981 x86_cpuinit.setup_percpu_clockev = x86_init_noop; 981 x86_cpuinit.setup_percpu_clockev = x86_init_noop;
982 982