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