diff options
Diffstat (limited to 'arch/arm/kernel/time.c')
-rw-r--r-- | arch/arm/kernel/time.c | 178 |
1 files changed, 0 insertions, 178 deletions
diff --git a/arch/arm/kernel/time.c b/arch/arm/kernel/time.c index d38cdf2c8276..28753805d2d1 100644 --- a/arch/arm/kernel/time.c +++ b/arch/arm/kernel/time.c | |||
@@ -10,11 +10,6 @@ | |||
10 | * | 10 | * |
11 | * This file contains the ARM-specific time handling details: | 11 | * This file contains the ARM-specific time handling details: |
12 | * reading the RTC at bootup, etc... | 12 | * reading the RTC at bootup, etc... |
13 | * | ||
14 | * 1994-07-02 Alan Modra | ||
15 | * fixed set_rtc_mmss, fixed time.year for >= 2000, new mktime | ||
16 | * 1998-12-20 Updated NTP code according to technical memorandum Jan '96 | ||
17 | * "A Kernel Model for Precision Timekeeping" by Dave Mills | ||
18 | */ | 13 | */ |
19 | #include <linux/module.h> | 14 | #include <linux/module.h> |
20 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
@@ -77,11 +72,6 @@ unsigned long profile_pc(struct pt_regs *regs) | |||
77 | EXPORT_SYMBOL(profile_pc); | 72 | EXPORT_SYMBOL(profile_pc); |
78 | #endif | 73 | #endif |
79 | 74 | ||
80 | /* | ||
81 | * hook for setting the RTC's idea of the current time. | ||
82 | */ | ||
83 | int (*set_rtc)(void); | ||
84 | |||
85 | #ifndef CONFIG_GENERIC_TIME | 75 | #ifndef CONFIG_GENERIC_TIME |
86 | static unsigned long dummy_gettimeoffset(void) | 76 | static unsigned long dummy_gettimeoffset(void) |
87 | { | 77 | { |
@@ -89,140 +79,6 @@ static unsigned long dummy_gettimeoffset(void) | |||
89 | } | 79 | } |
90 | #endif | 80 | #endif |
91 | 81 | ||
92 | static unsigned long next_rtc_update; | ||
93 | |||
94 | /* | ||
95 | * If we have an externally synchronized linux clock, then update | ||
96 | * CMOS clock accordingly every ~11 minutes. set_rtc() has to be | ||
97 | * called as close as possible to 500 ms before the new second | ||
98 | * starts. | ||
99 | */ | ||
100 | static inline void do_set_rtc(void) | ||
101 | { | ||
102 | if (!ntp_synced() || set_rtc == NULL) | ||
103 | return; | ||
104 | |||
105 | if (next_rtc_update && | ||
106 | time_before((unsigned long)xtime.tv_sec, next_rtc_update)) | ||
107 | return; | ||
108 | |||
109 | if (xtime.tv_nsec < 500000000 - ((unsigned) tick_nsec >> 1) && | ||
110 | xtime.tv_nsec >= 500000000 + ((unsigned) tick_nsec >> 1)) | ||
111 | return; | ||
112 | |||
113 | if (set_rtc()) | ||
114 | /* | ||
115 | * rtc update failed. Try again in 60s | ||
116 | */ | ||
117 | next_rtc_update = xtime.tv_sec + 60; | ||
118 | else | ||
119 | next_rtc_update = xtime.tv_sec + 660; | ||
120 | } | ||
121 | |||
122 | #ifdef CONFIG_LEDS | ||
123 | |||
124 | static void dummy_leds_event(led_event_t evt) | ||
125 | { | ||
126 | } | ||
127 | |||
128 | void (*leds_event)(led_event_t) = dummy_leds_event; | ||
129 | |||
130 | struct leds_evt_name { | ||
131 | const char name[8]; | ||
132 | int on; | ||
133 | int off; | ||
134 | }; | ||
135 | |||
136 | static const struct leds_evt_name evt_names[] = { | ||
137 | { "amber", led_amber_on, led_amber_off }, | ||
138 | { "blue", led_blue_on, led_blue_off }, | ||
139 | { "green", led_green_on, led_green_off }, | ||
140 | { "red", led_red_on, led_red_off }, | ||
141 | }; | ||
142 | |||
143 | static ssize_t leds_store(struct sys_device *dev, | ||
144 | struct sysdev_attribute *attr, | ||
145 | const char *buf, size_t size) | ||
146 | { | ||
147 | int ret = -EINVAL, len = strcspn(buf, " "); | ||
148 | |||
149 | if (len > 0 && buf[len] == '\0') | ||
150 | len--; | ||
151 | |||
152 | if (strncmp(buf, "claim", len) == 0) { | ||
153 | leds_event(led_claim); | ||
154 | ret = size; | ||
155 | } else if (strncmp(buf, "release", len) == 0) { | ||
156 | leds_event(led_release); | ||
157 | ret = size; | ||
158 | } else { | ||
159 | int i; | ||
160 | |||
161 | for (i = 0; i < ARRAY_SIZE(evt_names); i++) { | ||
162 | if (strlen(evt_names[i].name) != len || | ||
163 | strncmp(buf, evt_names[i].name, len) != 0) | ||
164 | continue; | ||
165 | if (strncmp(buf+len, " on", 3) == 0) { | ||
166 | leds_event(evt_names[i].on); | ||
167 | ret = size; | ||
168 | } else if (strncmp(buf+len, " off", 4) == 0) { | ||
169 | leds_event(evt_names[i].off); | ||
170 | ret = size; | ||
171 | } | ||
172 | break; | ||
173 | } | ||
174 | } | ||
175 | return ret; | ||
176 | } | ||
177 | |||
178 | static SYSDEV_ATTR(event, 0200, NULL, leds_store); | ||
179 | |||
180 | static int leds_suspend(struct sys_device *dev, pm_message_t state) | ||
181 | { | ||
182 | leds_event(led_stop); | ||
183 | return 0; | ||
184 | } | ||
185 | |||
186 | static int leds_resume(struct sys_device *dev) | ||
187 | { | ||
188 | leds_event(led_start); | ||
189 | return 0; | ||
190 | } | ||
191 | |||
192 | static int leds_shutdown(struct sys_device *dev) | ||
193 | { | ||
194 | leds_event(led_halted); | ||
195 | return 0; | ||
196 | } | ||
197 | |||
198 | static struct sysdev_class leds_sysclass = { | ||
199 | .name = "leds", | ||
200 | .shutdown = leds_shutdown, | ||
201 | .suspend = leds_suspend, | ||
202 | .resume = leds_resume, | ||
203 | }; | ||
204 | |||
205 | static struct sys_device leds_device = { | ||
206 | .id = 0, | ||
207 | .cls = &leds_sysclass, | ||
208 | }; | ||
209 | |||
210 | static int __init leds_init(void) | ||
211 | { | ||
212 | int ret; | ||
213 | ret = sysdev_class_register(&leds_sysclass); | ||
214 | if (ret == 0) | ||
215 | ret = sysdev_register(&leds_device); | ||
216 | if (ret == 0) | ||
217 | ret = sysdev_create_file(&leds_device, &attr_event); | ||
218 | return ret; | ||
219 | } | ||
220 | |||
221 | device_initcall(leds_init); | ||
222 | |||
223 | EXPORT_SYMBOL(leds_event); | ||
224 | #endif | ||
225 | |||
226 | #ifdef CONFIG_LEDS_TIMER | 82 | #ifdef CONFIG_LEDS_TIMER |
227 | static inline void do_leds(void) | 83 | static inline void do_leds(void) |
228 | { | 84 | { |
@@ -295,39 +151,6 @@ int do_settimeofday(struct timespec *tv) | |||
295 | EXPORT_SYMBOL(do_settimeofday); | 151 | EXPORT_SYMBOL(do_settimeofday); |
296 | #endif /* !CONFIG_GENERIC_TIME */ | 152 | #endif /* !CONFIG_GENERIC_TIME */ |
297 | 153 | ||
298 | /** | ||
299 | * save_time_delta - Save the offset between system time and RTC time | ||
300 | * @delta: pointer to timespec to store delta | ||
301 | * @rtc: pointer to timespec for current RTC time | ||
302 | * | ||
303 | * Return a delta between the system time and the RTC time, such | ||
304 | * that system time can be restored later with restore_time_delta() | ||
305 | */ | ||
306 | void save_time_delta(struct timespec *delta, struct timespec *rtc) | ||
307 | { | ||
308 | set_normalized_timespec(delta, | ||
309 | xtime.tv_sec - rtc->tv_sec, | ||
310 | xtime.tv_nsec - rtc->tv_nsec); | ||
311 | } | ||
312 | EXPORT_SYMBOL(save_time_delta); | ||
313 | |||
314 | /** | ||
315 | * restore_time_delta - Restore the current system time | ||
316 | * @delta: delta returned by save_time_delta() | ||
317 | * @rtc: pointer to timespec for current RTC time | ||
318 | */ | ||
319 | void restore_time_delta(struct timespec *delta, struct timespec *rtc) | ||
320 | { | ||
321 | struct timespec ts; | ||
322 | |||
323 | set_normalized_timespec(&ts, | ||
324 | delta->tv_sec + rtc->tv_sec, | ||
325 | delta->tv_nsec + rtc->tv_nsec); | ||
326 | |||
327 | do_settimeofday(&ts); | ||
328 | } | ||
329 | EXPORT_SYMBOL(restore_time_delta); | ||
330 | |||
331 | #ifndef CONFIG_GENERIC_CLOCKEVENTS | 154 | #ifndef CONFIG_GENERIC_CLOCKEVENTS |
332 | /* | 155 | /* |
333 | * Kernel system timer support. | 156 | * Kernel system timer support. |
@@ -336,7 +159,6 @@ void timer_tick(void) | |||
336 | { | 159 | { |
337 | profile_tick(CPU_PROFILING); | 160 | profile_tick(CPU_PROFILING); |
338 | do_leds(); | 161 | do_leds(); |
339 | do_set_rtc(); | ||
340 | write_seqlock(&xtime_lock); | 162 | write_seqlock(&xtime_lock); |
341 | do_timer(1); | 163 | do_timer(1); |
342 | write_sequnlock(&xtime_lock); | 164 | write_sequnlock(&xtime_lock); |