9
0
Fork 0

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 <plagnioj@jcrosoft.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Jean-Christophe PLAGNIOL-VILLARD 2012-10-29 14:02:35 +01:00 committed by Sascha Hauer
parent 72703410fe
commit cf1670486b
2 changed files with 12 additions and 5 deletions

View File

@ -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);

View File

@ -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);