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) |
64 | |