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