From 242587dca4a7e34023b4c87d5b52a74b2fe7255d Mon Sep 17 00:00:00 2001 From: Oleksandr Andrushchenko Date: Thu, 6 Aug 2020 12:42:51 +0300 Subject: [PATCH] linux/compat.h: Add wait_event_timeout macro Add wait_event_timeout - sleep until a condition gets true or a timeout elapses. This is a stripped version of the same from Linux kernel with the following u-boot specific modifications: - no wait queues supported - use u-boot timer to detect timeouts - check for Ctrl-C pressed during wait Signed-off-by: Oleksandr Andrushchenko Signed-off-by: Anastasiia Lukianenko [trini: Drop atomic_read from gadget/ether.c as this has existed for a while and now causes problems] Signed-off-by: Tom Rini --- drivers/usb/gadget/ether.c | 1 - include/linux/compat.h | 54 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c index a939918e97..a8e8bfc04b 100644 --- a/drivers/usb/gadget/ether.c +++ b/drivers/usb/gadget/ether.c @@ -33,7 +33,6 @@ #define USB_NET_NAME "usb_ether" -#define atomic_read extern struct platform_data brd; diff --git a/include/linux/compat.h b/include/linux/compat.h index 712eeaef4e..363b2b9425 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -1,12 +1,20 @@ #ifndef _LINUX_COMPAT_H_ #define _LINUX_COMPAT_H_ +#include #include #include + +#include + #include #include #include +#ifdef CONFIG_XEN +#include +#endif + struct unused {}; typedef struct unused unused_t; @@ -122,6 +130,52 @@ static inline void kmem_cache_destroy(struct kmem_cache *cachep) #define add_wait_queue(...) do { } while (0) #define remove_wait_queue(...) do { } while (0) +#ifndef CONFIG_XEN +#define eventchn_poll() +#endif + +#define __wait_event_timeout(condition, timeout, ret) \ +({ \ + ulong __ret = ret; /* explicit shadow */ \ + ulong start = get_timer(0); \ + for (;;) { \ + eventchn_poll(); \ + if (condition) { \ + __ret = 1; \ + break; \ + } \ + if ((get_timer(start) > timeout) || ctrlc()) { \ + __ret = 0; \ + break; \ + } \ + cpu_relax(); \ + } \ + __ret; \ +}) + +/** + * wait_event_timeout() - Wait until the event occurs before the timeout. + * @wr_head: The wait queue to wait on. + * @condition: Expression for the event to wait for. + * @timeout: Maximum waiting time. + * + * We wait until the @condition evaluates to %true (succeed) or + * %false (@timeout elapsed). + * + * Return: + * 0 - if the @condition evaluated to %false after the @timeout elapsed + * 1 - if the @condition evaluated to %true + */ +#define wait_event_timeout(wq_head, condition, timeout) \ +({ \ + ulong __ret; \ + if (condition) \ + __ret = 1; \ + else \ + __ret = __wait_event_timeout(condition, timeout, __ret);\ + __ret; \ +}) + #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) /* This is also defined in ARMv8's mmu.h */