Commit 923df96b authored by Will Deacon's avatar Will Deacon Committed by Russell King

ARM: 7451/1: arch timer: implement read_current_timer and get_cycles

This patch implements read_current_timer using the architected timers
when they are selected via CONFIG_ARM_ARCH_TIMER. If they are detected
not to be usable at runtime, we return -ENXIO to the caller.

Furthermore, if read_current_timer is exported then we can implement
get_cycles in terms of it for use as both an entropy source and for
implementing __udelay and friends.
Tested-by: default avatarShinya Kuribayashi <shinya.kuribayashi.px@renesas.com>
Reviewed-by: default avatarStephen Boyd <sboyd@codeaurora.org>
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent f8f5701b
#ifndef __ASMARM_ARCH_TIMER_H #ifndef __ASMARM_ARCH_TIMER_H
#define __ASMARM_ARCH_TIMER_H #define __ASMARM_ARCH_TIMER_H
#include <asm/errno.h>
#ifdef CONFIG_ARM_ARCH_TIMER #ifdef CONFIG_ARM_ARCH_TIMER
#define ARCH_HAS_READ_CURRENT_TIMER
int arch_timer_of_register(void); int arch_timer_of_register(void);
int arch_timer_sched_clock_init(void); int arch_timer_sched_clock_init(void);
#else #else
......
...@@ -12,13 +12,15 @@ ...@@ -12,13 +12,15 @@
#ifndef _ASMARM_TIMEX_H #ifndef _ASMARM_TIMEX_H
#define _ASMARM_TIMEX_H #define _ASMARM_TIMEX_H
#include <asm/arch_timer.h>
#include <mach/timex.h> #include <mach/timex.h>
typedef unsigned long cycles_t; typedef unsigned long cycles_t;
static inline cycles_t get_cycles (void) #ifdef ARCH_HAS_READ_CURRENT_TIMER
{ #define get_cycles() ({ cycles_t c; read_current_timer(&c) ? 0 : c; })
return 0; #else
} #define get_cycles() (0)
#endif
#endif #endif
...@@ -223,6 +223,14 @@ static cycle_t arch_counter_read(struct clocksource *cs) ...@@ -223,6 +223,14 @@ static cycle_t arch_counter_read(struct clocksource *cs)
return arch_counter_get_cntpct(); return arch_counter_get_cntpct();
} }
int read_current_timer(unsigned long *timer_val)
{
if (!arch_timer_rate)
return -ENXIO;
*timer_val = arch_counter_get_cntpct();
return 0;
}
static struct clocksource clocksource_counter = { static struct clocksource clocksource_counter = {
.name = "arch_sys_counter", .name = "arch_sys_counter",
.rating = 400, .rating = 400,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment