diff options
Diffstat (limited to 'backport-include/linux/timer.h')
-rw-r--r-- | backport-include/linux/timer.h | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/backport-include/linux/timer.h b/backport-include/linux/timer.h new file mode 100644 index 0000000..9824ea6 --- /dev/null +++ b/backport-include/linux/timer.h @@ -0,0 +1,63 @@ +#ifndef _BACKPORT_TIMER_H +#define _BACKPORT_TIMER_H + +#include_next <linux/timer.h> + +#ifndef setup_deferrable_timer +/* + * The TIMER_DEFERRABLE flag has not been around since 3.0 so + * two different backports are needed here. + */ +#ifdef TIMER_DEFERRABLE +#define setup_deferrable_timer(timer, fn, data) \ + __setup_timer((timer), (fn), (data), TIMER_DEFERRABLE) +#else +static inline void setup_deferrable_timer_key(struct timer_list *timer, + const char *name, + struct lock_class_key *key, + void (*func)(unsigned long), + unsigned long data) +{ + timer->function = func; + timer->data = data; + init_timer_deferrable_key(timer, name, key); +} +#define setup_deferrable_timer(timer, fn, data) \ + do { \ + static struct lock_class_key __key; \ + setup_deferrable_timer_key((timer), #timer, &__key, \ + (fn), (data)); \ + } while (0) +#endif +#endif + +#ifndef TIMER_DEFERRABLE +#define TIMER_DEFERRABLE 1 +#endif + +#ifndef from_timer +#define TIMER_DATA_TYPE unsigned long +#define TIMER_FUNC_TYPE void (*)(TIMER_DATA_TYPE) + +static inline void timer_setup(struct timer_list *timer, + void (*callback) (struct timer_list *), + unsigned int flags) +{ +#ifdef __setup_timer + __setup_timer(timer, (TIMER_FUNC_TYPE) callback, + (TIMER_DATA_TYPE) timer, flags); +#else + if (flags & TIMER_DEFERRABLE) + setup_deferrable_timer(timer, (TIMER_FUNC_TYPE) callback, + (TIMER_DATA_TYPE) timer); + else + setup_timer(timer, (TIMER_FUNC_TYPE) callback, + (TIMER_DATA_TYPE) timer); +#endif +} + +#define from_timer(var, callback_timer, timer_fieldname) \ + container_of(callback_timer, typeof(*var), timer_fieldname) +#endif + +#endif /* _BACKPORT_TIMER_H */ |