1/* 2 * (C) Copyright 2004 3 * DAVE Srl 4 * http://www.dave-tech.it 5 * http://www.wawnet.biz 6 * mailto:info@wawnet.biz 7 * 8 * See file CREDITS for list of people who contributed to this 9 * project. 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 as 13 * published by the Free Software Foundation; either version 2 of 14 * the License, or (at your option) any later version. 15 * 16 * This program is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 * GNU General Public License for more details. 20 * 21 * You should have received a copy of the GNU General Public License 22 * along with this program; if not, write to the Free Software 23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 24 * MA 02111-1307 USA 25 */ 26 27#include <common.h> 28#include <asm/hardware.h> 29 30/* we always count down the max. */ 31#define TIMER_LOAD_VAL 0xffff 32 33/* macro to read the 16 bit timer */ 34#define READ_TIMER (TCNTO1 & 0xffff) 35 36#ifdef CONFIG_USE_IRQ 37#error CONFIG_USE_IRQ NOT supported 38#endif 39 40static ulong timestamp; 41static ulong lastdec; 42 43int timer_init (void) 44{ 45 TCFG0 = 0x000000E9; 46 TCFG1 = 0x00000004; 47 TCON = 0x00000900; 48 TCNTB1 = TIMER_LOAD_VAL; 49 TCMPB1 = 0; 50 TCON = 0x00000B00; 51 TCON = 0x00000900; 52 53 54 lastdec = TCNTB1 = TIMER_LOAD_VAL; 55 timestamp = 0; 56 return 0; 57} 58 59/* 60 * timer without interrupts 61 */ 62 63void reset_timer (void) 64{ 65 reset_timer_masked (); 66} 67 68ulong get_timer (ulong base) 69{ 70 return get_timer_masked () - base; 71} 72 73void set_timer (ulong t) 74{ 75 timestamp = t; 76} 77 78void udelay (unsigned long usec) 79{ 80 ulong tmo; 81 82 tmo = usec / 1000; 83 tmo *= CONFIG_SYS_HZ; 84 tmo /= 8; 85 86 tmo += get_timer (0); 87 88 while (get_timer_masked () < tmo) 89 /*NOP*/; 90} 91 92void reset_timer_masked (void) 93{ 94 /* reset time */ 95 lastdec = READ_TIMER; 96 timestamp = 0; 97} 98 99ulong get_timer_masked (void) 100{ 101 ulong now = READ_TIMER; 102 103 if (lastdec >= now) { 104 /* normal mode */ 105 timestamp += lastdec - now; 106 } else { 107 /* we have an overflow ... */ 108 timestamp += lastdec + TIMER_LOAD_VAL - now; 109 } 110 lastdec = now; 111 112 return timestamp; 113} 114 115void udelay_masked (unsigned long usec) 116{ 117 ulong tmo; 118 ulong endtime; 119 signed long diff; 120 121 if (usec >= 1000) { 122 tmo = usec / 1000; 123 tmo *= CONFIG_SYS_HZ; 124 tmo /= 8; 125 } else { 126 tmo = usec * CONFIG_SYS_HZ; 127 tmo /= (1000*8); 128 } 129 130 endtime = get_timer(0) + tmo; 131 132 do { 133 ulong now = get_timer_masked (); 134 diff = endtime - now; 135 } while (diff >= 0); 136} 137