xref: /openbmc/u-boot/include/time.h (revision e8f80a5a)
1*83d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */
2a7b81769SMasahiro Yamada 
3a7b81769SMasahiro Yamada #ifndef _TIME_H
4a7b81769SMasahiro Yamada #define _TIME_H
5a7b81769SMasahiro Yamada 
621cdd133SMasahiro Yamada #include <linux/typecheck.h>
721cdd133SMasahiro Yamada 
8a7b81769SMasahiro Yamada unsigned long get_timer(unsigned long base);
9a7b81769SMasahiro Yamada 
10a7b81769SMasahiro Yamada /*
11a7b81769SMasahiro Yamada  * Return the current value of a monotonically increasing microsecond timer.
12a7b81769SMasahiro Yamada  * Granularity may be larger than 1us if hardware does not support this.
13a7b81769SMasahiro Yamada  */
14a7b81769SMasahiro Yamada unsigned long timer_get_us(void);
15a7b81769SMasahiro Yamada 
1621cdd133SMasahiro Yamada /*
1721cdd133SMasahiro Yamada  *	These inlines deal with timer wrapping correctly. You are
1821cdd133SMasahiro Yamada  *	strongly encouraged to use them
1921cdd133SMasahiro Yamada  *	1. Because people otherwise forget
2021cdd133SMasahiro Yamada  *	2. Because if the timer wrap changes in future you won't have to
2121cdd133SMasahiro Yamada  *	   alter your driver code.
2221cdd133SMasahiro Yamada  *
2321cdd133SMasahiro Yamada  * time_after(a,b) returns true if the time a is after time b.
2421cdd133SMasahiro Yamada  *
2521cdd133SMasahiro Yamada  * Do this with "<0" and ">=0" to only test the sign of the result. A
2621cdd133SMasahiro Yamada  * good compiler would generate better code (and a really good compiler
2721cdd133SMasahiro Yamada  * wouldn't care). Gcc is currently neither.
2821cdd133SMasahiro Yamada  */
2921cdd133SMasahiro Yamada #define time_after(a,b)		\
3021cdd133SMasahiro Yamada 	(typecheck(unsigned long, a) && \
3121cdd133SMasahiro Yamada 	 typecheck(unsigned long, b) && \
3221cdd133SMasahiro Yamada 	 ((long)((b) - (a)) < 0))
3321cdd133SMasahiro Yamada #define time_before(a,b)	time_after(b,a)
3421cdd133SMasahiro Yamada 
3521cdd133SMasahiro Yamada #define time_after_eq(a,b)	\
3621cdd133SMasahiro Yamada 	(typecheck(unsigned long, a) && \
3721cdd133SMasahiro Yamada 	 typecheck(unsigned long, b) && \
3821cdd133SMasahiro Yamada 	 ((long)((a) - (b)) >= 0))
3921cdd133SMasahiro Yamada #define time_before_eq(a,b)	time_after_eq(b,a)
4021cdd133SMasahiro Yamada 
4121cdd133SMasahiro Yamada /*
4221cdd133SMasahiro Yamada  * Calculate whether a is in the range of [b, c].
4321cdd133SMasahiro Yamada  */
4421cdd133SMasahiro Yamada #define time_in_range(a,b,c) \
4521cdd133SMasahiro Yamada 	(time_after_eq(a,b) && \
4621cdd133SMasahiro Yamada 	 time_before_eq(a,c))
4721cdd133SMasahiro Yamada 
4821cdd133SMasahiro Yamada /*
4921cdd133SMasahiro Yamada  * Calculate whether a is in the range of [b, c).
5021cdd133SMasahiro Yamada  */
5121cdd133SMasahiro Yamada #define time_in_range_open(a,b,c) \
5221cdd133SMasahiro Yamada 	(time_after_eq(a,b) && \
5321cdd133SMasahiro Yamada 	 time_before(a,c))
5421cdd133SMasahiro Yamada 
55a7b81769SMasahiro Yamada #endif /* _TIME_H */
56