Pull bugfix into test branch
[sfrench/cifs-2.6.git] / include / asm-sh / timer.h
1 #ifndef __ASM_SH_TIMER_H
2 #define __ASM_SH_TIMER_H
3
4 #include <linux/sysdev.h>
5 #include <asm/cpu/timer.h>
6
7 struct sys_timer_ops {
8         int (*init)(void);
9         int (*start)(void);
10         int (*stop)(void);
11 #ifndef CONFIG_GENERIC_TIME
12         unsigned long (*get_offset)(void);
13 #endif
14 };
15
16 struct sys_timer {
17         const char              *name;
18
19         struct sys_device       dev;
20         struct sys_timer_ops    *ops;
21
22 #ifdef CONFIG_NO_IDLE_HZ
23         struct dyn_tick_timer   *dyn_tick;
24 #endif
25 };
26
27 #ifdef CONFIG_NO_IDLE_HZ
28 #define DYN_TICK_ENABLED        (1 << 1)
29
30 struct dyn_tick_timer {
31         spinlock_t      lock;
32         unsigned int    state;                  /* Current state */
33         int             (*enable)(void);        /* Enables dynamic tick */
34         int             (*disable)(void);       /* Disables dynamic tick */
35         void            (*reprogram)(unsigned long); /* Reprograms the timer */
36         int             (*handler)(int, void *);
37 };
38
39 void timer_dyn_reprogram(void);
40 #else
41 #define timer_dyn_reprogram()   do { } while (0)
42 #endif
43
44 #define TICK_SIZE (tick_nsec / 1000)
45
46 extern struct sys_timer tmu_timer, cmt_timer, mtu2_timer;
47 extern struct sys_timer *sys_timer;
48
49 #ifndef CONFIG_GENERIC_TIME
50 static inline unsigned long get_timer_offset(void)
51 {
52         return sys_timer->ops->get_offset();
53 }
54 #endif
55
56 /* arch/sh/kernel/timers/timer.c */
57 struct sys_timer *get_sys_timer(void);
58
59 /* arch/sh/kernel/time.c */
60 void handle_timer_tick(void);
61
62 #endif /* __ASM_SH_TIMER_H */