xref: /rk3399_rockchip-uboot/arch/arm/cpu/arm1136/mx35/timer.c (revision e89d623f099c44b0b166ccf46bce2e6a0b99c984)
1b9bb0531SStefano Babic /*
2b9bb0531SStefano Babic  * (C) Copyright 2007
3b9bb0531SStefano Babic  * Sascha Hauer, Pengutronix
4b9bb0531SStefano Babic  *
5b9bb0531SStefano Babic  * (C) Copyright 2008-2009 Freescale Semiconductor, Inc.
6b9bb0531SStefano Babic  *
7*1a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
8b9bb0531SStefano Babic  */
9b9bb0531SStefano Babic 
10b9bb0531SStefano Babic #include <common.h>
11b9bb0531SStefano Babic #include <asm/io.h>
12b9bb0531SStefano Babic #include <asm/arch/imx-regs.h>
13543d2479SBenoît Thébaudeau #include <asm/arch/crm_regs.h>
1431bb50f8SStefano Babic 
1531bb50f8SStefano Babic DECLARE_GLOBAL_DATA_PTR;
1631bb50f8SStefano Babic 
17b9bb0531SStefano Babic /* General purpose timers bitfields */
18b9bb0531SStefano Babic #define GPTCR_SWR       (1<<15)	/* Software reset */
19b9bb0531SStefano Babic #define GPTCR_FRR       (1<<9)	/* Freerun / restart */
20543d2479SBenoît Thébaudeau #define GPTCR_CLKSOURCE_32   (4<<6)	/* Clock source */
21b9bb0531SStefano Babic #define GPTCR_TEN       (1)	/* Timer enable */
2231bb50f8SStefano Babic 
23543d2479SBenoît Thébaudeau /*
24543d2479SBenoît Thébaudeau  * nothing really to do with interrupts, just starts up a counter.
25543d2479SBenoît Thébaudeau  * The 32KHz 32-bit timer overruns in 134217 seconds
26543d2479SBenoît Thébaudeau  */
timer_init(void)27b9bb0531SStefano Babic int timer_init(void)
28b9bb0531SStefano Babic {
29b9bb0531SStefano Babic 	int i;
30b9bb0531SStefano Babic 	struct gpt_regs *gpt = (struct gpt_regs *)GPT1_BASE_ADDR;
31543d2479SBenoît Thébaudeau 	struct ccm_regs *ccm = (struct ccm_regs *)CCM_BASE_ADDR;
32b9bb0531SStefano Babic 
33b9bb0531SStefano Babic 	/* setup GP Timer 1 */
34b9bb0531SStefano Babic 	writel(GPTCR_SWR, &gpt->ctrl);
35543d2479SBenoît Thébaudeau 
36543d2479SBenoît Thébaudeau 	writel(readl(&ccm->cgr1) | 3 << MXC_CCM_CGR1_GPT_OFFSET, &ccm->cgr1);
37543d2479SBenoît Thébaudeau 
38b9bb0531SStefano Babic 	for (i = 0; i < 100; i++)
39b9bb0531SStefano Babic 		writel(0, &gpt->ctrl); /* We have no udelay by now */
40543d2479SBenoît Thébaudeau 	writel(0, &gpt->pre); /* prescaler = 1 */
41543d2479SBenoît Thébaudeau 	/* Freerun Mode, 32KHz input */
42543d2479SBenoît Thébaudeau 	writel(readl(&gpt->ctrl) | GPTCR_CLKSOURCE_32 | GPTCR_FRR,
43b9bb0531SStefano Babic 			&gpt->ctrl);
44543d2479SBenoît Thébaudeau 	writel(readl(&gpt->ctrl) | GPTCR_TEN, &gpt->ctrl);
45b9bb0531SStefano Babic 
46b9bb0531SStefano Babic 	return 0;
47b9bb0531SStefano Babic }
48