File: /usr/src/linux/include/asm-m68k/delay.h

1     #ifndef _M68K_DELAY_H
2     #define _M68K_DELAY_H
3     
4     #include <asm/param.h>
5     
6     /*
7      * Copyright (C) 1994 Hamish Macdonald
8      *
9      * Delay routines, using a pre-computed "loops_per_jiffy" value.
10      */
11     
12     extern __inline__ void __delay(unsigned long loops)
13     {
14     	__asm__ __volatile__ ("1: subql #1,%0; jcc 1b"
15     		: "=d" (loops) : "0" (loops));
16     }
17     
18     extern void __bad_udelay(void);
19     
20     /*
21      * Use only for very small delays ( < 1 msec).  Should probably use a
22      * lookup table, really, as the multiplications take much too long with
23      * short delays.  This is a "reasonable" implementation, though (and the
24      * first constant multiplications gets optimized away if the delay is
25      * a constant)  
26      */
27     static inline void __const_udelay(unsigned long xloops)
28     {
29     	unsigned long tmp;
30     
31     	__asm__ ("mulul %2,%0:%1"
32     		: "=d" (xloops), "=d" (tmp)
33     		: "d" (xloops), "1" (loops_per_jiffy));
34     	__delay(xloops * HZ);
35     }
36     
37     static inline void __udelay(unsigned long usecs)
38     {
39     	__const_udelay(usecs * 4295);	/* 2**32 / 1000000 */
40     }
41     
42     #define udelay(n) (__builtin_constant_p(n) ? \
43     	((n) > 20000 ? __bad_udelay() : __const_udelay((n) * 4295)) : \
44     	__udelay(n))
45     
46     extern __inline__ unsigned long muldiv(unsigned long a, unsigned long b, unsigned long c)
47     {
48     	unsigned long tmp;
49     
50     	__asm__ ("mulul %2,%0:%1; divul %3,%0:%1"
51     		: "=d" (tmp), "=d" (a)
52     		: "d" (b), "d" (c), "1" (a));
53     	return a;
54     }
55     
56     #endif /* defined(_M68K_DELAY_H) */
57