| Thomas Gleixner | d2912cb | 2019-06-04 10:11:33 +0200 | [diff] [blame^] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ | 
| GuanXuetao | 96cf518 | 2011-01-15 18:23:09 +0800 | [diff] [blame] | 2 | /* | 
 | 3 |  * linux/arch/unicore32/lib/delay.S | 
 | 4 |  * | 
 | 5 |  * Code specific to PKUnity SoC and UniCore ISA | 
 | 6 |  * | 
 | 7 |  * Copyright (C) 2001-2010 GUAN Xue-tao | 
| GuanXuetao | 96cf518 | 2011-01-15 18:23:09 +0800 | [diff] [blame] | 8 |  */ | 
 | 9 | #include <linux/linkage.h> | 
 | 10 | #include <asm/assembler.h> | 
 | 11 | #include <asm/param.h> | 
 | 12 | 		.text | 
 | 13 |  | 
 | 14 | .LC0:		.word	loops_per_jiffy | 
 | 15 | .LC1:		.word	(2199023*HZ)>>11 | 
 | 16 |  | 
 | 17 | /* | 
 | 18 |  * r0  <= 2000 | 
 | 19 |  * lpj <= 0x01ffffff (max. 3355 bogomips) | 
 | 20 |  * HZ  <= 1000 | 
 | 21 |  */ | 
 | 22 |  | 
 | 23 | ENTRY(__udelay) | 
 | 24 | 		ldw	r2, .LC1 | 
 | 25 | 		mul	r0, r2, r0 | 
 | 26 | ENTRY(__const_udelay)				@ 0 <= r0 <= 0x7fffff06 | 
 | 27 | 		ldw	r2, .LC0 | 
 | 28 | 		ldw	r2, [r2]		@ max = 0x01ffffff | 
 | 29 | 		mov	r0, r0 >> #14		@ max = 0x0001ffff | 
 | 30 | 		mov	r2, r2 >> #10		@ max = 0x00007fff | 
 | 31 | 		mul	r0, r2, r0		@ max = 2^32-1 | 
 | 32 | 		mov.a	r0, r0 >> #6 | 
 | 33 | 		cmoveq	pc, lr | 
 | 34 |  | 
 | 35 | /* | 
 | 36 |  * loops = r0 * HZ * loops_per_jiffy / 1000000 | 
 | 37 |  * | 
 | 38 |  * Oh, if only we had a cycle counter... | 
 | 39 |  */ | 
 | 40 |  | 
 | 41 | @ Delay routine | 
 | 42 | ENTRY(__delay) | 
 | 43 | 		sub.a	r0, r0, #2 | 
 | 44 | 		bua	__delay | 
 | 45 | 		mov	pc, lr | 
 | 46 | ENDPROC(__udelay) | 
 | 47 | ENDPROC(__const_udelay) | 
 | 48 | ENDPROC(__delay) |