root/arch/alpha/lib/udelay.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. __delay
  2. udelay
  3. ndelay

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * Copyright (C) 1993, 2000 Linus Torvalds
   4  *
   5  * Delay routines, using a pre-computed "loops_per_jiffy" value.
   6  */
   7 
   8 #include <linux/module.h>
   9 #include <linux/sched.h> /* for udelay's use of smp_processor_id */
  10 #include <asm/param.h>
  11 #include <asm/smp.h>
  12 #include <linux/delay.h>
  13 
  14 /*
  15  * Use only for very small delays (< 1 msec). 
  16  *
  17  * The active part of our cycle counter is only 32-bits wide, and
  18  * we're treating the difference between two marks as signed.  On
  19  * a 1GHz box, that's about 2 seconds.
  20  */
  21 
  22 void
  23 __delay(int loops)
  24 {
  25         int tmp;
  26         __asm__ __volatile__(
  27                 "       rpcc %0\n"
  28                 "       addl %1,%0,%1\n"
  29                 "1:     rpcc %0\n"
  30                 "       subl %1,%0,%0\n"
  31                 "       bgt %0,1b"
  32                 : "=&r" (tmp), "=r" (loops) : "1"(loops));
  33 }
  34 EXPORT_SYMBOL(__delay);
  35 
  36 #ifdef CONFIG_SMP
  37 #define LPJ      cpu_data[smp_processor_id()].loops_per_jiffy
  38 #else
  39 #define LPJ      loops_per_jiffy
  40 #endif
  41 
  42 void
  43 udelay(unsigned long usecs)
  44 {
  45         usecs *= (((unsigned long)HZ << 32) / 1000000) * LPJ;
  46         __delay((long)usecs >> 32);
  47 }
  48 EXPORT_SYMBOL(udelay);
  49 
  50 void
  51 ndelay(unsigned long nsecs)
  52 {
  53         nsecs *= (((unsigned long)HZ << 32) / 1000000000) * LPJ;
  54         __delay((long)nsecs >> 32);
  55 }
  56 EXPORT_SYMBOL(ndelay);

/* [<][>][^][v][top][bottom][index][help] */