On Wednesday, December 16, 2015 at 10:58:38 PM, Mateusz Kulikowski wrote: > Add function to poll register waiting for specific bit(s). > Similar functions are implemented in few drivers - they are almost > identical and can be generalized. > > Signed-off-by: Mateusz Kulikowski <mateusz.kulikow...@gmail.com> > --- > > include/wait_bit.h | 35 +++++++++++++++++++++++++++++++++++ > lib/Makefile | 1 + > lib/wait_bit.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 81 insertions(+) > create mode 100644 include/wait_bit.h > create mode 100644 lib/wait_bit.c > > diff --git a/include/wait_bit.h b/include/wait_bit.h > new file mode 100644 > index 0000000..052a09b > --- /dev/null > +++ b/include/wait_bit.h > @@ -0,0 +1,35 @@ > +/* > + * Wait for bit with timeout and ctrlc > + * > + * (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikow...@gmail.com> > + * > + * SPDX-License-Identifier: GPL-2.0+ > + */ > + > +#ifndef __WAIT_BIT_H > +#define __WAIT_BIT_H > + > +/** > + * wait_for_bit() waits for bit set/cleared in 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 readl()) > + * @param mask Bit(s) of register that must be active > + * @param set Selects wait condition (bit set or clear) > + * @param timeout Timeout (in miliseconds) > + * @param breakable Enables CTRL-C interruption > + * @return 0 on success, -ETIMEDOUT or -EINTR on failure > + */ > +int wait_for_bit(const char *prefix, const u32 *reg, const u32 mask, > + const bool set, const unsigned int timeout, > + const bool breakable); > + > +#endif > diff --git a/lib/Makefile b/lib/Makefile > index 1f1ff6f..6fe3ab5 100644 > --- a/lib/Makefile > +++ b/lib/Makefile > @@ -81,6 +81,7 @@ obj-y += time.o > obj-$(CONFIG_TRACE) += trace.o > obj-$(CONFIG_LIB_UUID) += uuid.o > obj-$(CONFIG_LIB_RAND) += rand.o > +obj-y += wait_bit.o > > ifdef CONFIG_SPL_BUILD > # SPL U-Boot may use full-printf, tiny-printf or none at all > diff --git a/lib/wait_bit.c b/lib/wait_bit.c > new file mode 100644 > index 0000000..ac35f68 > --- /dev/null > +++ b/lib/wait_bit.c > @@ -0,0 +1,45 @@ > +/* > + * Wait for bit interruptible by timeout or ctrlc > + * > + * (C) Copyright 2015 Mateusz Kulikowski <mateusz.kulikow...@gmail.com> > + * > + * SPDX-License-Identifier: GPL-2.0+ > + */ > + > +#include <common.h> > +#include <console.h> > +#include <asm/io.h> > +#include <asm/errno.h> > + > +int wait_for_bit(const char *prefix, const u32 *reg, const u32 mask, > + const bool set, const unsigned int timeout, > + const bool breakable) > +{
I wonder, what would happen if you stuffed this function into the header file altogether ? I think this would allow the compiler to do interprocedure optimalization on whichever file this would be included into. I wonder if that would have any impact on the resulting code size. _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot