root/arch/nds32/include/asm/delay.h

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

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. __delay
  2. __udelay

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 // Copyright (C) 2005-2017 Andes Technology Corporation
   3 
   4 #ifndef __NDS32_DELAY_H__
   5 #define __NDS32_DELAY_H__
   6 
   7 #include <asm/param.h>
   8 
   9 /* There is no clocksource cycle counter in the CPU. */
  10 static inline void __delay(unsigned long loops)
  11 {
  12         __asm__ __volatile__(".align 2\n"
  13                              "1:\n"
  14                              "\taddi\t%0, %0, -1\n"
  15                              "\tbgtz\t%0, 1b\n"
  16                              :"=r"(loops)
  17                              :"0"(loops));
  18 }
  19 
  20 static inline void __udelay(unsigned long usecs, unsigned long lpj)
  21 {
  22         usecs *= (unsigned long)(((0x8000000000000000ULL / (500000 / HZ)) +
  23                                   0x80000000ULL) >> 32);
  24         usecs = (unsigned long)(((unsigned long long)usecs * lpj) >> 32);
  25         __delay(usecs);
  26 }
  27 
  28 #define udelay(usecs) __udelay((usecs), loops_per_jiffy)
  29 
  30 /* make sure "usecs *= ..." in udelay do not overflow. */
  31 #if HZ >= 1000
  32 #define MAX_UDELAY_MS   1
  33 #elif HZ <= 200
  34 #define MAX_UDELAY_MS   5
  35 #else
  36 #define MAX_UDELAY_MS   (1000 / HZ)
  37 #endif
  38 
  39 #endif

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