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