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