66 lines
1.3 KiB
C
66 lines
1.3 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Copyright (C) 1993, 2000 Linus Torvalds
|
|
*
|
|
* Delay routines, using a pre-computed "loops_per_jiffy" value.
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
|
|
/*
|
|
* Use only for very small delays (< 1 msec).
|
|
*
|
|
* The active part of our cycle counter is only 32-bits wide, and
|
|
* we're treating the difference between two marks as signed. On
|
|
* a 1GHz box, that's about 2 seconds.
|
|
*/
|
|
void __delay(unsigned long loops)
|
|
{
|
|
unsigned long tmp;
|
|
|
|
__asm__ __volatile__(
|
|
" rtc %0\n"
|
|
" addl %1,%0,%1\n"
|
|
"1: rtc %0\n"
|
|
" subl %1,%0,%0\n"
|
|
" bgt %0,1b"
|
|
: "=&r" (tmp), "=r" (loops) : "1"(loops));
|
|
}
|
|
EXPORT_SYMBOL(__delay);
|
|
|
|
#ifdef CONFIG_SMP
|
|
#define LPJ cpu_data[smp_processor_id()].loops_per_jiffy
|
|
#else
|
|
#define LPJ loops_per_jiffy
|
|
#endif
|
|
|
|
void udelay(unsigned long usecs)
|
|
{
|
|
unsigned long loops = usecs * get_cpu_freq() / 1000000;
|
|
unsigned long tmp;
|
|
|
|
__asm__ __volatile__(
|
|
" rtc %0\n"
|
|
" addl %1,%0,%1\n"
|
|
"1: rtc %0\n"
|
|
" subl %1,%0,%0\n"
|
|
" bgt %0,1b"
|
|
: "=&r" (tmp), "=r" (loops) : "1"(loops));
|
|
}
|
|
EXPORT_SYMBOL(udelay);
|
|
|
|
void ndelay(unsigned long nsecs)
|
|
{
|
|
unsigned long loops = nsecs * get_cpu_freq() / 1000000000;
|
|
unsigned long tmp;
|
|
|
|
__asm__ __volatile__(
|
|
" rtc %0\n"
|
|
" addl %1,%0,%1\n"
|
|
"1: rtc %0\n"
|
|
" subl %1,%0,%0\n"
|
|
" bgt %0,1b"
|
|
: "=&r" (tmp), "=r" (loops) : "1"(loops));
|
|
}
|
|
EXPORT_SYMBOL(ndelay);
|