linux/arch/openrisc/lib/delay.c
<<
>>
Prefs
   1/*
   2 * OpenRISC Linux
   3 *
   4 * Linux architectural port borrowing liberally from similar works of
   5 * others.  All original copyrights apply as per the original source
   6 * declaration.
   7 *
   8 * Modifications for the OpenRISC architecture:
   9 * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se>
  10 *
  11 *      This program is free software; you can redistribute it and/or
  12 *      modify it under the terms of the GNU General Public License
  13 *      version 2 as published by the Free Software Foundation
  14 *
  15 * Precise Delay Loops
  16 */
  17
  18#include <linux/kernel.h>
  19#include <linux/module.h>
  20#include <linux/init.h>
  21#include <asm/delay.h>
  22#include <asm/timex.h>
  23#include <asm/processor.h>
  24
  25int read_current_timer(unsigned long *timer_value)
  26{
  27        *timer_value = mfspr(SPR_TTCR);
  28        return 0;
  29}
  30
  31void __delay(unsigned long cycles)
  32{
  33        cycles_t start = get_cycles();
  34
  35        while ((get_cycles() - start) < cycles)
  36                cpu_relax();
  37}
  38EXPORT_SYMBOL(__delay);
  39
  40inline void __const_udelay(unsigned long xloops)
  41{
  42        unsigned long long loops;
  43
  44        loops = (unsigned long long)xloops * loops_per_jiffy * HZ;
  45
  46        __delay(loops >> 32);
  47}
  48EXPORT_SYMBOL(__const_udelay);
  49
  50void __udelay(unsigned long usecs)
  51{
  52        __const_udelay(usecs * 0x10C7UL); /* 2**32 / 1000000 (rounded up) */
  53}
  54EXPORT_SYMBOL(__udelay);
  55
  56void __ndelay(unsigned long nsecs)
  57{
  58        __const_udelay(nsecs * 0x5UL); /* 2**32 / 1000000000 (rounded up) */
  59}
  60EXPORT_SYMBOL(__ndelay);
  61