diff options
author | Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com> | 2020-08-06 12:42:51 +0300 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2020-08-14 22:18:30 +0300 |
commit | 242587dca4a7e34023b4c87d5b52a74b2fe7255d (patch) | |
tree | 84599821a1cae0230808e56e68a63b6559090739 | |
parent | 384d5cfe5d7e391a5584492bb2ce5794cbd691a9 (diff) | |
download | u-boot-242587dca4a7e34023b4c87d5b52a74b2fe7255d.tar.xz |
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 <oleksandr_andrushchenko@epam.com>
Signed-off-by: Anastasiia Lukianenko <anastasiia_lukianenko@epam.com>
[trini: Drop atomic_read from gadget/ether.c as this has existed for a
while and now causes problems]
Signed-off-by: Tom Rini <trini@konsulko.com>
-rw-r--r-- | drivers/usb/gadget/ether.c | 1 | ||||
-rw-r--r-- | include/linux/compat.h | 54 |
2 files changed, 54 insertions, 1 deletions
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 <console.h> #include <log.h> #include <malloc.h> + +#include <asm/processor.h> + #include <linux/types.h> #include <linux/err.h> #include <linux/kernel.h> +#ifdef CONFIG_XEN +#include <xen/events.h> +#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 */ |