[U-Boot] [PATCH v6 01/11] wait_bit: add big endian version of wait_for_bit function

Álvaro Fernández Rojas noltari at gmail.com
Tue Jan 2 19:01:01 UTC 2018


Add 8/16/32 bits and BE/LE versions of wait_for_bit.
This is needed for reading registers that are not aligned to 32 bits.

Signed-off-by: Álvaro Fernández Rojas <noltari at gmail.com>
---
 v6: Introduce changes suggested by Jagan Teki:
 - Switch to wait_for_bit instead of infinite loop.

 include/wait_bit.h | 44 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/include/wait_bit.h b/include/wait_bit.h
index 06ad43a122..47891fa75c 100644
--- a/include/wait_bit.h
+++ b/include/wait_bit.h
@@ -69,5 +69,49 @@ static inline int wait_for_bit(const char *prefix, const u32 *reg,
 	return -ETIMEDOUT;
 }
 
+#define BUILD_WAIT_FOR_BIT(sfx, type, read)				\
+									\
+static inline int wait_for_bit_##sfx(const char *prefix,		\
+				     const u32 *reg,			\
+				     const type mask,			\
+				     const bool set,			\
+				     const unsigned int timeout_ms,	\
+				     const bool breakable)		\
+{									\
+	type val;							\
+	unsigned long start = get_timer(0);				\
+									\
+	while (1) {							\
+		val = read(reg);					\
+									\
+		if (!set)						\
+			val = ~val;					\
+									\
+		if ((val & mask) == mask)				\
+			return 0;					\
+									\
+		if (get_timer(start) > timeout_ms)			\
+			break;						\
+									\
+		if (breakable && ctrlc()) {				\
+			puts("Abort\n");				\
+			return -EINTR;					\
+		}							\
+									\
+		udelay(1);						\
+		WATCHDOG_RESET();					\
+	}								\
+									\
+	debug("%s: Timeout (reg=%p mask=%x wait_set=%i)\n", prefix,	\
+	      reg, mask, set);						\
+									\
+	return -ETIMEDOUT;						\
+}
+
+BUILD_WAIT_FOR_BIT(8, u8, readb)
+BUILD_WAIT_FOR_BIT(le16, u16, readw)
+BUILD_WAIT_FOR_BIT(be16, u16, readw_be)
+BUILD_WAIT_FOR_BIT(le32, u32, readl)
+BUILD_WAIT_FOR_BIT(be32, u32, readl_be)
 
 #endif
-- 
2.11.0



More information about the U-Boot mailing list