
On Wed, Jan 3, 2018 at 12:31 AM, Álvaro Fernández Rojas noltari@gmail.com wrote:
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@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)
look like existing wait_for_bit is of this type, better add these macros to existing code and update wait_for_bit from callers if less changes or add macro to redirect wait_for_bit_le32 but I prefer first one because this even need to update in future.