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