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 27ENTRY(__loop_udelay) 28 ldr r2, .LC1 29 mul r0, r2, r0 @ r0 = delay_us * UDELAY_MULT 30ENTRY(__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 41ENTRY(__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 61ENDPROC(__loop_udelay) 62ENDPROC(__loop_const_udelay) 63ENDPROC(__loop_delay) 64