c770413c32130380dc21c11a6b46964ca40c70c7
[safe/jmp/linux-2.6] / arch / sh / kernel / time_32.c
1 /*
2  *  arch/sh/kernel/time_32.c
3  *
4  *  Copyright (C) 1999  Tetsuya Okada & Niibe Yutaka
5  *  Copyright (C) 2000  Philipp Rumpf <prumpf@tux.org>
6  *  Copyright (C) 2002 - 2008  Paul Mundt
7  *  Copyright (C) 2002  M. R. Brown  <mrbrown@linux-sh.org>
8  *
9  *  Some code taken from i386 version.
10  *    Copyright (C) 1991, 1992, 1995  Linus Torvalds
11  */
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/init.h>
15 #include <linux/profile.h>
16 #include <linux/timex.h>
17 #include <linux/sched.h>
18 #include <linux/clockchips.h>
19 #include <linux/mc146818rtc.h>  /* for rtc_lock */
20 #include <linux/platform_device.h>
21 #include <linux/smp.h>
22 #include <asm/clock.h>
23 #include <asm/rtc.h>
24 #include <asm/timer.h>
25 #include <asm/kgdb.h>
26
27 struct sys_timer *sys_timer;
28
29 /* Move this somewhere more sensible.. */
30 DEFINE_SPINLOCK(rtc_lock);
31 EXPORT_SYMBOL(rtc_lock);
32
33 /* Dummy RTC ops */
34 static void null_rtc_get_time(struct timespec *tv)
35 {
36         tv->tv_sec = mktime(2000, 1, 1, 0, 0, 0);
37         tv->tv_nsec = 0;
38 }
39
40 static int null_rtc_set_time(const time_t secs)
41 {
42         return 0;
43 }
44
45 void (*rtc_sh_get_time)(struct timespec *) = null_rtc_get_time;
46 int (*rtc_sh_set_time)(const time_t) = null_rtc_set_time;
47
48 #ifndef CONFIG_GENERIC_TIME
49 void do_gettimeofday(struct timeval *tv)
50 {
51         unsigned long flags;
52         unsigned long seq;
53         unsigned long usec, sec;
54
55         do {
56                 /*
57                  * Turn off IRQs when grabbing xtime_lock, so that
58                  * the sys_timer get_offset code doesn't have to handle it.
59                  */
60                 seq = read_seqbegin_irqsave(&xtime_lock, flags);
61                 usec = get_timer_offset();
62                 sec = xtime.tv_sec;
63                 usec += xtime.tv_nsec / NSEC_PER_USEC;
64         } while (read_seqretry_irqrestore(&xtime_lock, seq, flags));
65
66         while (usec >= 1000000) {
67                 usec -= 1000000;
68                 sec++;
69         }
70
71         tv->tv_sec = sec;
72         tv->tv_usec = usec;
73 }
74 EXPORT_SYMBOL(do_gettimeofday);
75
76 int do_settimeofday(struct timespec *tv)
77 {
78         time_t wtm_sec, sec = tv->tv_sec;
79         long wtm_nsec, nsec = tv->tv_nsec;
80
81         if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
82                 return -EINVAL;
83
84         write_seqlock_irq(&xtime_lock);
85         /*
86          * This is revolting. We need to set "xtime" correctly. However, the
87          * value in this location is the value at the most recent update of
88          * wall time.  Discover what correction gettimeofday() would have
89          * made, and then undo it!
90          */
91         nsec -= get_timer_offset() * NSEC_PER_USEC;
92
93         wtm_sec  = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec);
94         wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec);
95
96         set_normalized_timespec(&xtime, sec, nsec);
97         set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec);
98
99         ntp_clear();
100         write_sequnlock_irq(&xtime_lock);
101         clock_was_set();
102
103         return 0;
104 }
105 EXPORT_SYMBOL(do_settimeofday);
106 #endif /* !CONFIG_GENERIC_TIME */
107
108 /* last time the RTC clock got updated */
109 static long last_rtc_update;
110
111 /*
112  * handle_timer_tick() needs to keep up the real-time clock,
113  * as well as call the "do_timer()" routine every clocktick
114  */
115 void handle_timer_tick(void)
116 {
117         if (current->pid)
118                 profile_tick(CPU_PROFILING);
119
120         /*
121          * Here we are in the timer irq handler. We just have irqs locally
122          * disabled but we don't know if the timer_bh is running on the other
123          * CPU. We need to avoid to SMP race with it. NOTE: we don' t need
124          * the irq version of write_lock because as just said we have irq
125          * locally disabled. -arca
126          */
127         write_seqlock(&xtime_lock);
128         do_timer(1);
129
130         /*
131          * If we have an externally synchronized Linux clock, then update
132          * RTC clock accordingly every ~11 minutes. Set_rtc_mmss() has to be
133          * called as close as possible to 500 ms before the new second starts.
134          */
135         if (ntp_synced() &&
136             xtime.tv_sec > last_rtc_update + 660 &&
137             (xtime.tv_nsec / 1000) >= 500000 - ((unsigned) TICK_SIZE) / 2 &&
138             (xtime.tv_nsec / 1000) <= 500000 + ((unsigned) TICK_SIZE) / 2) {
139                 if (rtc_sh_set_time(xtime.tv_sec) == 0)
140                         last_rtc_update = xtime.tv_sec;
141                 else
142                         /* do it again in 60s */
143                         last_rtc_update = xtime.tv_sec - 600;
144         }
145         write_sequnlock(&xtime_lock);
146
147 #ifndef CONFIG_SMP
148         update_process_times(user_mode(get_irq_regs()));
149 #endif
150 }
151
152 #ifdef CONFIG_PM
153 int timer_suspend(struct sys_device *dev, pm_message_t state)
154 {
155         struct sys_timer *sys_timer = container_of(dev, struct sys_timer, dev);
156
157         sys_timer->ops->stop();
158
159         return 0;
160 }
161
162 int timer_resume(struct sys_device *dev)
163 {
164         struct sys_timer *sys_timer = container_of(dev, struct sys_timer, dev);
165
166         sys_timer->ops->start();
167
168         return 0;
169 }
170 #else
171 #define timer_suspend NULL
172 #define timer_resume NULL
173 #endif
174
175 static struct sysdev_class timer_sysclass = {
176         .name    = "timer",
177         .suspend = timer_suspend,
178         .resume  = timer_resume,
179 };
180
181 static int __init timer_init_sysfs(void)
182 {
183         int ret;
184
185         if (!sys_timer)
186                 return 0;
187
188         ret = sysdev_class_register(&timer_sysclass);
189         if (ret != 0)
190                 return ret;
191
192         sys_timer->dev.cls = &timer_sysclass;
193         return sysdev_register(&sys_timer->dev);
194 }
195 device_initcall(timer_init_sysfs);
196
197 void (*board_time_init)(void);
198
199 struct clocksource clocksource_sh = {
200         .name           = "SuperH",
201 };
202
203 #ifdef CONFIG_GENERIC_TIME
204 unsigned long long sched_clock(void)
205 {
206         unsigned long long cycles;
207
208         /* jiffies based sched_clock if no clocksource is installed */
209         if (!clocksource_sh.rating)
210                 return (unsigned long long)jiffies * (NSEC_PER_SEC / HZ);
211
212         cycles = clocksource_sh.read(&clocksource_sh);
213         return cyc2ns(&clocksource_sh, cycles);
214 }
215 #endif
216
217 void __init time_init(void)
218 {
219         if (board_time_init)
220                 board_time_init();
221
222         clk_init();
223
224         rtc_sh_get_time(&xtime);
225         set_normalized_timespec(&wall_to_monotonic,
226                                 -xtime.tv_sec, -xtime.tv_nsec);
227
228 #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
229         local_timer_setup(smp_processor_id());
230 #endif
231
232         /*
233          * Make sure all compiled-in early timers register themselves.
234          * Run probe() for one "earlytimer" device.
235          */
236         early_platform_driver_register_all("earlytimer");
237         if (early_platform_driver_probe("earlytimer", 1, 0))
238                 return;
239
240         /*
241          * Find the timer to use as the system timer, it will be
242          * initialized for us.
243          */
244         sys_timer = get_sys_timer();
245         if (unlikely(!sys_timer))
246                 panic("System timer missing.\n");
247
248         printk(KERN_INFO "Using %s for system timer\n", sys_timer->name);
249 }