]>
Commit | Line | Data |
---|---|---|
83d290c5 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
6569c0d3 MY |
2 | /* |
3 | * Copyright (c) 2012-2014 The Linux Foundation. All rights reserved. | |
6569c0d3 MY |
4 | */ |
5 | ||
6 | #ifndef _LINUX_IOPOLL_H | |
7 | #define _LINUX_IOPOLL_H | |
8 | ||
c094e219 | 9 | #include <linux/delay.h> |
6569c0d3 MY |
10 | #include <linux/errno.h> |
11 | #include <linux/io.h> | |
12 | #include <time.h> | |
13 | ||
14 | /** | |
54232474 | 15 | * read_poll_timeout - Periodically poll an address until a condition is met or a timeout occurs |
6569c0d3 | 16 | * @op: accessor function (takes @addr as its only argument) |
6569c0d3 MY |
17 | * @val: Variable to read the value into |
18 | * @cond: Break condition (usually involving @val) | |
c094e219 | 19 | * @sleep_us: Maximum time to sleep in us |
6569c0d3 | 20 | * @timeout_us: Timeout in us, 0 means never timeout |
d7db0e6d | 21 | * @args: arguments for @op poll |
6569c0d3 MY |
22 | * |
23 | * Returns 0 on success and -ETIMEDOUT upon a timeout. In either | |
24 | * case, the last read value at @addr is stored in @val. | |
25 | * | |
26 | * When available, you'll probably want to use one of the specialized | |
27 | * macros defined below rather than this macro directly. | |
28 | */ | |
d7db0e6d | 29 | #define read_poll_timeout(op, val, cond, sleep_us, timeout_us, args...) \ |
6569c0d3 MY |
30 | ({ \ |
31 | unsigned long timeout = timer_get_us() + timeout_us; \ | |
32 | for (;;) { \ | |
d7db0e6d | 33 | (val) = op(args); \ |
6569c0d3 MY |
34 | if (cond) \ |
35 | break; \ | |
36 | if (timeout_us && time_after(timer_get_us(), timeout)) { \ | |
d7db0e6d | 37 | (val) = op(args); \ |
6569c0d3 MY |
38 | break; \ |
39 | } \ | |
c094e219 JT |
40 | if (sleep_us) \ |
41 | udelay(sleep_us); \ | |
6569c0d3 MY |
42 | } \ |
43 | (cond) ? 0 : -ETIMEDOUT; \ | |
44 | }) | |
45 | ||
ce786ae3 | 46 | #define readx_poll_sleep_timeout(op, addr, val, cond, sleep_us, timeout_us) \ |
d7db0e6d | 47 | read_poll_timeout(op, val, cond, sleep_us, timeout_us, addr) |
ce786ae3 JT |
48 | |
49 | #define readl_poll_sleep_timeout(addr, val, cond, sleep_us, timeout_us) \ | |
50 | readx_poll_sleep_timeout(readl, addr, val, cond, sleep_us, timeout_us) | |
51 | ||
54232474 | 52 | #define readx_poll_timeout(op, addr, val, cond, timeout_us) \ |
d7db0e6d | 53 | read_poll_timeout(op, val, cond, false, timeout_us, addr) |
6569c0d3 MY |
54 | |
55 | #define readb_poll_timeout(addr, val, cond, timeout_us) \ | |
56 | readx_poll_timeout(readb, addr, val, cond, timeout_us) | |
57 | ||
58 | #define readw_poll_timeout(addr, val, cond, timeout_us) \ | |
59 | readx_poll_timeout(readw, addr, val, cond, timeout_us) | |
60 | ||
61 | #define readl_poll_timeout(addr, val, cond, timeout_us) \ | |
62 | readx_poll_timeout(readl, addr, val, cond, timeout_us) | |
63 | ||
64 | #define readq_poll_timeout(addr, val, cond, timeout_us) \ | |
65 | readx_poll_timeout(readq, addr, val, cond, timeout_us) | |
66 | ||
67 | #define readb_relaxed_poll_timeout(addr, val, cond, timeout_us) \ | |
68 | readx_poll_timeout(readb_relaxed, addr, val, cond, timeout_us) | |
69 | ||
70 | #define readw_relaxed_poll_timeout(addr, val, cond, timeout_us) \ | |
71 | readx_poll_timeout(readw_relaxed, addr, val, cond, timeout_us) | |
72 | ||
73 | #define readl_relaxed_poll_timeout(addr, val, cond, timeout_us) \ | |
74 | readx_poll_timeout(readl_relaxed, addr, val, cond, timeout_us) | |
75 | ||
76 | #define readq_relaxed_poll_timeout(addr, val, cond, timeout_us) \ | |
77 | readx_poll_timeout(readq_relaxed, addr, val, cond, timeout_us) | |
78 | ||
79 | #endif /* _LINUX_IOPOLL_H */ |