Skip to content

Commit

Permalink
xtensa: implement ndelay
Browse files Browse the repository at this point in the history
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: Max Filippov <jcmvbkbc@gmail.com>
  • Loading branch information
Max Filippov committed Jan 14, 2014
1 parent 58f60c2 commit 9ed82c6
Showing 1 changed file with 22 additions and 0 deletions.
22 changes: 22 additions & 0 deletions arch/xtensa/include/asm/delay.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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

0 comments on commit 9ed82c6

Please sign in to comment.