wait_bit: add big endian version of wait_for_bit function
PATCH 1/1 wait_bit: add big endian version of wait_for_bit function
The only difference with the existing wait_for_bit function is the fact that wait_for_bit_be expects the register size to be read.
--- include/wait_bit.h | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+)
include/wait_bit.h +69 -0
@@ -69,5 +69,74 @@ static inline int wait_for_bit(const char *prefix, const u32 *reg, return -ETIMEDOUT; } +/** +* wait_for_bit_be() waits for bit set/cleared in BE register +* +* Function polls register waiting for specific bit(s) change +* (either 0->1 or 1->0). It can fail under two conditions: +* - Timeout +* - User interaction (CTRL-C) +* Function succeeds only if all bits of masked register are set/cleared +* (depending on set option). +* +* @param prefix Prefix added to timeout messagge (message visible only +* with debug enabled) +* @param reg Register that will be read (using read_be()) +* @param size Size of the register that will be read +* @param mask Bit(s) of register that must be active +* @param set Selects wait condition (bit set or clear) +* @param timeout_ms Timeout (in miliseconds) +* @param breakable Enables CTRL-C interruption +* @return 0 on success, -EINVAL, -ETIMEDOUT or -EINTR on failure +*/ +static inline int wait_for_bit_be (const char *prefix, +const u32 *reg,const u8 size, +const u32 mask,const bool set, +const unsigned int timeout_ms, +const bool breakable) +{ +u32 val; +unsigned long start =get_timer (0 ); + +while (1 ) { +switch (size) + { +case 8 : + val =readb_be (reg); +break ; +case 16 : + val =readw_be (reg); +break ; +case 32 : + val =readl_be (reg); +break ; +default : +debug ("%s: invalid size %u\n" , prefix, size); +return -EINVAL ; + } + +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=%08x wait_set=%i)\n" , prefix, reg, mask, + set); + +return -ETIMEDOUT ; +}#endif
Signature · 1 line
2.11.0
PATCH 1/1 wait_bit: add big endian version of wait_for_bit function
Quoted 75 lines · Álvaro Fernández Rojas
The only difference with the existing
wait_for_bitfunction is the fact thatwait_for_bit_beexpects the register size to be read.Signed-off-by Álvaro Fernández Rojas <[email protected]>--- include/wait_bit.h | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+)include/wait_bit.h +59
-0@@ -69,5 +69,74 @@ static inline int wait_for_bit(const char *prefix, const u32 *reg,return -ETIMEDOUT ; } +/** +* wait_for_bit_be() waits for bit set/cleared in BE register +* +* Function polls register waiting for specific bit(s) change +* (either 0->1 or 1->0). It can fail under two conditions: +* - Timeout +* - User interaction (CTRL-C) +* Function succeeds only if all bits of masked register are set/cleared +* (depending on set option). +* +* @param prefix Prefix added to timeout messagge (message visible only +* with debug enabled) +* @param reg Register that will be read (using read_be()) +* @param size Size of the register that will be read +* @param mask Bit(s) of register that must be active +* @param set Selects wait condition (bit set or clear) +* @param timeout_ms Timeout (in miliseconds) +* @param breakable Enables CTRL-C interruption +* @return 0 on success, -EINVAL, -ETIMEDOUT or -EINTR on failure +*/ +static inline int wait_for_bit_be (const char *prefix, +const u32 *reg,const u8 size, +const u32 mask,const bool set, +const unsigned int timeout_ms, +const bool breakable) +{ +u32 val; +unsigned long start =get_timer (0 ); + +while (1 ) { +switch (size) + { +case 8 : + val =readb_be (reg); +break ; +case 16 : + val =readw_be (reg); +break ; +case 32 : + val =readl_be (reg); +break ; +default : +debug ("%s: invalid size %u\n" , prefix, size); +return -EINVAL ; + } + +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 ; + }
include/wait_bit.h static inline int wait_for_bit(const char *prefix, const u32 *reg, · line 140
Quoted 10 lines
include/wait_bit.h +10
-0+ +udelay (1 ); +WATCHDOG_RESET (); + } + +debug ("%s: Timeout (reg=%p mask=%08x wait_set=%i)\n" , prefix, reg, mask, + set); + +return -ETIMEDOUT ; +}
Where is this used? Thanks!
Signature · 8 lines
Tom -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: not available URL: <http://lists.denx.de/pipermail/u-boot/attachments/20180101/a671cc2c/attachment.sig>
PATCH 1/1 wait_bit: add big endian version of wait_for_bit function
Hello Tom,
Quoted 80 lines · Tom Rini
Quoted 78 lines · Álvaro Fernández Rojas
The only difference with the existing
wait_for_bitfunction is the fact thatwait_for_bit_beexpects the register size to be read.Signed-off-by Álvaro Fernández Rojas <[email protected]>--- include/wait_bit.h | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+)include/wait_bit.h +62
-0@@ -69,5 +69,74 @@ static inline int wait_for_bit(const char *prefix, const u32 *reg,return -ETIMEDOUT ; } +/** +* wait_for_bit_be() waits for bit set/cleared in BE register +* +* Function polls register waiting for specific bit(s) change +* (either 0->1 or 1->0). It can fail under two conditions: +* - Timeout +* - User interaction (CTRL-C) +* Function succeeds only if all bits of masked register are set/cleared +* (depending on set option). +* +* @param prefix Prefix added to timeout messagge (message visible only +* with debug enabled) +* @param reg Register that will be read (using read_be()) +* @param size Size of the register that will be read +* @param mask Bit(s) of register that must be active +* @param set Selects wait condition (bit set or clear) +* @param timeout_ms Timeout (in miliseconds) +* @param breakable Enables CTRL-C interruption +* @return 0 on success, -EINVAL, -ETIMEDOUT or -EINTR on failure +*/ +static inline int wait_for_bit_be (const char *prefix, +const u32 *reg,const u8 size, +const u32 mask,const bool set, +const unsigned int timeout_ms, +const bool breakable) +{ +u32 val; +unsigned long start =get_timer (0 ); + +while (1 ) { +switch (size) + { +case 8 : + val =readb_be (reg); +break ; +case 16 : + val =readw_be (reg); +break ; +case 32 : + val =readl_be (reg); +break ; +default : +debug ("%s: invalid size %u\n" , prefix, size); +return -EINVAL ; + } + +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 ();
Quoted 8 lines
include/wait_bit.h static inline int wait_for_bit(const char *prefix, const u32 *reg, · line 140
Quoted 7 lines
include/wait_bit.h +7
-0+ } + +debug ("%s: Timeout (reg=%p mask=%08x wait_set=%i)\n" , prefix, reg, mask, + set); + +return -ETIMEDOUT ; +}Where is this used? Thanks!
I was planning on using this for both brcm63xx SPI drivers, as stated here:
https://lists.denx.de/pipermail/u-boot/2017-December/315263.html
https://lists.denx.de/pipermail/u-boot/2017-December/315264.html
Maybe it would be better to define a macro and use it for both LE/BE, with functions like:wait_for_bit_8
wait_for_bit_le16/wait_for_bit_be16 wait_for_bit_le32/wait_for_bit_be32
What do you think?
Regards,
Álvaro.
PATCH 1/1 wait_bit: add big endian version of wait_for_bit function
Quoted 95 lines · Álvaro Fernández Rojas
Hello Tom,
Quoted 79 lines · Tom Rini
Quoted 77 lines · Álvaro Fernández Rojas
The only difference with the existing
wait_for_bitfunction is the fact thatwait_for_bit_beexpects the register size to be read.Signed-off-by Álvaro Fernández Rojas <[email protected]>--- include/wait_bit.h | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+)include/wait_bit.h +62
-0@@ -69,5 +69,74 @@ static inline int wait_for_bit(const char *prefix, const u32 *reg,return -ETIMEDOUT ; } +/** +* wait_for_bit_be() waits for bit set/cleared in BE register +* +* Function polls register waiting for specific bit(s) change +* (either 0->1 or 1->0). It can fail under two conditions: +* - Timeout +* - User interaction (CTRL-C) +* Function succeeds only if all bits of masked register are set/cleared +* (depending on set option). +* +* @param prefix Prefix added to timeout messagge (message visible only +* with debug enabled) +* @param reg Register that will be read (using read_be()) +* @param size Size of the register that will be read +* @param mask Bit(s) of register that must be active +* @param set Selects wait condition (bit set or clear) +* @param timeout_ms Timeout (in miliseconds) +* @param breakable Enables CTRL-C interruption +* @return 0 on success, -EINVAL, -ETIMEDOUT or -EINTR on failure +*/ +static inline int wait_for_bit_be (const char *prefix, +const u32 *reg,const u8 size, +const u32 mask,const bool set, +const unsigned int timeout_ms, +const bool breakable) +{ +u32 val; +unsigned long start =get_timer (0 ); + +while (1 ) { +switch (size) + { +case 8 : + val =readb_be (reg); +break ; +case 16 : + val =readw_be (reg); +break ; +case 32 : + val =readl_be (reg); +break ; +default : +debug ("%s: invalid size %u\n" , prefix, size); +return -EINVAL ; + } + +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 ();Quoted 8 lines
include/wait_bit.h static inline int wait_for_bit(const char *prefix, const u32 *reg, · line 140
Quoted 7 lines
include/wait_bit.h +7
-0+ } + +debug ("%s: Timeout (reg=%p mask=%08x wait_set=%i)\n" , prefix, reg, mask, + set); + +return -ETIMEDOUT ; +}Where is this used? Thanks!
I was planning on using this for both brcm63xx SPI drivers, as stated here:
https://lists.denx.de/pipermail/u-boot/2017-December/315263.html
https://lists.denx.de/pipermail/u-boot/2017-December/315264.html
Quoted 7 lines
Maybe it would be better to define a macro and use it for both LE/BE, with functions like:
wait_for_bit_8
wait_for_bit_le16/wait_for_bit_be16 wait_for_bit_le32/wait_for_bit_be32What do you think?
Whatever feels cleaner with the rest of your patches is fine. But please post it as part of the series. Thanks!
Signature · 8 lines
Tom -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: not available URL: <http://lists.denx.de/pipermail/u-boot/attachments/20180102/ccb6d96b/attachment.sig>