xref: /openbmc/linux/kernel/time/tick-internal.h (revision f8381cba)
1f8381cbaSThomas Gleixner /*
2f8381cbaSThomas Gleixner  * tick internal variable and functions used by low/high res code
3f8381cbaSThomas Gleixner  */
4f8381cbaSThomas Gleixner DECLARE_PER_CPU(struct tick_device, tick_cpu_device);
5f8381cbaSThomas Gleixner extern spinlock_t tick_device_lock;
6f8381cbaSThomas Gleixner extern ktime_t tick_next_period;
7f8381cbaSThomas Gleixner extern ktime_t tick_period;
8f8381cbaSThomas Gleixner 
9f8381cbaSThomas Gleixner extern void tick_setup_periodic(struct clock_event_device *dev, int broadcast);
10f8381cbaSThomas Gleixner extern void tick_handle_periodic(struct clock_event_device *dev);
11f8381cbaSThomas Gleixner 
12f8381cbaSThomas Gleixner /*
13f8381cbaSThomas Gleixner  * Broadcasting support
14f8381cbaSThomas Gleixner  */
15f8381cbaSThomas Gleixner #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
16f8381cbaSThomas Gleixner extern int tick_do_broadcast(cpumask_t mask);
17f8381cbaSThomas Gleixner extern struct tick_device tick_broadcast_device;
18f8381cbaSThomas Gleixner extern spinlock_t tick_broadcast_lock;
19f8381cbaSThomas Gleixner 
20f8381cbaSThomas Gleixner extern int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu);
21f8381cbaSThomas Gleixner extern int tick_check_broadcast_device(struct clock_event_device *dev);
22f8381cbaSThomas Gleixner extern int tick_is_broadcast_device(struct clock_event_device *dev);
23f8381cbaSThomas Gleixner extern void tick_broadcast_on_off(unsigned long reason, int *oncpu);
24f8381cbaSThomas Gleixner extern void tick_shutdown_broadcast(unsigned int *cpup);
25f8381cbaSThomas Gleixner 
26f8381cbaSThomas Gleixner extern void
27f8381cbaSThomas Gleixner tick_set_periodic_handler(struct clock_event_device *dev, int broadcast);
28f8381cbaSThomas Gleixner 
29f8381cbaSThomas Gleixner #else /* !BROADCAST */
30f8381cbaSThomas Gleixner 
31f8381cbaSThomas Gleixner static inline int tick_check_broadcast_device(struct clock_event_device *dev)
32f8381cbaSThomas Gleixner {
33f8381cbaSThomas Gleixner 	return 0;
34f8381cbaSThomas Gleixner }
35f8381cbaSThomas Gleixner 
36f8381cbaSThomas Gleixner static inline int tick_is_broadcast_device(struct clock_event_device *dev)
37f8381cbaSThomas Gleixner {
38f8381cbaSThomas Gleixner 	return 0;
39f8381cbaSThomas Gleixner }
40f8381cbaSThomas Gleixner static inline int tick_device_uses_broadcast(struct clock_event_device *dev,
41f8381cbaSThomas Gleixner 					     int cpu)
42f8381cbaSThomas Gleixner {
43f8381cbaSThomas Gleixner 	return 0;
44f8381cbaSThomas Gleixner }
45f8381cbaSThomas Gleixner static inline void tick_do_periodic_broadcast(struct clock_event_device *d) { }
46f8381cbaSThomas Gleixner static inline void tick_broadcast_on_off(unsigned long reason, int *oncpu) { }
47f8381cbaSThomas Gleixner static inline void tick_shutdown_broadcast(unsigned int *cpup) { }
48f8381cbaSThomas Gleixner 
49f8381cbaSThomas Gleixner /*
50f8381cbaSThomas Gleixner  * Set the periodic handler in non broadcast mode
51f8381cbaSThomas Gleixner  */
52f8381cbaSThomas Gleixner static inline void tick_set_periodic_handler(struct clock_event_device *dev,
53f8381cbaSThomas Gleixner 					     int broadcast)
54f8381cbaSThomas Gleixner {
55f8381cbaSThomas Gleixner 	dev->event_handler = tick_handle_periodic;
56f8381cbaSThomas Gleixner }
57f8381cbaSThomas Gleixner #endif /* !BROADCAST */
58f8381cbaSThomas Gleixner 
59f8381cbaSThomas Gleixner /*
60f8381cbaSThomas Gleixner  * Check, if the device is functional or a dummy for broadcast
61f8381cbaSThomas Gleixner  */
62f8381cbaSThomas Gleixner static inline int tick_device_is_functional(struct clock_event_device *dev)
63f8381cbaSThomas Gleixner {
64f8381cbaSThomas Gleixner 	return !(dev->features & CLOCK_EVT_FEAT_DUMMY);
65f8381cbaSThomas Gleixner }
66