From 8790fa13c4c2450dd0898a1cb7f539ec7e06bc79 Mon Sep 17 00:00:00 2001 From: Channagoud Kadabi Date: Wed, 20 Dec 2017 11:46:30 -0800 Subject: [PATCH] drivers: clksource: add API to return cval Sleep driver needs to program the absolute clock value for next expiry into pdc register for system wake up. Add an API to read the cval low and high counters. Change-Id: I3f08b3320ea281894d46f3c4bb0862784cc337a1 Signed-off-by: Channagoud Kadabi Signed-off-by: Lina Iyer --- drivers/clocksource/arm_arch_timer.c | 19 +++++++++++++++++++ include/clocksource/arm_arch_timer.h | 5 +++++ 2 files changed, 24 insertions(+) diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c index e25b0965b8d5..1ea7c02c2d53 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c @@ -46,6 +46,8 @@ #define CNTFRQ 0x10 #define CNTP_TVAL 0x28 #define CNTP_CTL 0x2c +#define CNTCVAL_LO 0x30 +#define CNTCVAL_HI 0x34 #define CNTV_TVAL 0x38 #define CNTV_CTL 0x3c @@ -937,6 +939,23 @@ bool arch_timer_evtstrm_available(void) return cpumask_test_cpu(raw_smp_processor_id(), &evtstrm_available); } +void arch_timer_mem_get_cval(u32 *lo, u32 *hi) +{ + u32 ctrl; + + *lo = *hi = ~0U; + + if (!arch_counter_base) + return; + + ctrl = readl_relaxed_no_log(arch_counter_base + CNTV_CTL); + + if (ctrl & ARCH_TIMER_CTRL_ENABLE) { + *lo = readl_relaxed_no_log(arch_counter_base + CNTCVAL_LO); + *hi = readl_relaxed_no_log(arch_counter_base + CNTCVAL_HI); + } +} + static u64 arch_counter_get_cntvct_mem(void) { u32 vct_lo, vct_hi, tmp_hi; diff --git a/include/clocksource/arm_arch_timer.h b/include/clocksource/arm_arch_timer.h index 1d68d5613dae..c248890fa131 100644 --- a/include/clocksource/arm_arch_timer.h +++ b/include/clocksource/arm_arch_timer.h @@ -86,6 +86,7 @@ extern u32 arch_timer_get_rate(void); extern u64 (*arch_timer_read_counter)(void); extern struct arch_timer_kvm_info *arch_timer_get_kvm_info(void); extern bool arch_timer_evtstrm_available(void); +extern void arch_timer_mem_get_cval(u32 *lo, u32 *hi); #else @@ -104,6 +105,10 @@ static inline bool arch_timer_evtstrm_available(void) return false; } +static void arch_timer_mem_get_cval(u32 *lo, u32 *hi) +{ + *lo = *hi = ~0U; +} #endif #endif