blob: 21129a7901c5ef0c784bdbf2242648a238938418 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
wdenk7ac16102004-08-01 22:48:16 +00002/*
3 * (C) Copyright 2002
4 * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
5 * Marius Groeger <mgroeger@sysgo.de>
6 *
7 * (C) Copyright 2002
8 * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
9 * Alex Zuepke <azu@sysgo.de>
10 *
11 * (C) Copyright 2002
Detlev Zundelf1b3f2b2009-05-13 10:54:10 +020012 * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
wdenk7ac16102004-08-01 22:48:16 +000013 */
14
15#include <common.h>
Simon Glassafb02152019-12-28 10:45:01 -070016#include <cpu_func.h>
Simon Glass495a5dc2019-11-14 12:57:30 -070017#include <time.h>
wdenk7ac16102004-08-01 22:48:16 +000018#if defined (CONFIG_IMX)
19
wdenk7ac16102004-08-01 22:48:16 +000020#include <asm/arch/imx-regs.h>
21
Jean-Christophe PLAGNIOL-VILLARD8c9fc002009-05-15 23:47:02 +020022int timer_init (void)
wdenk7ac16102004-08-01 22:48:16 +000023{
24 int i;
25 /* setup GP Timer 1 */
26 TCTL1 = TCTL_SWR;
27 for ( i=0; i<100; i++) TCTL1 = 0; /* We have no udelay by now */
28 TPRER1 = get_PERCLK1() / 1000000; /* 1 MHz */
29 TCTL1 |= TCTL_FRR | (1<<1); /* Freerun Mode, PERCLK1 input */
30
Graeme Russ944a7fe2011-07-15 02:21:14 +000031 /* Reset the timer */
32 TCTL1 &= ~TCTL_TEN;
33 TCTL1 |= TCTL_TEN; /* Enable timer */
wdenk7ac16102004-08-01 22:48:16 +000034
35 return (0);
36}
37
38/*
39 * timer without interrupts
40 */
Patrick Delaunay9858a602018-10-05 11:33:52 +020041static ulong get_timer_masked (void)
wdenk7ac16102004-08-01 22:48:16 +000042{
Patrick Delaunay9858a602018-10-05 11:33:52 +020043 return TCN1;
wdenk7ac16102004-08-01 22:48:16 +000044}
45
Patrick Delaunay9858a602018-10-05 11:33:52 +020046ulong get_timer (ulong base)
wdenk7ac16102004-08-01 22:48:16 +000047{
Patrick Delaunay9858a602018-10-05 11:33:52 +020048 return get_timer_masked() - base;
wdenk7ac16102004-08-01 22:48:16 +000049}
50
Patrick Delaunay94a08592018-10-05 11:33:51 +020051void __udelay (unsigned long usec)
wdenk7ac16102004-08-01 22:48:16 +000052{
wdenk7af1f9d2005-04-04 12:08:28 +000053 ulong endtime = get_timer_masked() + usec;
54 signed long diff;
wdenk7ac16102004-08-01 22:48:16 +000055
wdenk7af1f9d2005-04-04 12:08:28 +000056 do {
57 ulong now = get_timer_masked ();
58 diff = endtime - now;
59 } while (diff >= 0);
wdenk7ac16102004-08-01 22:48:16 +000060}
61
wdenk7ac16102004-08-01 22:48:16 +000062/*
63 * This function is derived from PowerPC code (read timebase as long long).
64 * On ARM it just returns the timer value.
65 */
66unsigned long long get_ticks(void)
67{
68 return get_timer(0);
69}
70
71/*
72 * This function is derived from PowerPC code (timebase clock frequency).
73 * On ARM it returns the number of timer ticks per second.
74 */
Simon Glassa9dc0682019-12-28 10:44:59 -070075ulong get_tbclk(void)
wdenk7ac16102004-08-01 22:48:16 +000076{
Masahiro Yamada04cfea52016-09-06 22:17:38 +090077 return CONFIG_SYS_HZ;
wdenk7ac16102004-08-01 22:48:16 +000078}
79
wdenk915b3762005-04-05 22:30:50 +000080/*
81 * Reset the cpu by setting up the watchdog timer and let him time out
82 */
Simon Glassafb02152019-12-28 10:45:01 -070083void reset_cpu(ulong ignored)
wdenk915b3762005-04-05 22:30:50 +000084{
85 /* Disable watchdog and set Time-Out field to 0 */
86 WCR = 0x00000000;
87
88 /* Write Service Sequence */
89 WSR = 0x00005555;
90 WSR = 0x0000AAAA;
91
92 /* Enable watchdog */
93 WCR = 0x00000001;
94
95 while (1);
96 /*NOTREACHED*/
97}
98
wdenk7ac16102004-08-01 22:48:16 +000099#endif /* defined (CONFIG_IMX) */