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 <jcmvbkbc@gmail.com>
This commit is contained in:
parent
a6f3eefad8
commit
58f60c222e
1 changed files with 15 additions and 6 deletions
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue