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