[PATCH v6] introduce macro spin_event_timeout()
Kumar Gala
galak at kernel.crashing.org
Sat May 2 06:51:19 EST 2009
On Apr 27, 2009, at 2:05 PM, Timur Tabi wrote:
> The macro spin_event_timeout() takes a condition and timeout value
> (in microseconds) as parameters. It spins until either the
> condition is true
> or the timeout expires. It returns the result of the condition when
> the loop
> was terminated.
>
> This primary purpose of this macro is to poll on a hardware register
> until a
> status bit changes. The timeout ensures that the loop still
> terminates if the
> bit doesn't change as expected. This macro makes it easier for driver
> developers to perform this kind of operation properly.
>
> Signed-off-by: Timur Tabi <timur at freescale.com>
> ---
>
> I'm making this a PowerPC-specific patch because I want to use
> tb_ticks_per_usec, which does not exist on all other platforms. I
> don't want
> to use jiffies because jiffies works only when interrupts are
> enabled, and
> the resolution may not be fine enough.
>
> arch/powerpc/include/asm/delay.h | 27 +++++++++++++++++++++++++++
> 1 files changed, 27 insertions(+), 0 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/delay.h b/arch/powerpc/include/
> asm/delay.h
> index f9200a6..1939e0f 100644
> --- a/arch/powerpc/include/asm/delay.h
> +++ b/arch/powerpc/include/asm/delay.h
> @@ -2,6 +2,8 @@
> #define _ASM_POWERPC_DELAY_H
> #ifdef __KERNEL__
>
> +#include <asm/time.h>
> +
> /*
> * Copyright 1996, Paul Mackerras.
> *
> @@ -30,5 +32,30 @@ extern void udelay(unsigned long usecs);
> #define mdelay(n) udelay((n) * 1000)
> #endif
>
> +/**
> + * spin_event_timeout - spin until a condition gets true or a
> timeout elapses
> + * @condition: a C expression to evalate
> + * @timeout: timeout, in microseconds
> + * @delay: the number of microseconds to delay between eache
> evaluation of
> + * @condition
> + * @rc: the last value of the condition
> + *
> + * The process spins until the condition evaluates to true (non-
> zero) or the
> + * timeout elapses. Upon exit, @rc contains the value of the
> condition. This
> + * allows you to test the condition without incurring any side
> effects.
> + *
> + * This primary purpose of this macro is to poll on a hardware
> register
> + * until a status bit changes. The timeout ensures that the loop
> still
> + * terminates if the bit never changes. The delay is for devices
> that need a
> + * delay in between successive reads.
> + */
> +#define spin_event_timeout(condition, timeout, delay,
> rc) \
> +
> { \
> + unsigned long __loops = tb_ticks_per_usec *
> timeout; \
> + unsigned long __start =
> get_tbl(); \
> + while (!(rc = (condition)) && (tb_ticks_since(__start) <=
> __loops)) \
> + udelay(delay); \
> +}
> +
I wouldn't call it spin_event_timeout as its a bit too generic of a
name for something that is arch specific.
- k
More information about the Linuxppc-dev
mailing list