diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2008-01-30 07:30:26 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 07:30:26 -0500 |
commit | fe599f9fbc5d470ec5b55d08f2bbb991ddecbbc8 (patch) | |
tree | be07dcd4062fbcb801ae833678b3818d2fd47ceb /arch/x86/kernel/time_32.c | |
parent | 6ce60b07e670e800c4c5cfe984ed5188e7a64135 (diff) |
x86: isolate the rtc code for sharing
The mach-default/mach_time.h code inline is moved to arch/x86/kernel/rtc.c
and the header files are adjusted.
Shrink the 3 dozen includes to the ones we really need.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/time_32.c')
-rw-r--r-- | arch/x86/kernel/time_32.c | 105 |
1 files changed, 4 insertions, 101 deletions
diff --git a/arch/x86/kernel/time_32.c b/arch/x86/kernel/time_32.c index 8a322c96bc23..e9ead762abe8 100644 --- a/arch/x86/kernel/time_32.c +++ b/arch/x86/kernel/time_32.c | |||
@@ -28,98 +28,21 @@ | |||
28 | * serialize accesses to xtime/lost_ticks). | 28 | * serialize accesses to xtime/lost_ticks). |
29 | */ | 29 | */ |
30 | 30 | ||
31 | #include <linux/errno.h> | 31 | #include <linux/init.h> |
32 | #include <linux/sched.h> | ||
33 | #include <linux/kernel.h> | ||
34 | #include <linux/param.h> | ||
35 | #include <linux/string.h> | ||
36 | #include <linux/mm.h> | ||
37 | #include <linux/interrupt.h> | 32 | #include <linux/interrupt.h> |
38 | #include <linux/time.h> | 33 | #include <linux/time.h> |
39 | #include <linux/delay.h> | ||
40 | #include <linux/init.h> | ||
41 | #include <linux/smp.h> | ||
42 | #include <linux/module.h> | ||
43 | #include <linux/sysdev.h> | ||
44 | #include <linux/bcd.h> | ||
45 | #include <linux/efi.h> | ||
46 | #include <linux/mca.h> | 34 | #include <linux/mca.h> |
47 | 35 | ||
48 | #include <asm/io.h> | ||
49 | #include <asm/smp.h> | ||
50 | #include <asm/irq.h> | ||
51 | #include <asm/msr.h> | ||
52 | #include <asm/delay.h> | ||
53 | #include <asm/mpspec.h> | ||
54 | #include <asm/uaccess.h> | ||
55 | #include <asm/processor.h> | ||
56 | #include <asm/timer.h> | ||
57 | #include <asm/time.h> | ||
58 | |||
59 | #include "mach_time.h" | ||
60 | |||
61 | #include <linux/timex.h> | ||
62 | |||
63 | #include <asm/hpet.h> | ||
64 | |||
65 | #include <asm/arch_hooks.h> | 36 | #include <asm/arch_hooks.h> |
37 | #include <asm/hpet.h> | ||
38 | #include <asm/time.h> | ||
66 | 39 | ||
67 | #include "io_ports.h" | 40 | #include "io_ports.h" |
68 | |||
69 | #include <asm/i8259.h> | ||
70 | |||
71 | #include "do_timer.h" | 41 | #include "do_timer.h" |
72 | 42 | ||
73 | unsigned int cpu_khz; /* Detected as we calibrate the TSC */ | 43 | unsigned int cpu_khz; /* Detected as we calibrate the TSC */ |
74 | EXPORT_SYMBOL(cpu_khz); | 44 | EXPORT_SYMBOL(cpu_khz); |
75 | 45 | ||
76 | DEFINE_SPINLOCK(rtc_lock); | ||
77 | EXPORT_SYMBOL(rtc_lock); | ||
78 | |||
79 | /* | ||
80 | * This is a special lock that is owned by the CPU and holds the index | ||
81 | * register we are working with. It is required for NMI access to the | ||
82 | * CMOS/RTC registers. See include/asm-i386/mc146818rtc.h for details. | ||
83 | */ | ||
84 | volatile unsigned long cmos_lock = 0; | ||
85 | EXPORT_SYMBOL(cmos_lock); | ||
86 | |||
87 | /* Routines for accessing the CMOS RAM/RTC. */ | ||
88 | unsigned char rtc_cmos_read(unsigned char addr) | ||
89 | { | ||
90 | unsigned char val; | ||
91 | lock_cmos_prefix(addr); | ||
92 | outb_p(addr, RTC_PORT(0)); | ||
93 | val = inb_p(RTC_PORT(1)); | ||
94 | lock_cmos_suffix(addr); | ||
95 | return val; | ||
96 | } | ||
97 | EXPORT_SYMBOL(rtc_cmos_read); | ||
98 | |||
99 | void rtc_cmos_write(unsigned char val, unsigned char addr) | ||
100 | { | ||
101 | lock_cmos_prefix(addr); | ||
102 | outb_p(addr, RTC_PORT(0)); | ||
103 | outb_p(val, RTC_PORT(1)); | ||
104 | lock_cmos_suffix(addr); | ||
105 | } | ||
106 | EXPORT_SYMBOL(rtc_cmos_write); | ||
107 | |||
108 | static int set_rtc_mmss(unsigned long nowtime) | ||
109 | { | ||
110 | int retval; | ||
111 | unsigned long flags; | ||
112 | |||
113 | /* gets recalled with irq locally disabled */ | ||
114 | /* XXX - does irqsave resolve this? -johnstul */ | ||
115 | spin_lock_irqsave(&rtc_lock, flags); | ||
116 | retval = set_wallclock(nowtime); | ||
117 | spin_unlock_irqrestore(&rtc_lock, flags); | ||
118 | |||
119 | return retval; | ||
120 | } | ||
121 | |||
122 | |||
123 | int timer_ack; | 46 | int timer_ack; |
124 | 47 | ||
125 | unsigned long profile_pc(struct pt_regs *regs) | 48 | unsigned long profile_pc(struct pt_regs *regs) |
@@ -137,7 +60,7 @@ unsigned long profile_pc(struct pt_regs *regs) | |||
137 | /* Return address is either directly at stack pointer | 60 | /* Return address is either directly at stack pointer |
138 | or above a saved eflags. Eflags has bits 22-31 zero, | 61 | or above a saved eflags. Eflags has bits 22-31 zero, |
139 | kernel addresses don't. */ | 62 | kernel addresses don't. */ |
140 | if (sp[0] >> 22) | 63 | if (sp[0] >> 22) |
141 | return sp[0]; | 64 | return sp[0]; |
142 | if (sp[1] >> 22) | 65 | if (sp[1] >> 22) |
143 | return sp[1]; | 66 | return sp[1]; |
@@ -193,26 +116,6 @@ irqreturn_t timer_interrupt(int irq, void *dev_id) | |||
193 | return IRQ_HANDLED; | 116 | return IRQ_HANDLED; |
194 | } | 117 | } |
195 | 118 | ||
196 | /* not static: needed by APM */ | ||
197 | unsigned long read_persistent_clock(void) | ||
198 | { | ||
199 | unsigned long retval; | ||
200 | unsigned long flags; | ||
201 | |||
202 | spin_lock_irqsave(&rtc_lock, flags); | ||
203 | |||
204 | retval = get_wallclock(); | ||
205 | |||
206 | spin_unlock_irqrestore(&rtc_lock, flags); | ||
207 | |||
208 | return retval; | ||
209 | } | ||
210 | |||
211 | int update_persistent_clock(struct timespec now) | ||
212 | { | ||
213 | return set_rtc_mmss(now.tv_sec); | ||
214 | } | ||
215 | |||
216 | extern void (*late_time_init)(void); | 119 | extern void (*late_time_init)(void); |
217 | /* Duplicate of time_init() below, with hpet_enable part added */ | 120 | /* Duplicate of time_init() below, with hpet_enable part added */ |
218 | void __init hpet_time_init(void) | 121 | void __init hpet_time_init(void) |