1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2011 Richard Weinberger <richrd@nod.at> 4*4882a593Smuzhiyun * Mostly copied from arch/x86/lib/delay.c 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #include <linux/export.h> 8*4882a593Smuzhiyun #include <linux/kernel.h> 9*4882a593Smuzhiyun #include <linux/delay.h> 10*4882a593Smuzhiyun #include <asm/param.h> 11*4882a593Smuzhiyun __delay(unsigned long loops)12*4882a593Smuzhiyunvoid __delay(unsigned long loops) 13*4882a593Smuzhiyun { 14*4882a593Smuzhiyun asm volatile( 15*4882a593Smuzhiyun "test %0,%0\n" 16*4882a593Smuzhiyun "jz 3f\n" 17*4882a593Smuzhiyun "jmp 1f\n" 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun ".align 16\n" 20*4882a593Smuzhiyun "1: jmp 2f\n" 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun ".align 16\n" 23*4882a593Smuzhiyun "2: dec %0\n" 24*4882a593Smuzhiyun " jnz 2b\n" 25*4882a593Smuzhiyun "3: dec %0\n" 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun : /* we don't need output */ 28*4882a593Smuzhiyun : "a" (loops) 29*4882a593Smuzhiyun ); 30*4882a593Smuzhiyun } 31*4882a593Smuzhiyun EXPORT_SYMBOL(__delay); 32*4882a593Smuzhiyun __const_udelay(unsigned long xloops)33*4882a593Smuzhiyuninline void __const_udelay(unsigned long xloops) 34*4882a593Smuzhiyun { 35*4882a593Smuzhiyun int d0; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun xloops *= 4; 38*4882a593Smuzhiyun asm("mull %%edx" 39*4882a593Smuzhiyun : "=d" (xloops), "=&a" (d0) 40*4882a593Smuzhiyun : "1" (xloops), "0" 41*4882a593Smuzhiyun (loops_per_jiffy * (HZ/4))); 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun __delay(++xloops); 44*4882a593Smuzhiyun } 45*4882a593Smuzhiyun EXPORT_SYMBOL(__const_udelay); 46*4882a593Smuzhiyun __udelay(unsigned long usecs)47*4882a593Smuzhiyunvoid __udelay(unsigned long usecs) 48*4882a593Smuzhiyun { 49*4882a593Smuzhiyun __const_udelay(usecs * 0x000010c7); /* 2**32 / 1000000 (rounded up) */ 50*4882a593Smuzhiyun } 51*4882a593Smuzhiyun EXPORT_SYMBOL(__udelay); 52*4882a593Smuzhiyun __ndelay(unsigned long nsecs)53*4882a593Smuzhiyunvoid __ndelay(unsigned long nsecs) 54*4882a593Smuzhiyun { 55*4882a593Smuzhiyun __const_udelay(nsecs * 0x00005); /* 2**32 / 1000000000 (rounded up) */ 56*4882a593Smuzhiyun } 57*4882a593Smuzhiyun EXPORT_SYMBOL(__ndelay); 58