xref: /linux/arch/arm/lib/delay-loop.S (revision d0a533b18235d36206b9b422efadb7cee444dfdb)
1*d0a533b1SWill Deacon/*
2*d0a533b1SWill Deacon *  linux/arch/arm/lib/delay.S
3*d0a533b1SWill Deacon *
4*d0a533b1SWill Deacon *  Copyright (C) 1995, 1996 Russell King
5*d0a533b1SWill Deacon *
6*d0a533b1SWill Deacon * This program is free software; you can redistribute it and/or modify
7*d0a533b1SWill Deacon * it under the terms of the GNU General Public License version 2 as
8*d0a533b1SWill Deacon * published by the Free Software Foundation.
9*d0a533b1SWill Deacon */
10*d0a533b1SWill Deacon#include <linux/linkage.h>
11*d0a533b1SWill Deacon#include <asm/assembler.h>
12*d0a533b1SWill Deacon#include <asm/delay.h>
13*d0a533b1SWill Deacon		.text
14*d0a533b1SWill Deacon
15*d0a533b1SWill Deacon.LC0:		.word	loops_per_jiffy
16*d0a533b1SWill Deacon.LC1:		.word	UDELAY_MULT
17*d0a533b1SWill Deacon
18*d0a533b1SWill Deacon/*
19*d0a533b1SWill Deacon * r0  <= 2000
20*d0a533b1SWill Deacon * lpj <= 0x01ffffff (max. 3355 bogomips)
21*d0a533b1SWill Deacon * HZ  <= 1000
22*d0a533b1SWill Deacon */
23*d0a533b1SWill Deacon
24*d0a533b1SWill DeaconENTRY(__loop_udelay)
25*d0a533b1SWill Deacon		ldr	r2, .LC1
26*d0a533b1SWill Deacon		mul	r0, r2, r0
27*d0a533b1SWill DeaconENTRY(__loop_const_udelay)			@ 0 <= r0 <= 0x7fffff06
28*d0a533b1SWill Deacon		mov	r1, #-1
29*d0a533b1SWill Deacon		ldr	r2, .LC0
30*d0a533b1SWill Deacon		ldr	r2, [r2]		@ max = 0x01ffffff
31*d0a533b1SWill Deacon		add	r0, r0, r1, lsr #32-14
32*d0a533b1SWill Deacon		mov	r0, r0, lsr #14		@ max = 0x0001ffff
33*d0a533b1SWill Deacon		add	r2, r2, r1, lsr #32-10
34*d0a533b1SWill Deacon		mov	r2, r2, lsr #10		@ max = 0x00007fff
35*d0a533b1SWill Deacon		mul	r0, r2, r0		@ max = 2^32-1
36*d0a533b1SWill Deacon		add	r0, r0, r1, lsr #32-6
37*d0a533b1SWill Deacon		movs	r0, r0, lsr #6
38*d0a533b1SWill Deacon		moveq	pc, lr
39*d0a533b1SWill Deacon
40*d0a533b1SWill Deacon/*
41*d0a533b1SWill Deacon * loops = r0 * HZ * loops_per_jiffy / 1000000
42*d0a533b1SWill Deacon */
43*d0a533b1SWill Deacon
44*d0a533b1SWill Deacon@ Delay routine
45*d0a533b1SWill DeaconENTRY(__loop_delay)
46*d0a533b1SWill Deacon		subs	r0, r0, #1
47*d0a533b1SWill Deacon#if 0
48*d0a533b1SWill Deacon		movls	pc, lr
49*d0a533b1SWill Deacon		subs	r0, r0, #1
50*d0a533b1SWill Deacon		movls	pc, lr
51*d0a533b1SWill Deacon		subs	r0, r0, #1
52*d0a533b1SWill Deacon		movls	pc, lr
53*d0a533b1SWill Deacon		subs	r0, r0, #1
54*d0a533b1SWill Deacon		movls	pc, lr
55*d0a533b1SWill Deacon		subs	r0, r0, #1
56*d0a533b1SWill Deacon		movls	pc, lr
57*d0a533b1SWill Deacon		subs	r0, r0, #1
58*d0a533b1SWill Deacon		movls	pc, lr
59*d0a533b1SWill Deacon		subs	r0, r0, #1
60*d0a533b1SWill Deacon		movls	pc, lr
61*d0a533b1SWill Deacon		subs	r0, r0, #1
62*d0a533b1SWill Deacon#endif
63*d0a533b1SWill Deacon		bhi	__loop_delay
64*d0a533b1SWill Deacon		mov	pc, lr
65*d0a533b1SWill DeaconENDPROC(__loop_udelay)
66*d0a533b1SWill DeaconENDPROC(__loop_const_udelay)
67*d0a533b1SWill DeaconENDPROC(__loop_delay)
68