1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun // Copyright (C) 2005-2017 Andes Technology Corporation 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #ifndef __NDS32_DELAY_H__ 5*4882a593Smuzhiyun #define __NDS32_DELAY_H__ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #include <asm/param.h> 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun /* There is no clocksource cycle counter in the CPU. */ __delay(unsigned long loops)10*4882a593Smuzhiyunstatic inline void __delay(unsigned long loops) 11*4882a593Smuzhiyun { 12*4882a593Smuzhiyun __asm__ __volatile__(".align 2\n" 13*4882a593Smuzhiyun "1:\n" 14*4882a593Smuzhiyun "\taddi\t%0, %0, -1\n" 15*4882a593Smuzhiyun "\tbgtz\t%0, 1b\n" 16*4882a593Smuzhiyun :"=r"(loops) 17*4882a593Smuzhiyun :"0"(loops)); 18*4882a593Smuzhiyun } 19*4882a593Smuzhiyun __udelay(unsigned long usecs,unsigned long lpj)20*4882a593Smuzhiyunstatic inline void __udelay(unsigned long usecs, unsigned long lpj) 21*4882a593Smuzhiyun { 22*4882a593Smuzhiyun usecs *= (unsigned long)(((0x8000000000000000ULL / (500000 / HZ)) + 23*4882a593Smuzhiyun 0x80000000ULL) >> 32); 24*4882a593Smuzhiyun usecs = (unsigned long)(((unsigned long long)usecs * lpj) >> 32); 25*4882a593Smuzhiyun __delay(usecs); 26*4882a593Smuzhiyun } 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #define udelay(usecs) __udelay((usecs), loops_per_jiffy) 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* make sure "usecs *= ..." in udelay do not overflow. */ 31*4882a593Smuzhiyun #if HZ >= 1000 32*4882a593Smuzhiyun #define MAX_UDELAY_MS 1 33*4882a593Smuzhiyun #elif HZ <= 200 34*4882a593Smuzhiyun #define MAX_UDELAY_MS 5 35*4882a593Smuzhiyun #else 36*4882a593Smuzhiyun #define MAX_UDELAY_MS (1000 / HZ) 37*4882a593Smuzhiyun #endif 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #endif 40