From 58f60c222e8d4503a4be654cbd6d4e190dc1a7d8 Mon Sep 17 00:00:00 2001 From: Max Filippov Date: Fri, 10 Jan 2014 12:02:18 +0400 Subject: [PATCH] xtensa: clean up udelay Replace division with shift, use ccount_freq instead of loops_per_jiffy. Introduce __MAX_UDELAY and (undefined) __bad_udelay, break build for too big udelay constants. Remove irrelevant comment, clean up code style. Signed-off-by: Max Filippov --- arch/xtensa/include/asm/delay.h | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/arch/xtensa/include/asm/delay.h b/arch/xtensa/include/asm/delay.h index 742b89f3ca2c..69ba4629bed0 100644 --- a/arch/xtensa/include/asm/delay.h +++ b/arch/xtensa/include/asm/delay.h @@ -27,18 +27,27 @@ static inline void __delay(unsigned long 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 cycles = usecs * (loops_per_jiffy / (1000000UL / HZ)); + unsigned long cycles = (usecs * (ccount_freq >> 15)) >> 5; /* Note: all variables are unsigned (can wrap around)! */ 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 -- 2.20.1