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_program_event(ktime_t expires, int force); 30 extern void tick_oneshot_notify(void); 31 extern int tick_switch_to_oneshot(void (*handler)(struct clock_event_device *)); 32 extern void tick_resume_oneshot(void); 33 # ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST 34 extern void tick_broadcast_setup_oneshot(struct clock_event_device *bc); 35 extern void tick_broadcast_oneshot_control(unsigned long reason); 36 extern void tick_broadcast_switch_to_oneshot(void); 37 extern void tick_shutdown_broadcast_oneshot(unsigned int *cpup); 38 extern int tick_resume_broadcast_oneshot(struct clock_event_device *bc); 39 extern int tick_broadcast_oneshot_active(void); 40 extern void tick_check_oneshot_broadcast(int cpu); 41 bool tick_broadcast_oneshot_available(void); 42 # else /* BROADCAST */ 43 static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc) 44 { 45 BUG(); 46 } 47 static inline void tick_broadcast_oneshot_control(unsigned long reason) { } 48 static inline void tick_broadcast_switch_to_oneshot(void) { } 49 static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { } 50 static inline int tick_broadcast_oneshot_active(void) { return 0; } 51 static inline void tick_check_oneshot_broadcast(int cpu) { } 52 static inline bool tick_broadcast_oneshot_available(void) { return true; } 53 # endif /* !BROADCAST */ 54 55 #else /* !ONESHOT */ 56 static inline 57 void tick_setup_oneshot(struct clock_event_device *newdev, 58 void (*handler)(struct clock_event_device *), 59 ktime_t nextevt) 60 { 61 BUG(); 62 } 63 static inline void tick_resume_oneshot(void) 64 { 65 BUG(); 66 } 67 static inline int tick_program_event(ktime_t expires, int force) 68 { 69 return 0; 70 } 71 static inline void tick_oneshot_notify(void) { } 72 static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc) 73 { 74 BUG(); 75 } 76 static inline void tick_broadcast_oneshot_control(unsigned long reason) { } 77 static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { } 78 static inline int tick_resume_broadcast_oneshot(struct clock_event_device *bc) 79 { 80 return 0; 81 } 82 static inline int tick_broadcast_oneshot_active(void) { return 0; } 83 static inline bool tick_broadcast_oneshot_available(void) { return false; } 84 #endif /* !TICK_ONESHOT */ 85 86 /* 87 * Broadcasting support 88 */ 89 #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST 90 extern int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu); 91 extern int tick_check_broadcast_device(struct clock_event_device *dev); 92 extern int tick_is_broadcast_device(struct clock_event_device *dev); 93 extern void tick_broadcast_on_off(unsigned long reason, int *oncpu); 94 extern void tick_shutdown_broadcast(unsigned int *cpup); 95 extern void tick_suspend_broadcast(void); 96 extern int tick_resume_broadcast(void); 97 98 extern void 99 tick_set_periodic_handler(struct clock_event_device *dev, int broadcast); 100 101 #else /* !BROADCAST */ 102 103 static inline int tick_check_broadcast_device(struct clock_event_device *dev) 104 { 105 return 0; 106 } 107 108 static inline int tick_is_broadcast_device(struct clock_event_device *dev) 109 { 110 return 0; 111 } 112 static inline int tick_device_uses_broadcast(struct clock_event_device *dev, 113 int cpu) 114 { 115 return 0; 116 } 117 static inline void tick_do_periodic_broadcast(struct clock_event_device *d) { } 118 static inline void tick_broadcast_on_off(unsigned long reason, int *oncpu) { } 119 static inline void tick_shutdown_broadcast(unsigned int *cpup) { } 120 static inline void tick_suspend_broadcast(void) { } 121 static inline int tick_resume_broadcast(void) { return 0; } 122 123 /* 124 * Set the periodic handler in non broadcast mode 125 */ 126 static inline void tick_set_periodic_handler(struct clock_event_device *dev, 127 int broadcast) 128 { 129 dev->event_handler = tick_handle_periodic; 130 } 131 #endif /* !BROADCAST */ 132 133 /* 134 * Check, if the device is functional or a dummy for broadcast 135 */ 136 static inline int tick_device_is_functional(struct clock_event_device *dev) 137 { 138 return !(dev->features & CLOCK_EVT_FEAT_DUMMY); 139 } 140 141 #endif 142 143 extern void do_timer(unsigned long ticks); 144