| 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 | |
| 8 | |
| 9 | |
| 10 | |
| 11 |
|
| 12 | |
| 13 | .arch armv4
|
| 14 | |
| 15 |
|
| 16 | .text
|
| 17 |
|
| 18 | .LC0: .word loops_per_jiffy
|
| 19 | .LC1: .word UDELAY_MULT
|
| 20 |
|
| 21 | /*
|
| 22 | * loops = r0 * HZ * loops_per_jiffy / 1000000
|
| 23 | *
|
| 24 | * r0 <= 2000
|
| 25 | * HZ <= 1000
|
| 26 | */
|
| 27 |
|
| 28 | SYM_TYPED_FUNC_START(__loop_udelay)
|
| 29 | ldr r2, .LC1
|
| 30 | mul r0, r2, r0 @ r0 = delay_us * UDELAY_MULT
|
| 31 | b __loop_const_udelay
|
| 32 | SYM_FUNC_END(__loop_udelay)
|
| 33 |
|
| 34 | SYM_TYPED_FUNC_START(__loop_const_udelay) @ 0 <= r0 <= 0xfffffaf0
|
| 35 | ldr r2, .LC0
|
| 36 | ldr r2, [r2]
|
| 37 | umull r1, r0, r2, r0 @ r0-r1 = r0 * loops_per_jiffy
|
| 38 | adds r1, r1, |
| 39 | adcs r0, r0, r0 @ and right shift by 31
|
| 40 | reteq lr
|
| 41 | b __loop_delay
|
| 42 | SYM_FUNC_END(__loop_const_udelay)
|
| 43 |
|
| 44 | .align 3
|
| 45 |
|
| 46 | @ Delay routine
|
| 47 | SYM_TYPED_FUNC_START(__loop_delay)
|
| 48 | subs r0, r0, |
| 49 | |
| 50 | retls lr
|
| 51 | subs r0, r0, |
| 52 | retls lr
|
| 53 | subs r0, r0, |
| 54 | retls lr
|
| 55 | subs r0, r0, |
| 56 | retls lr
|
| 57 | subs r0, r0, |
| 58 | retls lr
|
| 59 | subs r0, r0, |
| 60 | retls lr
|
| 61 | subs r0, r0, |
| 62 | retls lr
|
| 63 | subs r0, r0, |
| 64 | |
| 65 | bhi __loop_delay
|
| 66 | ret lr
|
| 67 | SYM_FUNC_END(__loop_delay)
|