GNU Linux-libre 6.8.9-gnu
[releases.git] / arch / arm / lib / delay-loop.S
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  *  linux/arch/arm/lib/delay.S
4  *
5  *  Copyright (C) 1995, 1996 Russell King
6  */
7 #include <linux/linkage.h>
8 #include <asm/assembler.h>
9 #include <asm/delay.h>
10
11 #ifdef CONFIG_ARCH_RPC
12                 .arch   armv4
13 #endif
14
15                 .text
16
17 .LC0:           .word   loops_per_jiffy
18 .LC1:           .word   UDELAY_MULT
19
20 /*
21  * loops = r0 * HZ * loops_per_jiffy / 1000000
22  *
23  * r0  <= 2000
24  * HZ  <= 1000
25  */
26
27 ENTRY(__loop_udelay)
28                 ldr     r2, .LC1
29                 mul     r0, r2, r0              @ r0 = delay_us * UDELAY_MULT
30 ENTRY(__loop_const_udelay)                      @ 0 <= r0 <= 0xfffffaf0
31                 ldr     r2, .LC0
32                 ldr     r2, [r2]
33                 umull   r1, r0, r2, r0          @ r0-r1 = r0 * loops_per_jiffy
34                 adds    r1, r1, #0xffffffff     @ rounding up ...
35                 adcs    r0, r0, r0              @ and right shift by 31
36                 reteq   lr
37
38                 .align 3
39
40 @ Delay routine
41 ENTRY(__loop_delay)
42                 subs    r0, r0, #1
43 #if 0
44                 retls   lr
45                 subs    r0, r0, #1
46                 retls   lr
47                 subs    r0, r0, #1
48                 retls   lr
49                 subs    r0, r0, #1
50                 retls   lr
51                 subs    r0, r0, #1
52                 retls   lr
53                 subs    r0, r0, #1
54                 retls   lr
55                 subs    r0, r0, #1
56                 retls   lr
57                 subs    r0, r0, #1
58 #endif
59                 bhi     __loop_delay
60                 ret     lr
61 ENDPROC(__loop_udelay)
62 ENDPROC(__loop_const_udelay)
63 ENDPROC(__loop_delay)