1a7b81769SMasahiro Yamada /* 2a7b81769SMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+ 3a7b81769SMasahiro Yamada */ 4a7b81769SMasahiro Yamada 5a7b81769SMasahiro Yamada #ifndef _TIME_H 6a7b81769SMasahiro Yamada #define _TIME_H 7a7b81769SMasahiro Yamada 8*21cdd133SMasahiro Yamada #include <linux/typecheck.h> 9*21cdd133SMasahiro Yamada 10a7b81769SMasahiro Yamada unsigned long get_timer(unsigned long base); 11a7b81769SMasahiro Yamada 12a7b81769SMasahiro Yamada /* 13a7b81769SMasahiro Yamada * Return the current value of a monotonically increasing microsecond timer. 14a7b81769SMasahiro Yamada * Granularity may be larger than 1us if hardware does not support this. 15a7b81769SMasahiro Yamada */ 16a7b81769SMasahiro Yamada unsigned long timer_get_us(void); 17a7b81769SMasahiro Yamada 18*21cdd133SMasahiro Yamada /* 19*21cdd133SMasahiro Yamada * These inlines deal with timer wrapping correctly. You are 20*21cdd133SMasahiro Yamada * strongly encouraged to use them 21*21cdd133SMasahiro Yamada * 1. Because people otherwise forget 22*21cdd133SMasahiro Yamada * 2. Because if the timer wrap changes in future you won't have to 23*21cdd133SMasahiro Yamada * alter your driver code. 24*21cdd133SMasahiro Yamada * 25*21cdd133SMasahiro Yamada * time_after(a,b) returns true if the time a is after time b. 26*21cdd133SMasahiro Yamada * 27*21cdd133SMasahiro Yamada * Do this with "<0" and ">=0" to only test the sign of the result. A 28*21cdd133SMasahiro Yamada * good compiler would generate better code (and a really good compiler 29*21cdd133SMasahiro Yamada * wouldn't care). Gcc is currently neither. 30*21cdd133SMasahiro Yamada */ 31*21cdd133SMasahiro Yamada #define time_after(a,b) \ 32*21cdd133SMasahiro Yamada (typecheck(unsigned long, a) && \ 33*21cdd133SMasahiro Yamada typecheck(unsigned long, b) && \ 34*21cdd133SMasahiro Yamada ((long)((b) - (a)) < 0)) 35*21cdd133SMasahiro Yamada #define time_before(a,b) time_after(b,a) 36*21cdd133SMasahiro Yamada 37*21cdd133SMasahiro Yamada #define time_after_eq(a,b) \ 38*21cdd133SMasahiro Yamada (typecheck(unsigned long, a) && \ 39*21cdd133SMasahiro Yamada typecheck(unsigned long, b) && \ 40*21cdd133SMasahiro Yamada ((long)((a) - (b)) >= 0)) 41*21cdd133SMasahiro Yamada #define time_before_eq(a,b) time_after_eq(b,a) 42*21cdd133SMasahiro Yamada 43*21cdd133SMasahiro Yamada /* 44*21cdd133SMasahiro Yamada * Calculate whether a is in the range of [b, c]. 45*21cdd133SMasahiro Yamada */ 46*21cdd133SMasahiro Yamada #define time_in_range(a,b,c) \ 47*21cdd133SMasahiro Yamada (time_after_eq(a,b) && \ 48*21cdd133SMasahiro Yamada time_before_eq(a,c)) 49*21cdd133SMasahiro Yamada 50*21cdd133SMasahiro Yamada /* 51*21cdd133SMasahiro Yamada * Calculate whether a is in the range of [b, c). 52*21cdd133SMasahiro Yamada */ 53*21cdd133SMasahiro Yamada #define time_in_range_open(a,b,c) \ 54*21cdd133SMasahiro Yamada (time_after_eq(a,b) && \ 55*21cdd133SMasahiro Yamada time_before(a,c)) 56*21cdd133SMasahiro Yamada 57a7b81769SMasahiro Yamada #endif /* _TIME_H */ 58