184ad6884SPeter Tyser /* 284ad6884SPeter Tyser * (C) Copyright 2002 384ad6884SPeter Tyser * Sysgo Real-Time Solutions, GmbH <www.elinos.com> 484ad6884SPeter Tyser * Marius Groeger <mgroeger@sysgo.de> 584ad6884SPeter Tyser * 684ad6884SPeter Tyser * (C) Copyright 2002 784ad6884SPeter Tyser * Sysgo Real-Time Solutions, GmbH <www.elinos.com> 884ad6884SPeter Tyser * Alex Zuepke <azu@sysgo.de> 984ad6884SPeter Tyser * 1084ad6884SPeter Tyser * (C) Copyright 2002 1184ad6884SPeter Tyser * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de> 1284ad6884SPeter Tyser * 131a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 1484ad6884SPeter Tyser */ 1584ad6884SPeter Tyser 1684ad6884SPeter Tyser #include <common.h> 1784ad6884SPeter Tyser #if defined (CONFIG_IMX) 1884ad6884SPeter Tyser 1984ad6884SPeter Tyser #include <asm/arch/imx-regs.h> 2084ad6884SPeter Tyser timer_init(void)2184ad6884SPeter Tyserint timer_init (void) 2284ad6884SPeter Tyser { 2384ad6884SPeter Tyser int i; 2484ad6884SPeter Tyser /* setup GP Timer 1 */ 2584ad6884SPeter Tyser TCTL1 = TCTL_SWR; 2684ad6884SPeter Tyser for ( i=0; i<100; i++) TCTL1 = 0; /* We have no udelay by now */ 2784ad6884SPeter Tyser TPRER1 = get_PERCLK1() / 1000000; /* 1 MHz */ 2884ad6884SPeter Tyser TCTL1 |= TCTL_FRR | (1<<1); /* Freerun Mode, PERCLK1 input */ 2984ad6884SPeter Tyser 3017659d7dSGraeme Russ /* Reset the timer */ 3117659d7dSGraeme Russ TCTL1 &= ~TCTL_TEN; 3217659d7dSGraeme Russ TCTL1 |= TCTL_TEN; /* Enable timer */ 3384ad6884SPeter Tyser 3484ad6884SPeter Tyser return (0); 3584ad6884SPeter Tyser } 3684ad6884SPeter Tyser 3784ad6884SPeter Tyser /* 3884ad6884SPeter Tyser * timer without interrupts 3984ad6884SPeter Tyser */ get_timer(ulong base)4084ad6884SPeter Tyserulong get_timer (ulong base) 4184ad6884SPeter Tyser { 4284ad6884SPeter Tyser return get_timer_masked() - base; 4384ad6884SPeter Tyser } 4484ad6884SPeter Tyser get_timer_masked(void)4584ad6884SPeter Tyserulong get_timer_masked (void) 4684ad6884SPeter Tyser { 4784ad6884SPeter Tyser return TCN1; 4884ad6884SPeter Tyser } 4984ad6884SPeter Tyser udelay_masked(unsigned long usec)5084ad6884SPeter Tyservoid udelay_masked (unsigned long usec) 5184ad6884SPeter Tyser { 5284ad6884SPeter Tyser ulong endtime = get_timer_masked() + usec; 5384ad6884SPeter Tyser signed long diff; 5484ad6884SPeter Tyser 5584ad6884SPeter Tyser do { 5684ad6884SPeter Tyser ulong now = get_timer_masked (); 5784ad6884SPeter Tyser diff = endtime - now; 5884ad6884SPeter Tyser } while (diff >= 0); 5984ad6884SPeter Tyser } 6084ad6884SPeter Tyser __udelay(unsigned long usec)6184ad6884SPeter Tyservoid __udelay (unsigned long usec) 6284ad6884SPeter Tyser { 6384ad6884SPeter Tyser udelay_masked(usec); 6484ad6884SPeter Tyser } 6584ad6884SPeter Tyser 6684ad6884SPeter Tyser /* 6784ad6884SPeter Tyser * This function is derived from PowerPC code (read timebase as long long). 6884ad6884SPeter Tyser * On ARM it just returns the timer value. 6984ad6884SPeter Tyser */ get_ticks(void)7084ad6884SPeter Tyserunsigned long long get_ticks(void) 7184ad6884SPeter Tyser { 7284ad6884SPeter Tyser return get_timer(0); 7384ad6884SPeter Tyser } 7484ad6884SPeter Tyser 7584ad6884SPeter Tyser /* 7684ad6884SPeter Tyser * This function is derived from PowerPC code (timebase clock frequency). 7784ad6884SPeter Tyser * On ARM it returns the number of timer ticks per second. 7884ad6884SPeter Tyser */ get_tbclk(void)7984ad6884SPeter Tyserulong get_tbclk (void) 8084ad6884SPeter Tyser { 81*63a7578eSMasahiro Yamada return CONFIG_SYS_HZ; 8284ad6884SPeter Tyser } 8384ad6884SPeter Tyser 8484ad6884SPeter Tyser /* 8584ad6884SPeter Tyser * Reset the cpu by setting up the watchdog timer and let him time out 8684ad6884SPeter Tyser */ reset_cpu(ulong ignored)8784ad6884SPeter Tyservoid reset_cpu (ulong ignored) 8884ad6884SPeter Tyser { 8984ad6884SPeter Tyser /* Disable watchdog and set Time-Out field to 0 */ 9084ad6884SPeter Tyser WCR = 0x00000000; 9184ad6884SPeter Tyser 9284ad6884SPeter Tyser /* Write Service Sequence */ 9384ad6884SPeter Tyser WSR = 0x00005555; 9484ad6884SPeter Tyser WSR = 0x0000AAAA; 9584ad6884SPeter Tyser 9684ad6884SPeter Tyser /* Enable watchdog */ 9784ad6884SPeter Tyser WCR = 0x00000001; 9884ad6884SPeter Tyser 9984ad6884SPeter Tyser while (1); 10084ad6884SPeter Tyser /*NOTREACHED*/ 10184ad6884SPeter Tyser } 10284ad6884SPeter Tyser 10384ad6884SPeter Tyser #endif /* defined (CONFIG_IMX) */ 104