1*11bc7557SVitaly Andrianov /* 2*11bc7557SVitaly Andrianov * (C) Copyright 2012-2014 3*11bc7557SVitaly Andrianov * Texas Instruments Incorporated, <www.ti.com> 4*11bc7557SVitaly Andrianov * 5*11bc7557SVitaly Andrianov * SPDX-License-Identifier: GPL-2.0+ 6*11bc7557SVitaly Andrianov */ 7*11bc7557SVitaly Andrianov 8*11bc7557SVitaly Andrianov #include <common.h> 9*11bc7557SVitaly Andrianov #include <asm/io.h> 10*11bc7557SVitaly Andrianov #include <div64.h> 11*11bc7557SVitaly Andrianov 12*11bc7557SVitaly Andrianov DECLARE_GLOBAL_DATA_PTR; 13*11bc7557SVitaly Andrianov 14*11bc7557SVitaly Andrianov int timer_init(void) 15*11bc7557SVitaly Andrianov { 16*11bc7557SVitaly Andrianov gd->arch.tbl = 0; 17*11bc7557SVitaly Andrianov gd->arch.tbu = 0; 18*11bc7557SVitaly Andrianov 19*11bc7557SVitaly Andrianov gd->arch.timer_rate_hz = CONFIG_SYS_HZ_CLOCK / CONFIG_SYS_HZ; 20*11bc7557SVitaly Andrianov 21*11bc7557SVitaly Andrianov return 0; 22*11bc7557SVitaly Andrianov } 23*11bc7557SVitaly Andrianov 24*11bc7557SVitaly Andrianov unsigned long long get_ticks(void) 25*11bc7557SVitaly Andrianov { 26*11bc7557SVitaly Andrianov ulong nowl, nowu; 27*11bc7557SVitaly Andrianov 28*11bc7557SVitaly Andrianov asm volatile("mrrc p15, 0, %0, %1, c14" : "=r" (nowl), "=r" (nowu)); 29*11bc7557SVitaly Andrianov 30*11bc7557SVitaly Andrianov gd->arch.tbl = nowl; 31*11bc7557SVitaly Andrianov gd->arch.tbu = nowu; 32*11bc7557SVitaly Andrianov 33*11bc7557SVitaly Andrianov return (((unsigned long long)gd->arch.tbu) << 32) | gd->arch.tbl; 34*11bc7557SVitaly Andrianov } 35*11bc7557SVitaly Andrianov 36*11bc7557SVitaly Andrianov 37*11bc7557SVitaly Andrianov ulong get_timer(ulong base) 38*11bc7557SVitaly Andrianov { 39*11bc7557SVitaly Andrianov return lldiv(get_ticks(), gd->arch.timer_rate_hz) - base; 40*11bc7557SVitaly Andrianov } 41*11bc7557SVitaly Andrianov 42*11bc7557SVitaly Andrianov void __udelay(unsigned long usec) 43*11bc7557SVitaly Andrianov { 44*11bc7557SVitaly Andrianov unsigned long long endtime; 45*11bc7557SVitaly Andrianov 46*11bc7557SVitaly Andrianov endtime = lldiv((unsigned long long)usec * gd->arch.timer_rate_hz, 47*11bc7557SVitaly Andrianov 1000UL); 48*11bc7557SVitaly Andrianov 49*11bc7557SVitaly Andrianov endtime += get_ticks(); 50*11bc7557SVitaly Andrianov 51*11bc7557SVitaly Andrianov while (get_ticks() < endtime) 52*11bc7557SVitaly Andrianov ; 53*11bc7557SVitaly Andrianov } 54*11bc7557SVitaly Andrianov 55*11bc7557SVitaly Andrianov ulong get_tbclk(void) 56*11bc7557SVitaly Andrianov { 57*11bc7557SVitaly Andrianov return gd->arch.timer_rate_hz; 58*11bc7557SVitaly Andrianov } 59