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