1 /* 2 * (C) Copyright 2000, 2001 3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 4 * 5 * SPDX-License-Identifier: GPL-2.0+ 6 */ 7 8 #include <common.h> 9 #include <asm/io.h> 10 11 /* ------------------------------------------------------------------------- */ 12 13 /* 14 * This function is intended for SHORT delays only. 15 * It will overflow at around 10 seconds @ 400MHz, 16 * or 20 seconds @ 200MHz. 17 */ 18 unsigned long usec2ticks(unsigned long usec) 19 { 20 ulong ticks; 21 22 if (usec < 1000) { 23 ticks = ((usec * (get_tbclk()/1000)) + 500) / 1000; 24 } else { 25 ticks = ((usec / 10) * (get_tbclk() / 100000)); 26 } 27 28 return (ticks); 29 } 30 31 /* ------------------------------------------------------------------------- */ 32 33 /* 34 * We implement the delay by converting the delay (the number of 35 * microseconds to wait) into a number of time base ticks; then we 36 * watch the time base until it has incremented by that amount. 37 */ 38 void __udelay(unsigned long usec) 39 { 40 ulong ticks = usec2ticks (usec); 41 wait_ticks (ticks); 42 } 43 44 /* ------------------------------------------------------------------------- */ 45 #ifndef CONFIG_NAND_SPL 46 unsigned long ticks2usec(unsigned long ticks) 47 { 48 ulong tbclk = get_tbclk(); 49 50 /* usec = ticks * 1000000 / tbclk 51 * Multiplication would overflow at ~4.2e3 ticks, 52 * so we break it up into 53 * usec = ( ( ticks * 1000) / tbclk ) * 1000; 54 */ 55 ticks *= 1000L; 56 ticks /= tbclk; 57 ticks *= 1000L; 58 59 return ((ulong)ticks); 60 } 61 #endif 62 /* ------------------------------------------------------------------------- */ 63 64 int timer_init(void) 65 { 66 unsigned long temp; 67 68 /* reset */ 69 asm volatile("li %0,0 ; mttbl %0 ; mttbu %0;" 70 : "=&r"(temp) ); 71 72 return (0); 73 } 74 /* ------------------------------------------------------------------------- */ 75