Forráskód Böngészése

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: Max Filippov <jcmvbkbc@gmail.com>
Max Filippov 11 éve
szülő
commit
9ed82c6866
1 módosított fájl, 22 hozzáadás és 0 törlés
  1. 22 0
      arch/xtensa/include/asm/delay.h

+ 22 - 0
arch/xtensa/include/asm/delay.h

@@ -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)
 		__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