18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *  linux/arch/arm/lib/delay.S
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci *  Copyright (C) 1995, 1996 Russell King
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci#include <linux/linkage.h>
88c2ecf20Sopenharmony_ci#include <asm/assembler.h>
98c2ecf20Sopenharmony_ci#include <asm/delay.h>
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci		.text
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci.LC0:		.word	loops_per_jiffy
148c2ecf20Sopenharmony_ci.LC1:		.word	UDELAY_MULT
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci/*
178c2ecf20Sopenharmony_ci * loops = r0 * HZ * loops_per_jiffy / 1000000
188c2ecf20Sopenharmony_ci *
198c2ecf20Sopenharmony_ci * r0  <= 2000
208c2ecf20Sopenharmony_ci * HZ  <= 1000
218c2ecf20Sopenharmony_ci */
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ciENTRY(__loop_udelay)
248c2ecf20Sopenharmony_ci		ldr	r2, .LC1
258c2ecf20Sopenharmony_ci		mul	r0, r2, r0		@ r0 = delay_us * UDELAY_MULT
268c2ecf20Sopenharmony_ciENTRY(__loop_const_udelay)			@ 0 <= r0 <= 0xfffffaf0
278c2ecf20Sopenharmony_ci		ldr	r2, .LC0
288c2ecf20Sopenharmony_ci		ldr	r2, [r2]
298c2ecf20Sopenharmony_ci		umull	r1, r0, r2, r0		@ r0-r1 = r0 * loops_per_jiffy
308c2ecf20Sopenharmony_ci		adds	r1, r1, #0xffffffff	@ rounding up ...
318c2ecf20Sopenharmony_ci		adcs	r0, r0, r0		@ and right shift by 31
328c2ecf20Sopenharmony_ci		reteq	lr
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci		.align 3
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci@ Delay routine
378c2ecf20Sopenharmony_ciENTRY(__loop_delay)
388c2ecf20Sopenharmony_ci		subs	r0, r0, #1
398c2ecf20Sopenharmony_ci#if 0
408c2ecf20Sopenharmony_ci		retls	lr
418c2ecf20Sopenharmony_ci		subs	r0, r0, #1
428c2ecf20Sopenharmony_ci		retls	lr
438c2ecf20Sopenharmony_ci		subs	r0, r0, #1
448c2ecf20Sopenharmony_ci		retls	lr
458c2ecf20Sopenharmony_ci		subs	r0, r0, #1
468c2ecf20Sopenharmony_ci		retls	lr
478c2ecf20Sopenharmony_ci		subs	r0, r0, #1
488c2ecf20Sopenharmony_ci		retls	lr
498c2ecf20Sopenharmony_ci		subs	r0, r0, #1
508c2ecf20Sopenharmony_ci		retls	lr
518c2ecf20Sopenharmony_ci		subs	r0, r0, #1
528c2ecf20Sopenharmony_ci		retls	lr
538c2ecf20Sopenharmony_ci		subs	r0, r0, #1
548c2ecf20Sopenharmony_ci#endif
558c2ecf20Sopenharmony_ci		bhi	__loop_delay
568c2ecf20Sopenharmony_ci		ret	lr
578c2ecf20Sopenharmony_ciENDPROC(__loop_udelay)
588c2ecf20Sopenharmony_ciENDPROC(__loop_const_udelay)
598c2ecf20Sopenharmony_ciENDPROC(__loop_delay)
60