10ae76531SDavid Feng /* 20ae76531SDavid Feng * (C) Copyright 2013 30ae76531SDavid Feng * David Feng <fenghua@phytium.com.cn> 40ae76531SDavid Feng * 50ae76531SDavid Feng * SPDX-License-Identifier: GPL-2.0+ 60ae76531SDavid Feng */ 70ae76531SDavid Feng 80ae76531SDavid Feng #include <common.h> 90ae76531SDavid Feng #include <command.h> 100ae76531SDavid Feng #include <asm/system.h> 110ae76531SDavid Feng 120ae76531SDavid Feng /* 130ae76531SDavid Feng * Generic timer implementation of get_tbclk() 140ae76531SDavid Feng */ 150ae76531SDavid Feng unsigned long get_tbclk(void) 160ae76531SDavid Feng { 170ae76531SDavid Feng unsigned long cntfrq; 180ae76531SDavid Feng asm volatile("mrs %0, cntfrq_el0" : "=r" (cntfrq)); 190ae76531SDavid Feng return cntfrq; 200ae76531SDavid Feng } 210ae76531SDavid Feng 220ae76531SDavid Feng /* 230ae76531SDavid Feng * Generic timer implementation of timer_read_counter() 240ae76531SDavid Feng */ 250ae76531SDavid Feng unsigned long timer_read_counter(void) 260ae76531SDavid Feng { 270ae76531SDavid Feng unsigned long cntpct; 28060ef094SYork Sun #ifdef CONFIG_SYS_FSL_ERRATUM_A008585 29060ef094SYork Sun /* This erratum number needs to be confirmed to match ARM document */ 30060ef094SYork Sun unsigned long temp; 31060ef094SYork Sun #endif 320ae76531SDavid Feng isb(); 330ae76531SDavid Feng asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct)); 34060ef094SYork Sun #ifdef CONFIG_SYS_FSL_ERRATUM_A008585 35060ef094SYork Sun asm volatile("mrs %0, cntpct_el0" : "=r" (temp)); 36060ef094SYork Sun while (temp != cntpct) { 37060ef094SYork Sun asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct)); 38060ef094SYork Sun asm volatile("mrs %0, cntpct_el0" : "=r" (temp)); 39060ef094SYork Sun } 40060ef094SYork Sun #endif 410ae76531SDavid Feng return cntpct; 420ae76531SDavid Feng } 43*b644d3e9SAneesh Bansal 44*b644d3e9SAneesh Bansal unsigned long usec2ticks(unsigned long usec) 45*b644d3e9SAneesh Bansal { 46*b644d3e9SAneesh Bansal ulong ticks; 47*b644d3e9SAneesh Bansal if (usec < 1000) 48*b644d3e9SAneesh Bansal ticks = ((usec * (get_tbclk()/1000)) + 500) / 1000; 49*b644d3e9SAneesh Bansal else 50*b644d3e9SAneesh Bansal ticks = ((usec / 10) * (get_tbclk() / 100000)); 51*b644d3e9SAneesh Bansal 52*b644d3e9SAneesh Bansal return ticks; 53*b644d3e9SAneesh Bansal } 54