blob: 792c59d885bc9d8274eaef7ea8c3a68539d9dc0a [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
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>
Will Deacond0a533b2012-07-06 15:47:17 +010012#include <asm/delay.h>
Nicolas Pitre215e3622015-02-25 22:50:39 +010013
Linus Torvalds1da177e2005-04-16 15:20:36 -070014 .text
15
Nicolas Pitre8adbb372005-11-11 21:51:49 +000016.LC0: .word loops_per_jiffy
Will Deacond0a533b2012-07-06 15:47:17 +010017.LC1: .word UDELAY_MULT
Linus Torvalds1da177e2005-04-16 15:20:36 -070018
19/*
Peter Teichmann6d4518d2006-03-20 17:10:09 +000020 * r0 <= 2000
Peter Teichmann6d4518d2006-03-20 17:10:09 +000021 * HZ <= 1000
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 */
Peter Teichmann6d4518d2006-03-20 17:10:09 +000023
Will Deacond0a533b2012-07-06 15:47:17 +010024ENTRY(__loop_udelay)
Peter Teichmann6d4518d2006-03-20 17:10:09 +000025 ldr r2, .LC1
Linus Torvalds1da177e2005-04-16 15:20:36 -070026 mul r0, r2, r0
Will Deacond0a533b2012-07-06 15:47:17 +010027ENTRY(__loop_const_udelay) @ 0 <= r0 <= 0x7fffff06
Nicolas Pitre8adbb372005-11-11 21:51:49 +000028 ldr r2, .LC0
Nicolas Pitre215e3622015-02-25 22:50:39 +010029 ldr r2, [r2]
30 umull r1, r0, r2, r0
31 adds r1, r1, #0xffffffff
32 adcs r0, r0, r0
Russell King6ebbf2c2014-06-30 16:29:12 +010033 reteq lr
Linus Torvalds1da177e2005-04-16 15:20:36 -070034
35/*
Peter Teichmann6d4518d2006-03-20 17:10:09 +000036 * loops = r0 * HZ * loops_per_jiffy / 1000000
Linus Torvalds1da177e2005-04-16 15:20:36 -070037 */
Fabio Estevam11d4bb12013-11-30 15:24:42 +010038 .align 3
Linus Torvalds1da177e2005-04-16 15:20:36 -070039
40@ Delay routine
Will Deacond0a533b2012-07-06 15:47:17 +010041ENTRY(__loop_delay)
Linus Torvalds1da177e2005-04-16 15:20:36 -070042 subs r0, r0, #1
43#if 0
Russell King6ebbf2c2014-06-30 16:29:12 +010044 retls lr
Linus Torvalds1da177e2005-04-16 15:20:36 -070045 subs r0, r0, #1
Russell King6ebbf2c2014-06-30 16:29:12 +010046 retls lr
Linus Torvalds1da177e2005-04-16 15:20:36 -070047 subs r0, r0, #1
Russell King6ebbf2c2014-06-30 16:29:12 +010048 retls lr
Linus Torvalds1da177e2005-04-16 15:20:36 -070049 subs r0, r0, #1
Russell King6ebbf2c2014-06-30 16:29:12 +010050 retls lr
Linus Torvalds1da177e2005-04-16 15:20:36 -070051 subs r0, r0, #1
Russell King6ebbf2c2014-06-30 16:29:12 +010052 retls lr
Linus Torvalds1da177e2005-04-16 15:20:36 -070053 subs r0, r0, #1
Russell King6ebbf2c2014-06-30 16:29:12 +010054 retls lr
Linus Torvalds1da177e2005-04-16 15:20:36 -070055 subs r0, r0, #1
Russell King6ebbf2c2014-06-30 16:29:12 +010056 retls lr
Linus Torvalds1da177e2005-04-16 15:20:36 -070057 subs r0, r0, #1
58#endif
Will Deacond0a533b2012-07-06 15:47:17 +010059 bhi __loop_delay
Russell King6ebbf2c2014-06-30 16:29:12 +010060 ret lr
Will Deacond0a533b2012-07-06 15:47:17 +010061ENDPROC(__loop_udelay)
62ENDPROC(__loop_const_udelay)
63ENDPROC(__loop_delay)