|
@@ -27,18 +27,27 @@ static inline void __delay(unsigned long loops)
|
|
: "+r" (loops));
|
|
: "+r" (loops));
|
|
}
|
|
}
|
|
|
|
|
|
-/* For SMP/NUMA systems, change boot_cpu_data to something like
|
|
|
|
- * local_cpu_data->... where local_cpu_data points to the current
|
|
|
|
- * cpu. */
|
|
|
|
|
|
+/* Undefined function to get compile-time error */
|
|
|
|
+void __bad_udelay(void);
|
|
|
|
|
|
-static __inline__ void udelay (unsigned long usecs)
|
|
|
|
|
|
+#define __MAX_UDELAY 30000
|
|
|
|
+
|
|
|
|
+static inline void __udelay(unsigned long usecs)
|
|
{
|
|
{
|
|
unsigned long start = get_ccount();
|
|
unsigned long start = get_ccount();
|
|
- unsigned long cycles = usecs * (loops_per_jiffy / (1000000UL / HZ));
|
|
|
|
|
|
+ unsigned long cycles = (usecs * (ccount_freq >> 15)) >> 5;
|
|
|
|
|
|
/* Note: all variables are unsigned (can wrap around)! */
|
|
/* Note: all variables are unsigned (can wrap around)! */
|
|
while (((unsigned long)get_ccount()) - start < cycles)
|
|
while (((unsigned long)get_ccount()) - start < cycles)
|
|
- ;
|
|
|
|
|
|
+ cpu_relax();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static inline void udelay(unsigned long usec)
|
|
|
|
+{
|
|
|
|
+ if (__builtin_constant_p(usec) && usec >= __MAX_UDELAY)
|
|
|
|
+ __bad_udelay();
|
|
|
|
+ else
|
|
|
|
+ __udelay(usec);
|
|
}
|
|
}
|
|
|
|
|
|
#endif
|
|
#endif
|