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