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 25 int __devinit read_current_timer(unsigned long *timer_value) 26 { 27 *timer_value = mfspr(SPR_TTCR); 28 return 0; 29 } 30 31 void __delay(unsigned long cycles) 32 { 33 cycles_t start = get_cycles(); 34 35 while ((get_cycles() - start) < cycles) 36 cpu_relax(); 37 } 38 EXPORT_SYMBOL(__delay); 39 40 inline 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 } 48 EXPORT_SYMBOL(__const_udelay); 49 50 void __udelay(unsigned long usecs) 51 { 52 __const_udelay(usecs * 0x10C7UL); /* 2**32 / 1000000 (rounded up) */ 53 } 54 EXPORT_SYMBOL(__udelay); 55 56 void __ndelay(unsigned long nsecs) 57 { 58 __const_udelay(nsecs * 0x5UL); /* 2**32 / 1000000000 (rounded up) */ 59 } 60 EXPORT_SYMBOL(__ndelay); 61