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