xref: /rk3399_rockchip-uboot/arch/arm/cpu/arm926ejs/lpc32xx/timer.c (revision 326ea986ac150acdc7656d57fca647db80b50158)
152f69f81SVladimir Zapolskiy /*
252f69f81SVladimir Zapolskiy  * Copyright (C) 2011 Vladimir Zapolskiy <vz@mleia.com>
352f69f81SVladimir Zapolskiy  *
4*1a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
552f69f81SVladimir Zapolskiy  */
652f69f81SVladimir Zapolskiy 
752f69f81SVladimir Zapolskiy #include <common.h>
852f69f81SVladimir Zapolskiy #include <asm/arch/cpu.h>
952f69f81SVladimir Zapolskiy #include <asm/arch/clk.h>
1052f69f81SVladimir Zapolskiy #include <asm/arch/timer.h>
1152f69f81SVladimir Zapolskiy #include <asm/io.h>
1252f69f81SVladimir Zapolskiy 
1352f69f81SVladimir Zapolskiy static struct timer_regs  *timer0 = (struct timer_regs *)TIMER0_BASE;
1452f69f81SVladimir Zapolskiy static struct timer_regs  *timer1 = (struct timer_regs *)TIMER1_BASE;
1552f69f81SVladimir Zapolskiy static struct clk_pm_regs *clk    = (struct clk_pm_regs *)CLK_PM_BASE;
1652f69f81SVladimir Zapolskiy 
lpc32xx_timer_clock(u32 bit,int enable)1752f69f81SVladimir Zapolskiy static void lpc32xx_timer_clock(u32 bit, int enable)
1852f69f81SVladimir Zapolskiy {
1952f69f81SVladimir Zapolskiy 	if (enable)
2052f69f81SVladimir Zapolskiy 		setbits_le32(&clk->timclk_ctrl1, bit);
2152f69f81SVladimir Zapolskiy 	else
2252f69f81SVladimir Zapolskiy 		clrbits_le32(&clk->timclk_ctrl1, bit);
2352f69f81SVladimir Zapolskiy }
2452f69f81SVladimir Zapolskiy 
lpc32xx_timer_reset(struct timer_regs * timer,u32 freq)2552f69f81SVladimir Zapolskiy static void lpc32xx_timer_reset(struct timer_regs *timer, u32 freq)
2652f69f81SVladimir Zapolskiy {
2752f69f81SVladimir Zapolskiy 	writel(TIMER_TCR_COUNTER_RESET,   &timer->tcr);
2852f69f81SVladimir Zapolskiy 	writel(TIMER_TCR_COUNTER_DISABLE, &timer->tcr);
2952f69f81SVladimir Zapolskiy 	writel(0, &timer->tc);
3052f69f81SVladimir Zapolskiy 	writel(0, &timer->pr);
3152f69f81SVladimir Zapolskiy 
3252f69f81SVladimir Zapolskiy 	/* Count mode is every rising PCLK edge */
3352f69f81SVladimir Zapolskiy 	writel(TIMER_CTCR_MODE_TIMER, &timer->ctcr);
3452f69f81SVladimir Zapolskiy 
3552f69f81SVladimir Zapolskiy 	/* Set prescale counter value */
3652f69f81SVladimir Zapolskiy 	writel((get_periph_clk_rate() / freq) - 1, &timer->pr);
3752f69f81SVladimir Zapolskiy }
3852f69f81SVladimir Zapolskiy 
lpc32xx_timer_count(struct timer_regs * timer,int enable)3952f69f81SVladimir Zapolskiy static void lpc32xx_timer_count(struct timer_regs *timer, int enable)
4052f69f81SVladimir Zapolskiy {
4152f69f81SVladimir Zapolskiy 	if (enable)
4252f69f81SVladimir Zapolskiy 		writel(TIMER_TCR_COUNTER_ENABLE,  &timer->tcr);
4352f69f81SVladimir Zapolskiy 	else
4452f69f81SVladimir Zapolskiy 		writel(TIMER_TCR_COUNTER_DISABLE, &timer->tcr);
4552f69f81SVladimir Zapolskiy }
4652f69f81SVladimir Zapolskiy 
timer_init(void)4752f69f81SVladimir Zapolskiy int timer_init(void)
4852f69f81SVladimir Zapolskiy {
4952f69f81SVladimir Zapolskiy 	lpc32xx_timer_clock(CLK_TIMCLK_TIMER0, 1);
5052f69f81SVladimir Zapolskiy 	lpc32xx_timer_reset(timer0, CONFIG_SYS_HZ);
5152f69f81SVladimir Zapolskiy 	lpc32xx_timer_count(timer0, 1);
5252f69f81SVladimir Zapolskiy 
5352f69f81SVladimir Zapolskiy 	return 0;
5452f69f81SVladimir Zapolskiy }
5552f69f81SVladimir Zapolskiy 
get_timer(ulong base)5652f69f81SVladimir Zapolskiy ulong get_timer(ulong base)
5752f69f81SVladimir Zapolskiy {
5852f69f81SVladimir Zapolskiy 	return readl(&timer0->tc) - base;
5952f69f81SVladimir Zapolskiy }
6052f69f81SVladimir Zapolskiy 
__udelay(unsigned long usec)6152f69f81SVladimir Zapolskiy void __udelay(unsigned long usec)
6252f69f81SVladimir Zapolskiy {
6352f69f81SVladimir Zapolskiy 	lpc32xx_timer_clock(CLK_TIMCLK_TIMER1, 1);
6452f69f81SVladimir Zapolskiy 	lpc32xx_timer_reset(timer1, CONFIG_SYS_HZ * 1000);
6552f69f81SVladimir Zapolskiy 	lpc32xx_timer_count(timer1, 1);
6652f69f81SVladimir Zapolskiy 
6752f69f81SVladimir Zapolskiy 	while (readl(&timer1->tc) < usec)
6852f69f81SVladimir Zapolskiy 		/* NOP */;
6952f69f81SVladimir Zapolskiy 
7052f69f81SVladimir Zapolskiy 	lpc32xx_timer_count(timer1, 0);
7152f69f81SVladimir Zapolskiy 	lpc32xx_timer_clock(CLK_TIMCLK_TIMER1, 0);
7252f69f81SVladimir Zapolskiy }
7352f69f81SVladimir Zapolskiy 
get_ticks(void)7452f69f81SVladimir Zapolskiy unsigned long long get_ticks(void)
7552f69f81SVladimir Zapolskiy {
7652f69f81SVladimir Zapolskiy 	return get_timer(0);
7752f69f81SVladimir Zapolskiy }
7852f69f81SVladimir Zapolskiy 
get_tbclk(void)7952f69f81SVladimir Zapolskiy ulong get_tbclk(void)
8052f69f81SVladimir Zapolskiy {
8152f69f81SVladimir Zapolskiy 	return CONFIG_SYS_HZ;
8252f69f81SVladimir Zapolskiy }
83