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

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
...@@ -29,8 +29,10 @@ static inline void __delay(unsigned long loops) ...@@ -29,8 +29,10 @@ static inline void __delay(unsigned long loops)
/* Undefined function to get compile-time error */ /* Undefined function to get compile-time error */
void __bad_udelay(void); void __bad_udelay(void);
void __bad_ndelay(void);
#define __MAX_UDELAY 30000 #define __MAX_UDELAY 30000
#define __MAX_NDELAY 30000
static inline void __udelay(unsigned long usecs) static inline void __udelay(unsigned long usecs)
{ {
...@@ -50,4 +52,24 @@ static inline void udelay(unsigned long usec) ...@@ -50,4 +52,24 @@ static inline void udelay(unsigned long usec)
__udelay(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 #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment