1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * (C) Copyright 2012-2014 3*4882a593Smuzhiyun * Texas Instruments Incorporated, <www.ti.com> 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <common.h> 9*4882a593Smuzhiyun #include <asm/io.h> 10*4882a593Smuzhiyun #include <div64.h> 11*4882a593Smuzhiyun #include <bootstage.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR; 14*4882a593Smuzhiyun timer_init(void)15*4882a593Smuzhiyunint timer_init(void) 16*4882a593Smuzhiyun { 17*4882a593Smuzhiyun gd->arch.tbl = 0; 18*4882a593Smuzhiyun gd->arch.tbu = 0; 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun gd->arch.timer_rate_hz = CONFIG_SYS_HZ_CLOCK; 21*4882a593Smuzhiyun return 0; 22*4882a593Smuzhiyun } 23*4882a593Smuzhiyun get_ticks(void)24*4882a593Smuzhiyununsigned long long get_ticks(void) 25*4882a593Smuzhiyun { 26*4882a593Smuzhiyun ulong nowl, nowu; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun asm volatile("mrrc p15, 0, %0, %1, c14" : "=r" (nowl), "=r" (nowu)); 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun gd->arch.tbl = nowl; 31*4882a593Smuzhiyun gd->arch.tbu = nowu; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun return (((unsigned long long)gd->arch.tbu) << 32) | gd->arch.tbl; 34*4882a593Smuzhiyun } 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun timer_get_boot_us(void)37*4882a593Smuzhiyunulong timer_get_boot_us(void) 38*4882a593Smuzhiyun { 39*4882a593Smuzhiyun return lldiv(get_ticks(), CONFIG_SYS_HZ_CLOCK / 1000000); 40*4882a593Smuzhiyun } 41*4882a593Smuzhiyun get_tbclk(void)42*4882a593Smuzhiyunulong get_tbclk(void) 43*4882a593Smuzhiyun { 44*4882a593Smuzhiyun return gd->arch.timer_rate_hz; 45*4882a593Smuzhiyun } 46