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/export.h> 20 #include <linux/init.h> 21 #include <asm/param.h> 22 #include <asm/delay.h> 23 #include <asm/timex.h> 24 #include <asm/processor.h> 25 26 int read_current_timer(unsigned long *timer_value) 27 { 28 *timer_value = mfspr(SPR_TTCR); 29 return 0; 30 } 31 32 void __delay(unsigned long cycles) 33 { 34 cycles_t start = get_cycles(); 35 36 while ((get_cycles() - start) < cycles) 37 cpu_relax(); 38 } 39 EXPORT_SYMBOL(__delay); 40 41 inline void __const_udelay(unsigned long xloops) 42 { 43 unsigned long long loops; 44 45 loops = (unsigned long long)xloops * loops_per_jiffy * HZ; 46 47 __delay(loops >> 32); 48 } 49 EXPORT_SYMBOL(__const_udelay); 50 51 void __udelay(unsigned long usecs) 52 { 53 __const_udelay(usecs * 0x10C7UL); /* 2**32 / 1000000 (rounded up) */ 54 } 55 EXPORT_SYMBOL(__udelay); 56 57 void __ndelay(unsigned long nsecs) 58 { 59 __const_udelay(nsecs * 0x5UL); /* 2**32 / 1000000000 (rounded up) */ 60 } 61 EXPORT_SYMBOL(__ndelay); 62