Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9ed82c68 authored by Max Filippov's avatar Max Filippov
Browse files

xtensa: implement ndelay



Proper ndelay implementation allows for faster IO rate with drivers that
use ndelay to access their device registers, as otherwise ndelay is
emulated with udelay.

Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
parent 58f60c22
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -29,8 +29,10 @@ static inline void __delay(unsigned long loops)

/* Undefined function to get compile-time error */
void __bad_udelay(void);
void __bad_ndelay(void);

#define __MAX_UDELAY 30000
#define __MAX_NDELAY 30000

static inline void __udelay(unsigned long usecs)
{
@@ -50,4 +52,24 @@ static inline void udelay(unsigned long usec)
		__udelay(usec);
}

static inline void __ndelay(unsigned long nsec)
{
	/*
	 * Inner shift makes sure multiplication doesn't overflow
	 * for legitimate nsec values
	 */
	unsigned long cycles = (nsec * (ccount_freq >> 15)) >> 15;
	__delay(cycles);
}

#define ndelay(n) ndelay(n)

static inline void ndelay(unsigned long nsec)
{
	if (__builtin_constant_p(nsec) && nsec >= __MAX_NDELAY)
		__bad_ndelay();
	else
		__ndelay(nsec);
}

#endif