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