xref: /openbmc/u-boot/include/time.h (revision 21cdd133)
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