On Tue, Jun 12, 2018 at 01:52:48PM -0700, Andrey Smirnov wrote: > Move delay and timeout functions to lib/ in order to share them with > PBL. Currently only the most trivial implementation of get_time_ns() > usefull to implement never-expiring timeouts is provided. More work is > needed to allow board specific overrides. > > Signed-off-by: Andrey Smirnov <andrew.smirnov@xxxxxxxxx> > --- > common/clock.c | 52 ------------------------------------ > lib/Makefile | 1 + > lib/clock.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 73 insertions(+), 52 deletions(-) > create mode 100644 lib/clock.c > > +#if defined(__PBL__) > +/* > + * Poller infrastructure is not available in PBL, so we just define > + * is_timeout to be a synonym for is_timeout_non_interruptible > + */ > +int is_timeout(uint64_t start_ns, uint64_t time_offset_ns) > + __alias(is_timeout_non_interruptible); > +#else > +#include <poller.h> > + > +int is_timeout(uint64_t start_ns, uint64_t time_offset_ns) > +{ > + > + if (time_offset_ns >= 100 * USECOND) > + poller_call(); > + > + return is_timeout_non_interruptible(start_ns, time_offset_ns); > +} > +#endif > +EXPORT_SYMBOL(is_timeout); > + > +void ndelay(unsigned long nsecs) > +{ > + uint64_t start = get_time_ns(); > + > + while(!is_timeout_non_interruptible(start, nsecs)); > +} > +EXPORT_SYMBOL(ndelay); > + > +void udelay(unsigned long usecs) > +{ > + uint64_t start = get_time_ns(); > + > + while(!is_timeout(start, usecs * USECOND)); > +} > +EXPORT_SYMBOL(udelay); > + > +void mdelay(unsigned long msecs) > +{ > + uint64_t start = get_time_ns(); > + > + while(!is_timeout(start, msecs * MSECOND)); > +} > +EXPORT_SYMBOL(mdelay); > + > +void mdelay_non_interruptible(unsigned long msecs) > +{ > + uint64_t start = get_time_ns(); > + > + while (!is_timeout_non_interruptible(start, msecs * MSECOND)) > + ; > +} > +EXPORT_SYMBOL(mdelay_non_interruptible); > + > +__weak uint64_t get_time_ns(void) > +{ > + return 0; > +} So in PBL we now have [num]delay functions which will lockup the system forever when called. This is not good. Given that you only need is_timeout() to implement the iopoll.h functions and this patch is only a complicated way to shortcircuit the timeout, I think it would be better to just put a #ifndef __PBL__ around the call to is_timeout() in readx_poll_timeout(). This would at least make it clearer to the reader that there actually is no timeout in the PBL case. Sascha -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox