1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include <common.h>
20#include <div64.h>
21#include <asm/io.h>
22#include <asm/arch/imx-regs.h>
23
24
25#define GPTCR_SWR (1 << 15)
26#define GPTCR_FRR (1 << 8)
27#define GPTCR_CLKSOURCE_32 (4 << 1)
28#define GPTCR_TEN 1
29
30DECLARE_GLOBAL_DATA_PTR;
31
32#define timestamp (gd->arch.tbl)
33#define lastinc (gd->arch.lastinc)
34
35
36
37
38
39#ifdef CONFIG_MX27_TIMER_HIGH_PRECISION
40
41static inline unsigned long long tick_to_time(unsigned long long tick)
42{
43 tick *= CONFIG_SYS_HZ;
44 do_div(tick, CONFIG_MX27_CLK32);
45 return tick;
46}
47
48static inline unsigned long long time_to_tick(unsigned long long time)
49{
50 time *= CONFIG_MX27_CLK32;
51 do_div(time, CONFIG_SYS_HZ);
52 return time;
53}
54
55static inline unsigned long long us_to_tick(unsigned long long us)
56{
57 us = us * CONFIG_MX27_CLK32 + 999999;
58 do_div(us, 1000000);
59 return us;
60}
61#else
62
63#define TICK_PER_TIME ((CONFIG_MX27_CLK32 + CONFIG_SYS_HZ / 2) / \
64 CONFIG_SYS_HZ)
65#define US_PER_TICK (1000000 / CONFIG_MX27_CLK32)
66
67static inline unsigned long long tick_to_time(unsigned long long tick)
68{
69 do_div(tick, TICK_PER_TIME);
70 return tick;
71}
72
73static inline unsigned long long time_to_tick(unsigned long long time)
74{
75 return time * TICK_PER_TIME;
76}
77
78static inline unsigned long long us_to_tick(unsigned long long us)
79{
80 us += US_PER_TICK - 1;
81 do_div(us, US_PER_TICK);
82 return us;
83}
84#endif
85
86
87
88int timer_init(void)
89{
90 int i;
91 struct gpt_regs *regs = (struct gpt_regs *)IMX_TIM1_BASE;
92 struct pll_regs *pll = (struct pll_regs *)IMX_PLL_BASE;
93
94
95 writel(GPTCR_SWR, ®s->gpt_tctl);
96
97 writel(readl(&pll->pccr0) | PCCR0_GPT1_EN, &pll->pccr0);
98 writel(readl(&pll->pccr1) | PCCR1_PERCLK1_EN, &pll->pccr1);
99
100 for (i = 0; i < 100; i++)
101 writel(0, ®s->gpt_tctl);
102 writel(0, ®s->gpt_tprer);
103
104 writel(readl(®s->gpt_tctl) | GPTCR_CLKSOURCE_32 | GPTCR_FRR,
105 ®s->gpt_tctl);
106 writel(readl(®s->gpt_tctl) | GPTCR_TEN, ®s->gpt_tctl);
107
108 return 0;
109}
110
111unsigned long long get_ticks(void)
112{
113 struct gpt_regs *regs = (struct gpt_regs *)IMX_TIM1_BASE;
114 ulong now = readl(®s->gpt_tcn);
115
116 if (now >= lastinc) {
117
118
119
120
121 timestamp += (now - lastinc);
122 } else {
123
124 timestamp += (0xFFFFFFFF - lastinc) + now;
125 }
126 lastinc = now;
127 return timestamp;
128}
129
130ulong get_timer_masked(void)
131{
132
133
134
135
136
137
138 return tick_to_time(get_ticks());
139}
140
141ulong get_timer(ulong base)
142{
143 return get_timer_masked() - base;
144}
145
146
147void __udelay(unsigned long usec)
148{
149 unsigned long long tmp;
150 ulong tmo;
151
152 tmo = us_to_tick(usec);
153 tmp = get_ticks() + tmo;
154
155 while (get_ticks() < tmp)
156 ;
157}
158
159ulong get_tbclk(void)
160{
161 return CONFIG_MX27_CLK32;
162}
163