Linux-2.6.12-rc2
[linux-2.6.git] / arch / arm / lib / delay.S
1 /*
2  *  linux/arch/arm/lib/delay.S
3  *
4  *  Copyright (C) 1995, 1996 Russell King
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10 #include <linux/linkage.h>
11 #include <asm/assembler.h>
12                 .text
13
14 LC0:            .word   loops_per_jiffy
15
16 /*
17  * 0 <= r0 <= 2000
18  */
19 ENTRY(__udelay)
20                 mov     r2,     #0x6800
21                 orr     r2, r2, #0x00db
22                 mul     r0, r2, r0
23 ENTRY(__const_udelay)                           @ 0 <= r0 <= 0x01ffffff
24                 ldr     r2, LC0
25                 ldr     r2, [r2]                @ max = 0x0fffffff
26                 mov     r0, r0, lsr #11         @ max = 0x00003fff
27                 mov     r2, r2, lsr #11         @ max = 0x0003ffff
28                 mul     r0, r2, r0              @ max = 2^32-1
29                 movs    r0, r0, lsr #6
30                 RETINSTR(moveq,pc,lr)
31
32 /*
33  * loops = (r0 * 0x10c6 * 100 * loops_per_jiffy) / 2^32
34  *
35  * Oh, if only we had a cycle counter...
36  */
37
38 @ Delay routine
39 ENTRY(__delay)
40                 subs    r0, r0, #1
41 #if 0
42                 RETINSTR(movls,pc,lr)
43                 subs    r0, r0, #1
44                 RETINSTR(movls,pc,lr)
45                 subs    r0, r0, #1
46                 RETINSTR(movls,pc,lr)
47                 subs    r0, r0, #1
48                 RETINSTR(movls,pc,lr)
49                 subs    r0, r0, #1
50                 RETINSTR(movls,pc,lr)
51                 subs    r0, r0, #1
52                 RETINSTR(movls,pc,lr)
53                 subs    r0, r0, #1
54                 RETINSTR(movls,pc,lr)
55                 subs    r0, r0, #1
56 #endif
57                 bhi     __delay
58                 RETINSTR(mov,pc,lr)