linux/arch/arm/include/asm/delay.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) 1995-2004 Russell King
   3 *
   4 * Delay routines, using a pre-computed "loops_per_second" value.
   5 */
   6#ifndef __ASM_ARM_DELAY_H
   7#define __ASM_ARM_DELAY_H
   8
   9#include <asm/memory.h>
  10#include <asm/param.h>  /* HZ */
  11
  12#define MAX_UDELAY_MS   2
  13#define UDELAY_MULT     ((UL(2199023) * HZ) >> 11)
  14#define UDELAY_SHIFT    30
  15
  16#ifndef __ASSEMBLY__
  17
  18struct delay_timer {
  19        unsigned long (*read_current_timer)(void);
  20        unsigned long freq;
  21};
  22
  23extern struct arm_delay_ops {
  24        void (*delay)(unsigned long);
  25        void (*const_udelay)(unsigned long);
  26        void (*udelay)(unsigned long);
  27        unsigned long ticks_per_jiffy;
  28} arm_delay_ops;
  29
  30#define __delay(n)              arm_delay_ops.delay(n)
  31
  32/*
  33 * This function intentionally does not exist; if you see references to
  34 * it, it means that you're calling udelay() with an out of range value.
  35 *
  36 * With currently imposed limits, this means that we support a max delay
  37 * of 2000us. Further limits: HZ<=1000 and bogomips<=3355
  38 */
  39extern void __bad_udelay(void);
  40
  41/*
  42 * division by multiplication: you don't have to worry about
  43 * loss of precision.
  44 *
  45 * Use only for very small delays ( < 2 msec).  Should probably use a
  46 * lookup table, really, as the multiplications take much too long with
  47 * short delays.  This is a "reasonable" implementation, though (and the
  48 * first constant multiplications gets optimized away if the delay is
  49 * a constant)
  50 */
  51#define __udelay(n)             arm_delay_ops.udelay(n)
  52#define __const_udelay(n)       arm_delay_ops.const_udelay(n)
  53
  54#define udelay(n)                                                       \
  55        (__builtin_constant_p(n) ?                                      \
  56          ((n) > (MAX_UDELAY_MS * 1000) ? __bad_udelay() :              \
  57                        __const_udelay((n) * UDELAY_MULT)) :            \
  58          __udelay(n))
  59
  60/* Loop-based definitions for assembly code. */
  61extern void __loop_delay(unsigned long loops);
  62extern void __loop_udelay(unsigned long usecs);
  63extern void __loop_const_udelay(unsigned long);
  64
  65/* Delay-loop timer registration. */
  66#define ARCH_HAS_READ_CURRENT_TIMER
  67extern void register_current_timer_delay(const struct delay_timer *timer);
  68
  69#endif /* __ASSEMBLY__ */
  70
  71#endif /* defined(_ARM_DELAY_H) */
  72
  73