From 54232474d6fe9214942b79fa2608c3ad1d9f07d0 Mon Sep 17 00:00:00 2001 From: Jagan Teki Date: Sat, 2 May 2020 12:45:01 +0530 Subject: iopoll: Add read_poll_timeout common API Add read_poll_timeout common API similar to Linux iopoll. readx_poll_timeout will trigger read_poll_timeout with proper op. This will help to extend the functionalities like sleep_us to poll timeout in future. This change is referenced from Linux from below commit: commit <5f5323a14cad19323060a8cbf9d96f2280a462dd> ("iopoll: introduce read_poll_timeout macro") Signed-off-by: Jagan Teki --- include/linux/iopoll.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'include/linux/iopoll.h') diff --git a/include/linux/iopoll.h b/include/linux/iopoll.h index ab0ae1969a..51966d83da 100644 --- a/include/linux/iopoll.h +++ b/include/linux/iopoll.h @@ -11,7 +11,7 @@ #include /** - * readx_poll_timeout - Periodically poll an address until a condition is met or a timeout occurs + * read_poll_timeout - Periodically poll an address until a condition is met or a timeout occurs * @op: accessor function (takes @addr as its only argument) * @addr: Address to poll * @val: Variable to read the value into @@ -24,7 +24,7 @@ * When available, you'll probably want to use one of the specialized * macros defined below rather than this macro directly. */ -#define readx_poll_timeout(op, addr, val, cond, timeout_us) \ +#define read_poll_timeout(op, addr, val, cond, timeout_us) \ ({ \ unsigned long timeout = timer_get_us() + timeout_us; \ for (;;) { \ @@ -39,6 +39,8 @@ (cond) ? 0 : -ETIMEDOUT; \ }) +#define readx_poll_timeout(op, addr, val, cond, timeout_us) \ + read_poll_timeout(op, addr, val, cond, timeout_us) #define readb_poll_timeout(addr, val, cond, timeout_us) \ readx_poll_timeout(readb, addr, val, cond, timeout_us) -- cgit From c094e219a8614b3da275ad696cdfefbb9f2c453d Mon Sep 17 00:00:00 2001 From: Jagan Teki Date: Sat, 2 May 2020 12:45:02 +0530 Subject: iopoll: Add dealy to read poll Some drivers and other bsp code not only poll the register with timeout but also required to delay on each transaction. This patch add that requirement by adding sleep_us variable so-that read_poll_timeout now support delay as well. This change is referenced from Linux from below commit: commit <5f5323a14cad19323060a8cbf9d96f2280a462dd> ("iopoll: introduce read_poll_timeout macro") Signed-off-by: Jagan Teki --- include/linux/iopoll.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'include/linux/iopoll.h') diff --git a/include/linux/iopoll.h b/include/linux/iopoll.h index 51966d83da..76d2f951c1 100644 --- a/include/linux/iopoll.h +++ b/include/linux/iopoll.h @@ -6,6 +6,7 @@ #ifndef _LINUX_IOPOLL_H #define _LINUX_IOPOLL_H +#include #include #include #include @@ -16,6 +17,7 @@ * @addr: Address to poll * @val: Variable to read the value into * @cond: Break condition (usually involving @val) + * @sleep_us: Maximum time to sleep in us * @timeout_us: Timeout in us, 0 means never timeout * * Returns 0 on success and -ETIMEDOUT upon a timeout. In either @@ -24,7 +26,7 @@ * When available, you'll probably want to use one of the specialized * macros defined below rather than this macro directly. */ -#define read_poll_timeout(op, addr, val, cond, timeout_us) \ +#define read_poll_timeout(op, addr, val, cond, sleep_us, timeout_us) \ ({ \ unsigned long timeout = timer_get_us() + timeout_us; \ for (;;) { \ @@ -35,12 +37,14 @@ (val) = op(addr); \ break; \ } \ + if (sleep_us) \ + udelay(sleep_us); \ } \ (cond) ? 0 : -ETIMEDOUT; \ }) #define readx_poll_timeout(op, addr, val, cond, timeout_us) \ - read_poll_timeout(op, addr, val, cond, timeout_us) + read_poll_timeout(op, addr, val, cond, false, timeout_us) #define readb_poll_timeout(addr, val, cond, timeout_us) \ readx_poll_timeout(readb, addr, val, cond, timeout_us) -- cgit From ce786ae3913f3a006ec959cc9538d6c4d4114345 Mon Sep 17 00:00:00 2001 From: Jagan Teki Date: Sat, 2 May 2020 12:45:03 +0530 Subject: iopoll: Add readl_poll_sleep_timeout Add readl poll API with sleep and timeout support. This change is referenced from Linux from below commit: commit <5f5323a14cad19323060a8cbf9d96f2280a462dd> ("iopoll: introduce read_poll_timeout macro") Signed-off-by: Jagan Teki --- include/linux/iopoll.h | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'include/linux/iopoll.h') diff --git a/include/linux/iopoll.h b/include/linux/iopoll.h index 76d2f951c1..30cdea0cdc 100644 --- a/include/linux/iopoll.h +++ b/include/linux/iopoll.h @@ -43,6 +43,12 @@ (cond) ? 0 : -ETIMEDOUT; \ }) +#define readx_poll_sleep_timeout(op, addr, val, cond, sleep_us, timeout_us) \ + read_poll_timeout(op, addr, val, cond, sleep_us, timeout_us) + +#define readl_poll_sleep_timeout(addr, val, cond, sleep_us, timeout_us) \ + readx_poll_sleep_timeout(readl, addr, val, cond, sleep_us, timeout_us) + #define readx_poll_timeout(op, addr, val, cond, timeout_us) \ read_poll_timeout(op, addr, val, cond, false, timeout_us) -- cgit