blob: 59ca8a97d748895a49e4fbaf83a85eee99f0d459 [file] [log] [blame]
// 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);
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);