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