3
* Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com.
5
* SPDX-License-Identifier: GPL-2.0+
10
#include <asm/arch/hardware.h>
11
#include <asm/arch/spr_gpt.h>
12
#include <asm/arch/spr_misc.h>
14
#define GPT_RESOLUTION (CONFIG_SPEAR_HZ_CLOCK / CONFIG_SPEAR_HZ)
15
#define READ_TIMER() (readl(&gpt_regs_p->count) & GPT_FREE_RUNNING)
17
static struct gpt_regs *const gpt_regs_p =
18
(struct gpt_regs *)CONFIG_SPEAR_TIMERBASE;
20
static struct misc_regs *const misc_regs_p =
21
(struct misc_regs *)CONFIG_SPEAR_MISCBASE;
23
DECLARE_GLOBAL_DATA_PTR;
25
#define timestamp gd->arch.tbl
26
#define lastdec gd->arch.lastinc
32
/* Prescaler setting */
33
#if defined(CONFIG_SPEAR3XX)
34
writel(MISC_PRSC_CFG, &misc_regs_p->prsc2_clk_cfg);
35
synth = MISC_GPT4SYNTH;
36
#elif defined(CONFIG_SPEAR600)
37
writel(MISC_PRSC_CFG, &misc_regs_p->prsc1_clk_cfg);
38
synth = MISC_GPT3SYNTH;
40
# error Incorrect config. Can only be spear{600|300|310|320}
43
writel(readl(&misc_regs_p->periph_clk_cfg) | synth,
44
&misc_regs_p->periph_clk_cfg);
47
writel(GPT_PRESCALER_1 | GPT_MODE_AUTO_RELOAD, &gpt_regs_p->control);
49
/* load value for free running */
50
writel(GPT_FREE_RUNNING, &gpt_regs_p->compare);
52
/* auto reload, start timer */
53
writel(readl(&gpt_regs_p->control) | GPT_ENABLE, &gpt_regs_p->control);
56
lastdec = READ_TIMER();
63
* timer without interrupts
65
ulong get_timer(ulong base)
67
return (get_timer_masked() / GPT_RESOLUTION) - base;
70
void __udelay(unsigned long usec)
73
ulong start = get_timer_masked();
74
ulong tenudelcnt = CONFIG_SPEAR_HZ_CLOCK / (1000 * 100);
77
rndoff = (usec % 10) ? 1 : 0;
79
/* tenudelcnt timer tick gives 10 microsecconds delay */
80
tmo = ((usec / 10) + rndoff) * tenudelcnt;
82
while ((ulong) (get_timer_masked() - start) < tmo)
86
ulong get_timer_masked(void)
88
ulong now = READ_TIMER();
92
timestamp += now - lastdec;
94
/* we have an overflow ... */
95
timestamp += now + GPT_FREE_RUNNING - lastdec;
102
void udelay_masked(unsigned long usec)
108
* This function is derived from PowerPC code (read timebase as long long).
109
* On ARM it just returns the timer value.
111
unsigned long long get_ticks(void)
117
* This function is derived from PowerPC code (timebase clock frequency).
118
* On ARM it returns the number of timer ticks per second.
120
ulong get_tbclk(void)
122
return CONFIG_SPEAR_HZ;