1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_TIMER_H
2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_TIMER_H
3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/list.h>
5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/spinlock.h>
6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/stddef.h>
7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct tvec_t_base_s;
9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct timer_list {
11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct list_head entry;
12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long expires;
13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void (*function)(unsigned long);
15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long data;
16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct tvec_t_base_s *base;
18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct tvec_t_base_s boot_tvec_bases;
21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define TIMER_INITIALIZER(_function, _expires, _data) {		\
23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		.function = (_function),			\
24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		.expires = (_expires),				\
25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		.data = (_data),				\
26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		.base = &boot_tvec_bases,			\
27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	}
28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DEFINE_TIMER(_name, _function, _expires, _data)		\
30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct timer_list _name =				\
31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		TIMER_INITIALIZER(_function, _expires, _data)
32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid fastcall init_timer(struct timer_list * timer);
34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void setup_timer(struct timer_list * timer,
36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				void (*function)(unsigned long),
37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				unsigned long data)
38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	timer->function = function;
40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	timer->data = data;
41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	init_timer(timer);
42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/***
45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * timer_pending - is a timer pending?
46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @timer: the timer in question
47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * timer_pending will tell whether a given timer is currently pending,
49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * or not. Callers must ensure serialization wrt. other operations done
50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * to this timer, eg. interrupt contexts, or other CPUs on SMP.
51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * return value: 1 if the timer is pending, 0 if not.
53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int timer_pending(const struct timer_list * timer)
55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return timer->entry.next != NULL;
57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void add_timer_on(struct timer_list *timer, int cpu);
60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int del_timer(struct timer_list * timer);
61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int __mod_timer(struct timer_list *timer, unsigned long expires);
62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int mod_timer(struct timer_list *timer, unsigned long expires);
63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern unsigned long next_timer_interrupt(void);
65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/***
67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * add_timer - start a timer
68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * @timer: the timer to be added
69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The kernel will do a ->function(->data) callback from the
71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * timer interrupt at the ->expires point in the future. The
72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * current time is 'jiffies'.
73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The timer's ->expires, ->function (and if the handler uses it, ->data)
75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * fields must be set prior calling this function.
76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Timers with an ->expires field in the past will be executed in the next
78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * timer tick.
79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void add_timer(struct timer_list *timer)
81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	BUG_ON(timer_pending(timer));
83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	__mod_timer(timer, timer->expires);
84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_SMP
87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru  extern int try_to_del_timer_sync(struct timer_list *timer);
88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru  extern int del_timer_sync(struct timer_list *timer);
89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else
90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# define try_to_del_timer_sync(t)	del_timer(t)
91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru# define del_timer_sync(t)		del_timer(t)
92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define del_singleshot_timer_sync(t) del_timer_sync(t)
95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void init_timers(void);
97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void run_local_timers(void);
98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct hrtimer;
99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int it_real_fn(struct hrtimer *);
100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
102