162011840SMasahiro Yamada /* 262011840SMasahiro Yamada * (C) Copyright 2007-2008 362011840SMasahiro Yamada * Stelian Pop <stelian@popies.net> 462011840SMasahiro Yamada * Lead Tech Design <www.leadtechdesign.com> 562011840SMasahiro Yamada * 662011840SMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+ 762011840SMasahiro Yamada */ 862011840SMasahiro Yamada 962011840SMasahiro Yamada #include <common.h> 1062011840SMasahiro Yamada #include <asm/io.h> 1162011840SMasahiro Yamada #include <asm/arch/hardware.h> 1262011840SMasahiro Yamada #include <asm/arch/at91_pit.h> 1362011840SMasahiro Yamada #include <asm/arch/clk.h> 1462011840SMasahiro Yamada #include <div64.h> 1562011840SMasahiro Yamada 1662011840SMasahiro Yamada #if !defined(CONFIG_AT91FAMILY) 1762011840SMasahiro Yamada # error You need to define CONFIG_AT91FAMILY in your board config! 1862011840SMasahiro Yamada #endif 1962011840SMasahiro Yamada 2062011840SMasahiro Yamada DECLARE_GLOBAL_DATA_PTR; 2162011840SMasahiro Yamada 2262011840SMasahiro Yamada /* 2362011840SMasahiro Yamada * We're using the AT91CAP9/SAM9 PITC in 32 bit mode, by 2462011840SMasahiro Yamada * setting the 20 bit counter period to its maximum (0xfffff). 2562011840SMasahiro Yamada * (See the relevant data sheets to understand that this really works) 2662011840SMasahiro Yamada * 2762011840SMasahiro Yamada * We do also mimic the typical powerpc way of incrementing 2862011840SMasahiro Yamada * two 32 bit registers called tbl and tbu. 2962011840SMasahiro Yamada * 3062011840SMasahiro Yamada * Those registers increment at 1/16 the main clock rate. 3162011840SMasahiro Yamada */ 3262011840SMasahiro Yamada 3362011840SMasahiro Yamada #define TIMER_LOAD_VAL 0xfffff 3462011840SMasahiro Yamada 3562011840SMasahiro Yamada /* 3662011840SMasahiro Yamada * Use the PITC in full 32 bit incrementing mode 3762011840SMasahiro Yamada */ timer_init(void)3862011840SMasahiro Yamadaint timer_init(void) 3962011840SMasahiro Yamada { 4062011840SMasahiro Yamada at91_pit_t *pit = (at91_pit_t *) ATMEL_BASE_PIT; 4162011840SMasahiro Yamada 42*eced5a7eSWenyou Yang at91_periph_clk_enable(ATMEL_ID_SYS); 4362011840SMasahiro Yamada 4462011840SMasahiro Yamada /* Enable PITC */ 4562011840SMasahiro Yamada writel(TIMER_LOAD_VAL | AT91_PIT_MR_EN , &pit->mr); 4662011840SMasahiro Yamada 4762011840SMasahiro Yamada gd->arch.timer_rate_hz = gd->arch.mck_rate_hz / 16; 4862011840SMasahiro Yamada 4962011840SMasahiro Yamada return 0; 5062011840SMasahiro Yamada } 5162011840SMasahiro Yamada 5262011840SMasahiro Yamada /* 5362011840SMasahiro Yamada * Return the number of timer ticks per second. 5462011840SMasahiro Yamada */ get_tbclk(void)5562011840SMasahiro Yamadaulong get_tbclk(void) 5662011840SMasahiro Yamada { 5762011840SMasahiro Yamada return gd->arch.timer_rate_hz; 5862011840SMasahiro Yamada } 59