linux/arch/xtensa/include/asm/delay.h
<<
>>
Prefs
   1/*
   2 * include/asm-xtensa/delay.h
   3 *
   4 * This file is subject to the terms and conditions of the GNU General Public
   5 * License.  See the file "COPYING" in the main directory of this archive
   6 * for more details.
   7 *
   8 * Copyright (C) 2001 - 2005 Tensilica Inc.
   9 *
  10 */
  11
  12#ifndef _XTENSA_DELAY_H
  13#define _XTENSA_DELAY_H
  14
  15#include <asm/processor.h>
  16#include <asm/param.h>
  17
  18extern unsigned long loops_per_jiffy;
  19
  20static inline void __delay(unsigned long loops)
  21{
  22        /* 2 cycles per loop. */
  23        __asm__ __volatile__ ("1: addi %0, %0, -2; bgeui %0, 2, 1b"
  24                              : "=r" (loops) : "0" (loops));
  25}
  26
  27static __inline__ u32 xtensa_get_ccount(void)
  28{
  29        u32 ccount;
  30        asm volatile ("rsr %0, ccount\n" : "=r" (ccount));
  31        return ccount;
  32}
  33
  34/* For SMP/NUMA systems, change boot_cpu_data to something like
  35 * local_cpu_data->... where local_cpu_data points to the current
  36 * cpu. */
  37
  38static __inline__ void udelay (unsigned long usecs)
  39{
  40        unsigned long start = xtensa_get_ccount();
  41        unsigned long cycles = usecs * (loops_per_jiffy / (1000000UL / HZ));
  42
  43        /* Note: all variables are unsigned (can wrap around)! */
  44        while (((unsigned long)xtensa_get_ccount()) - start < cycles)
  45                ;
  46}
  47
  48#endif
  49