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