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