Merge tag 'v3.10.108' into update
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / kernel / time / tick-internal.h
CommitLineData
f8381cba
TG
1/*
2 * tick internal variable and functions used by low/high res code
3 */
e2830b5c
TH
4#include <linux/hrtimer.h>
5#include <linux/tick.h>
6441402b 6
eb93e4d9
TG
7extern seqlock_t jiffies_lock;
8
7cf37e87 9#ifdef CONFIG_GENERIC_CLOCKEVENTS_BUILD
6441402b
TG
10
11#define TICK_DO_TIMER_NONE -1
12#define TICK_DO_TIMER_BOOT -2
13
f8381cba 14DECLARE_PER_CPU(struct tick_device, tick_cpu_device);
f8381cba
TG
15extern ktime_t tick_next_period;
16extern ktime_t tick_period;
d3ed7824 17extern int tick_do_timer_cpu __read_mostly;
f8381cba
TG
18
19extern void tick_setup_periodic(struct clock_event_device *dev, int broadcast);
20extern void tick_handle_periodic(struct clock_event_device *dev);
e8d63033
TG
21extern void tick_notify(unsigned long reason, void *dev);
22extern void tick_check_new_device(struct clock_event_device *dev);
f8381cba 23
2344abbc
TG
24extern void clockevents_shutdown(struct clock_event_device *dev);
25
79bf2bb3
TG
26/*
27 * NO_HZ / high resolution timer shared code
28 */
29#ifdef CONFIG_TICK_ONESHOT
30extern void tick_setup_oneshot(struct clock_event_device *newdev,
31 void (*handler)(struct clock_event_device *),
32 ktime_t nextevt);
33extern int tick_program_event(ktime_t expires, int force);
34extern void tick_oneshot_notify(void);
35extern int tick_switch_to_oneshot(void (*handler)(struct clock_event_device *));
cd05a1f8 36extern void tick_resume_oneshot(void);
79bf2bb3
TG
37# ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
38extern void tick_broadcast_setup_oneshot(struct clock_event_device *bc);
39extern void tick_broadcast_oneshot_control(unsigned long reason);
40extern void tick_broadcast_switch_to_oneshot(void);
41extern void tick_shutdown_broadcast_oneshot(unsigned int *cpup);
cd05a1f8 42extern int tick_resume_broadcast_oneshot(struct clock_event_device *bc);
27ce4cb4 43extern int tick_broadcast_oneshot_active(void);
fb02fbc1 44extern void tick_check_oneshot_broadcast(int cpu);
3a142a06 45bool tick_broadcast_oneshot_available(void);
79bf2bb3
TG
46# else /* BROADCAST */
47static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
48{
49 BUG();
50}
51static inline void tick_broadcast_oneshot_control(unsigned long reason) { }
52static inline void tick_broadcast_switch_to_oneshot(void) { }
53static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { }
27ce4cb4 54static inline int tick_broadcast_oneshot_active(void) { return 0; }
fb02fbc1 55static inline void tick_check_oneshot_broadcast(int cpu) { }
3a142a06 56static inline bool tick_broadcast_oneshot_available(void) { return true; }
79bf2bb3
TG
57# endif /* !BROADCAST */
58
59#else /* !ONESHOT */
60static inline
61void tick_setup_oneshot(struct clock_event_device *newdev,
62 void (*handler)(struct clock_event_device *),
63 ktime_t nextevt)
64{
65 BUG();
66}
cd05a1f8
TG
67static inline void tick_resume_oneshot(void)
68{
69 BUG();
70}
79bf2bb3
TG
71static inline int tick_program_event(ktime_t expires, int force)
72{
73 return 0;
74}
75static inline void tick_oneshot_notify(void) { }
76static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
77{
78 BUG();
79}
80static inline void tick_broadcast_oneshot_control(unsigned long reason) { }
81static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { }
cd05a1f8
TG
82static inline int tick_resume_broadcast_oneshot(struct clock_event_device *bc)
83{
84 return 0;
85}
f8e256c6 86static inline int tick_broadcast_oneshot_active(void) { return 0; }
3a142a06 87static inline bool tick_broadcast_oneshot_available(void) { return false; }
79bf2bb3
TG
88#endif /* !TICK_ONESHOT */
89
f8381cba
TG
90/*
91 * Broadcasting support
92 */
93#ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
f8381cba 94extern int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu);
e8d63033 95extern void tick_install_broadcast_device(struct clock_event_device *dev);
f8381cba
TG
96extern int tick_is_broadcast_device(struct clock_event_device *dev);
97extern void tick_broadcast_on_off(unsigned long reason, int *oncpu);
98extern void tick_shutdown_broadcast(unsigned int *cpup);
6321dd60
TG
99extern void tick_suspend_broadcast(void);
100extern int tick_resume_broadcast(void);
b352bc1c 101extern void tick_broadcast_init(void);
f8381cba
TG
102extern void
103tick_set_periodic_handler(struct clock_event_device *dev, int broadcast);
104
105#else /* !BROADCAST */
106
e8d63033 107static inline void tick_install_broadcast_device(struct clock_event_device *dev)
f8381cba 108{
f8381cba
TG
109}
110
111static inline int tick_is_broadcast_device(struct clock_event_device *dev)
112{
113 return 0;
114}
115static inline int tick_device_uses_broadcast(struct clock_event_device *dev,
116 int cpu)
117{
118 return 0;
119}
120static inline void tick_do_periodic_broadcast(struct clock_event_device *d) { }
121static inline void tick_broadcast_on_off(unsigned long reason, int *oncpu) { }
122static inline void tick_shutdown_broadcast(unsigned int *cpup) { }
6321dd60
TG
123static inline void tick_suspend_broadcast(void) { }
124static inline int tick_resume_broadcast(void) { return 0; }
b352bc1c 125static inline void tick_broadcast_init(void) { }
f8381cba
TG
126
127/*
128 * Set the periodic handler in non broadcast mode
129 */
130static inline void tick_set_periodic_handler(struct clock_event_device *dev,
131 int broadcast)
132{
133 dev->event_handler = tick_handle_periodic;
134}
135#endif /* !BROADCAST */
136
137/*
138 * Check, if the device is functional or a dummy for broadcast
139 */
140static inline int tick_device_is_functional(struct clock_event_device *dev)
141{
142 return !(dev->features & CLOCK_EVT_FEAT_DUMMY);
143}
e2830b5c 144
7cf37e87
TG
145#endif
146
e2830b5c 147extern void do_timer(unsigned long ticks);