2 * tick internal variable and functions used by low/high res code
4 #include <linux/hrtimer.h>
5 #include <linux/tick.h>
7 #include "timekeeping.h"
9 extern seqlock_t jiffies_lock
;
11 #define CS_NAME_LEN 32
13 #ifdef CONFIG_GENERIC_CLOCKEVENTS_BUILD
15 #define TICK_DO_TIMER_NONE -1
16 #define TICK_DO_TIMER_BOOT -2
18 DECLARE_PER_CPU(struct tick_device
, tick_cpu_device
);
19 extern ktime_t tick_next_period
;
20 extern ktime_t tick_period
;
21 extern int tick_do_timer_cpu __read_mostly
;
23 extern void tick_setup_periodic(struct clock_event_device
*dev
, int broadcast
);
24 extern void tick_handle_periodic(struct clock_event_device
*dev
);
25 extern void tick_check_new_device(struct clock_event_device
*dev
);
26 extern void tick_handover_do_timer(int *cpup
);
27 extern void tick_shutdown(unsigned int *cpup
);
28 extern void tick_suspend(void);
29 extern void tick_resume(void);
30 extern bool tick_check_replacement(struct clock_event_device
*curdev
,
31 struct clock_event_device
*newdev
);
32 extern void tick_install_replacement(struct clock_event_device
*dev
);
34 extern void clockevents_shutdown(struct clock_event_device
*dev
);
36 extern ssize_t
sysfs_get_uname(const char *buf
, char *dst
, size_t cnt
);
39 * NO_HZ / high resolution timer shared code
41 #ifdef CONFIG_TICK_ONESHOT
42 extern void tick_setup_oneshot(struct clock_event_device
*newdev
,
43 void (*handler
)(struct clock_event_device
*),
45 extern int tick_program_event(ktime_t expires
, int force
);
46 extern void tick_oneshot_notify(void);
47 extern int tick_switch_to_oneshot(void (*handler
)(struct clock_event_device
*));
48 extern void tick_resume_oneshot(void);
49 # ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
50 extern void tick_broadcast_setup_oneshot(struct clock_event_device
*bc
);
51 extern int tick_broadcast_oneshot_control(unsigned long reason
);
52 extern void tick_broadcast_switch_to_oneshot(void);
53 extern void tick_shutdown_broadcast_oneshot(unsigned int *cpup
);
54 extern int tick_resume_broadcast_oneshot(struct clock_event_device
*bc
);
55 extern int tick_broadcast_oneshot_active(void);
56 extern void tick_check_oneshot_broadcast_this_cpu(void);
57 bool tick_broadcast_oneshot_available(void);
58 # else /* BROADCAST */
59 static inline void tick_broadcast_setup_oneshot(struct clock_event_device
*bc
)
63 static inline int tick_broadcast_oneshot_control(unsigned long reason
) { return 0; }
64 static inline void tick_broadcast_switch_to_oneshot(void) { }
65 static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup
) { }
66 static inline int tick_broadcast_oneshot_active(void) { return 0; }
67 static inline void tick_check_oneshot_broadcast_this_cpu(void) { }
68 static inline bool tick_broadcast_oneshot_available(void) { return true; }
69 # endif /* !BROADCAST */
73 void tick_setup_oneshot(struct clock_event_device
*newdev
,
74 void (*handler
)(struct clock_event_device
*),
79 static inline void tick_resume_oneshot(void)
83 static inline int tick_program_event(ktime_t expires
, int force
)
87 static inline void tick_oneshot_notify(void) { }
88 static inline void tick_broadcast_setup_oneshot(struct clock_event_device
*bc
)
92 static inline int tick_broadcast_oneshot_control(unsigned long reason
) { return 0; }
93 static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup
) { }
94 static inline int tick_resume_broadcast_oneshot(struct clock_event_device
*bc
)
98 static inline int tick_broadcast_oneshot_active(void) { return 0; }
99 static inline bool tick_broadcast_oneshot_available(void) { return false; }
100 #endif /* !TICK_ONESHOT */
102 /* NO_HZ_FULL internal */
103 #ifdef CONFIG_NO_HZ_FULL
104 extern void tick_nohz_init(void);
106 static inline void tick_nohz_init(void) { }
110 * Broadcasting support
112 #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
113 extern int tick_device_uses_broadcast(struct clock_event_device
*dev
, int cpu
);
114 extern void tick_install_broadcast_device(struct clock_event_device
*dev
);
115 extern int tick_is_broadcast_device(struct clock_event_device
*dev
);
116 extern void tick_broadcast_on_off(unsigned long reason
, int *oncpu
);
117 extern void tick_shutdown_broadcast(unsigned int *cpup
);
118 extern void tick_suspend_broadcast(void);
119 extern int tick_resume_broadcast(void);
120 extern void tick_broadcast_init(void);
122 tick_set_periodic_handler(struct clock_event_device
*dev
, int broadcast
);
123 int tick_broadcast_update_freq(struct clock_event_device
*dev
, u32 freq
);
125 #else /* !BROADCAST */
127 static inline void tick_install_broadcast_device(struct clock_event_device
*dev
)
131 static inline int tick_is_broadcast_device(struct clock_event_device
*dev
)
135 static inline int tick_device_uses_broadcast(struct clock_event_device
*dev
,
140 static inline void tick_do_periodic_broadcast(struct clock_event_device
*d
) { }
141 static inline void tick_broadcast_on_off(unsigned long reason
, int *oncpu
) { }
142 static inline void tick_shutdown_broadcast(unsigned int *cpup
) { }
143 static inline void tick_suspend_broadcast(void) { }
144 static inline int tick_resume_broadcast(void) { return 0; }
145 static inline void tick_broadcast_init(void) { }
146 static inline int tick_broadcast_update_freq(struct clock_event_device
*dev
,
147 u32 freq
) { return -ENODEV
; }
150 * Set the periodic handler in non broadcast mode
152 static inline void tick_set_periodic_handler(struct clock_event_device
*dev
,
155 dev
->event_handler
= tick_handle_periodic
;
157 #endif /* !BROADCAST */
160 * Check, if the device is functional or a dummy for broadcast
162 static inline int tick_device_is_functional(struct clock_event_device
*dev
)
164 return !(dev
->features
& CLOCK_EVT_FEAT_DUMMY
);
167 int __clockevents_update_freq(struct clock_event_device
*dev
, u32 freq
);
171 extern void do_timer(unsigned long ticks
);
172 extern void update_wall_time(void);