From cf1670486b0b315c911e947a732f3bc603fe2438 Mon Sep 17 00:00:00 2001 From: Jean-Christophe PLAGNIOL-VILLARD Date: Mon, 29 Oct 2012 14:02:35 +0100 Subject: [PATCH] clock: introduce non interruptible timeout is_timeout call poller_call if the timeout is >= 100us but on 1-wire bus we need to wait 500us and not more than 930us for the bus reset. So if the poller_call is caller we can not guarantee it. So for this introduce is_non_interruptible_timeout than we only wait. Use it for ndelay too. Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD Signed-off-by: Sascha Hauer --- common/clock.c | 16 +++++++++++----- include/clock.h | 1 + 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/common/clock.c b/common/clock.c index 8adbeaff3..9c7c1ba58 100644 --- a/common/clock.c +++ b/common/clock.c @@ -135,15 +135,21 @@ uint32_t clocksource_hz2mult(uint32_t hz, uint32_t shift_constant) return (uint32_t)tmp; } +int is_timeout_non_interruptible(uint64_t start_ns, uint64_t time_offset_ns) +{ + if ((int64_t)(start_ns + time_offset_ns - get_time_ns()) < 0) + return 1; + else + return 0; +} +EXPORT_SYMBOL(is_timeout_non_interruptible); + int is_timeout(uint64_t start_ns, uint64_t time_offset_ns) { if (time_offset_ns >= 100 * USECOND) poller_call(); - if ((int64_t)(start_ns + time_offset_ns - get_time_ns()) < 0) - return 1; - else - return 0; + return is_timeout_non_interruptible(start_ns, time_offset_ns); } EXPORT_SYMBOL(is_timeout); @@ -151,7 +157,7 @@ void ndelay(unsigned long nsecs) { uint64_t start = get_time_ns(); - while(!is_timeout(start, nsecs)); + while(!is_timeout_non_interruptible(start, nsecs)); } EXPORT_SYMBOL(ndelay); diff --git a/include/clock.h b/include/clock.h index c01a8d00a..a169790d0 100644 --- a/include/clock.h +++ b/include/clock.h @@ -32,6 +32,7 @@ void clocks_calc_mult_shift(uint32_t *mult, uint32_t *shift, uint32_t from, uint uint32_t clocksource_hz2mult(uint32_t hz, uint32_t shift_constant); int is_timeout(uint64_t start_ns, uint64_t time_offset_ns); +int is_timeout_non_interruptible(uint64_t start_ns, uint64_t time_offset_ns); // void udelay(unsigned long usecs);