1
2
3
4#include <linux/hrtimer.h>
5#include <linux/tick.h>
6
7extern seqlock_t jiffies_lock;
8
9#ifdef CONFIG_GENERIC_CLOCKEVENTS_BUILD
10
11#define TICK_DO_TIMER_NONE -1
12#define TICK_DO_TIMER_BOOT -2
13
14DECLARE_PER_CPU(struct tick_device, tick_cpu_device);
15extern ktime_t tick_next_period;
16extern ktime_t tick_period;
17extern int tick_do_timer_cpu __read_mostly;
18
19extern void tick_setup_periodic(struct clock_event_device *dev, int broadcast);
20extern void tick_handle_periodic(struct clock_event_device *dev);
21
22extern void clockevents_shutdown(struct clock_event_device *dev);
23
24
25
26
27#ifdef CONFIG_TICK_ONESHOT
28extern void tick_setup_oneshot(struct clock_event_device *newdev,
29 void (*handler)(struct clock_event_device *),
30 ktime_t nextevt);
31extern int tick_program_event(ktime_t expires, int force);
32extern void tick_oneshot_notify(void);
33extern int tick_switch_to_oneshot(void (*handler)(struct clock_event_device *));
34extern void tick_resume_oneshot(void);
35# ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
36extern void tick_broadcast_setup_oneshot(struct clock_event_device *bc);
37extern void tick_broadcast_oneshot_control(unsigned long reason);
38extern void tick_broadcast_switch_to_oneshot(void);
39extern void tick_shutdown_broadcast_oneshot(unsigned int *cpup);
40extern int tick_resume_broadcast_oneshot(struct clock_event_device *bc);
41extern int tick_broadcast_oneshot_active(void);
42extern void tick_check_oneshot_broadcast(int cpu);
43bool tick_broadcast_oneshot_available(void);
44# else
45static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
46{
47 BUG();
48}
49static inline void tick_broadcast_oneshot_control(unsigned long reason) { }
50static inline void tick_broadcast_switch_to_oneshot(void) { }
51static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { }
52static inline int tick_broadcast_oneshot_active(void) { return 0; }
53static inline void tick_check_oneshot_broadcast(int cpu) { }
54static inline bool tick_broadcast_oneshot_available(void) { return true; }
55# endif
56
57#else
58static inline
59void tick_setup_oneshot(struct clock_event_device *newdev,
60 void (*handler)(struct clock_event_device *),
61 ktime_t nextevt)
62{
63 BUG();
64}
65static inline void tick_resume_oneshot(void)
66{
67 BUG();
68}
69static inline int tick_program_event(ktime_t expires, int force)
70{
71 return 0;
72}
73static inline void tick_oneshot_notify(void) { }
74static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
75{
76 BUG();
77}
78static inline void tick_broadcast_oneshot_control(unsigned long reason) { }
79static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { }
80static inline int tick_resume_broadcast_oneshot(struct clock_event_device *bc)
81{
82 return 0;
83}
84static inline int tick_broadcast_oneshot_active(void) { return 0; }
85static inline bool tick_broadcast_oneshot_available(void) { return false; }
86#endif
87
88
89
90
91#ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
92extern int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu);
93extern int tick_check_broadcast_device(struct clock_event_device *dev);
94extern int tick_is_broadcast_device(struct clock_event_device *dev);
95extern void tick_broadcast_on_off(unsigned long reason, int *oncpu);
96extern void tick_shutdown_broadcast(unsigned int *cpup);
97extern void tick_suspend_broadcast(void);
98extern int tick_resume_broadcast(void);
99extern void tick_broadcast_init(void);
100extern void
101tick_set_periodic_handler(struct clock_event_device *dev, int broadcast);
102
103#else
104
105static inline int tick_check_broadcast_device(struct clock_event_device *dev)
106{
107 return 0;
108}
109
110static inline int tick_is_broadcast_device(struct clock_event_device *dev)
111{
112 return 0;
113}
114static inline int tick_device_uses_broadcast(struct clock_event_device *dev,
115 int cpu)
116{
117 return 0;
118}
119static inline void tick_do_periodic_broadcast(struct clock_event_device *d) { }
120static inline void tick_broadcast_on_off(unsigned long reason, int *oncpu) { }
121static inline void tick_shutdown_broadcast(unsigned int *cpup) { }
122static inline void tick_suspend_broadcast(void) { }
123static inline int tick_resume_broadcast(void) { return 0; }
124static inline void tick_broadcast_init(void) { }
125
126
127
128
129static inline void tick_set_periodic_handler(struct clock_event_device *dev,
130 int broadcast)
131{
132 dev->event_handler = tick_handle_periodic;
133}
134#endif
135
136
137
138
139static inline int tick_device_is_functional(struct clock_event_device *dev)
140{
141 return !(dev->features & CLOCK_EVT_FEAT_DUMMY);
142}
143
144#endif
145
146extern void do_timer(unsigned long ticks);
147