12 #include <linux/kernel.h>
14 #include <linux/device.h>
23 #include <asm/cputype.h>
24 #include <asm/delay.h>
30 static unsigned long arch_timer_rate;
42 static struct clock_event_device
__percpu **arch_timer_evt;
45 static bool arch_timer_use_virtual =
true;
51 #define ARCH_TIMER_CTRL_ENABLE (1 << 0)
52 #define ARCH_TIMER_CTRL_IT_MASK (1 << 1)
53 #define ARCH_TIMER_CTRL_IT_STAT (1 << 2)
55 #define ARCH_TIMER_REG_CTRL 0
56 #define ARCH_TIMER_REG_FREQ 1
57 #define ARCH_TIMER_REG_TVAL 2
59 #define ARCH_TIMER_PHYS_ACCESS 0
60 #define ARCH_TIMER_VIRT_ACCESS 1
67 static inline void arch_timer_reg_write(
const int access,
const int reg,
u32 val)
72 asm volatile(
"mcr p15, 0, %0, c14, c2, 1" : :
"r" (
val));
75 asm volatile(
"mcr p15, 0, %0, c14, c2, 0" : :
"r" (
val));
83 asm volatile(
"mcr p15, 0, %0, c14, c3, 1" : :
"r" (
val));
86 asm volatile(
"mcr p15, 0, %0, c14, c3, 0" : :
"r" (
val));
94 static inline u32 arch_timer_reg_read(
const int access,
const int reg)
101 asm volatile(
"mrc p15, 0, %0, c14, c2, 1" :
"=r" (
val));
104 asm volatile(
"mrc p15, 0, %0, c14, c2, 0" :
"=r" (
val));
107 asm volatile(
"mrc p15, 0, %0, c14, c0, 0" :
"=r" (
val));
115 asm volatile(
"mrc p15, 0, %0, c14, c3, 1" :
"=r" (
val));
118 asm volatile(
"mrc p15, 0, %0, c14, c3, 0" :
"=r" (
val));
126 static inline cycle_t arch_timer_counter_read(
const int access)
131 asm volatile(
"mrrc p15, 0, %Q0, %R0, c14" :
"=r" (cval));
134 asm volatile(
"mrrc p15, 1, %Q0, %R0, c14" :
"=r" (cval));
139 static inline cycle_t arch_counter_get_cntpct(
void)
144 static inline cycle_t arch_counter_get_cntvct(
void)
149 static irqreturn_t inline timer_handler(
const int access,
150 struct clock_event_device *
evt)
157 evt->event_handler(evt);
166 struct clock_event_device *evt = *(
struct clock_event_device **)dev_id;
173 struct clock_event_device *evt = *(
struct clock_event_device **)dev_id;
178 static inline void timer_set_mode(
const int access,
int mode)
182 case CLOCK_EVT_MODE_UNUSED:
183 case CLOCK_EVT_MODE_SHUTDOWN:
193 static void arch_timer_set_mode_virt(
enum clock_event_mode mode,
194 struct clock_event_device *
clk)
199 static void arch_timer_set_mode_phys(
enum clock_event_mode mode,
200 struct clock_event_device *
clk)
205 static inline void set_next_event(
const int access,
unsigned long evt)
215 static int arch_timer_set_next_event_virt(
unsigned long evt,
216 struct clock_event_device *
unused)
222 static int arch_timer_set_next_event_phys(
unsigned long evt,
223 struct clock_event_device *
unused)
229 static int __cpuinit arch_timer_setup(
struct clock_event_device *
clk)
231 clk->features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_C3STOP;
232 clk->name =
"arch_sys_timer";
234 if (arch_timer_use_virtual) {
235 clk->irq = arch_timer_ppi[
VIRT_PPI];
236 clk->set_mode = arch_timer_set_mode_virt;
237 clk->set_next_event = arch_timer_set_next_event_virt;
240 clk->set_mode = arch_timer_set_mode_phys;
241 clk->set_next_event = arch_timer_set_next_event_phys;
244 clk->set_mode(CLOCK_EVT_MODE_SHUTDOWN,
NULL);
251 if (arch_timer_use_virtual)
263 static int local_timer_is_architected(
void)
269 static int arch_timer_available(
void)
273 if (!local_timer_is_architected())
276 if (arch_timer_rate == 0) {
282 pr_warn(
"Architected timer frequency not available\n");
286 arch_timer_rate =
freq;
289 pr_info_once(
"Architected local timer running at %lu.%02luMHz (%s).\n",
290 arch_timer_rate / 1000000, (arch_timer_rate / 10000) % 100,
291 arch_timer_use_virtual ?
"virt" :
"phys");
295 static u32 notrace arch_counter_get_cntpct32(
void)
307 static u32 notrace arch_counter_get_cntvct32(
void)
309 cycle_t cnt = arch_counter_get_cntvct();
325 return arch_counter_get_cntpct();
328 static unsigned long arch_timer_read_current_timer(
void)
330 return arch_counter_get_cntpct();
339 return arch_counter_get_cntpct();
343 .name =
"arch_sys_counter",
345 .read = arch_counter_read,
351 .
read = arch_counter_read_cc,
362 static void __cpuinit arch_timer_stop(
struct clock_event_device *clk)
364 pr_debug(
"arch_timer_teardown disable IRQ%d cpu #%d\n",
367 if (arch_timer_use_virtual)
375 clk->set_mode(CLOCK_EVT_MODE_UNUSED, clk);
379 .setup = arch_timer_setup,
380 .stop = arch_timer_stop,
383 static struct clock_event_device arch_timer_global_evt;
385 static int __init arch_timer_register(
void)
390 err = arch_timer_available();
394 arch_timer_evt =
alloc_percpu(
struct clock_event_device *);
395 if (!arch_timer_evt) {
400 clocksource_register_hz(&clocksource_counter, arch_timer_rate);
401 cyclecounter.
mult = clocksource_counter.
mult;
402 cyclecounter.
shift = clocksource_counter.
shift;
404 arch_counter_get_cntpct());
406 if (arch_timer_use_virtual) {
409 "arch_timer", arch_timer_evt);
413 "arch_timer", arch_timer_evt);
417 "arch_timer", arch_timer_evt);
425 pr_err(
"arch_timer: can't register interrupt %d (%d)\n",
430 err = local_timer_register(&arch_timer_ops);
438 arch_timer_global_evt.cpumask =
cpumask_of(0);
439 err = arch_timer_setup(&arch_timer_global_evt);
445 arch_delay_timer.read_current_timer = &arch_timer_read_current_timer;
446 arch_delay_timer.freq = arch_timer_rate;
451 if (arch_timer_use_virtual)
456 if (arch_timer_ppi[PHYS_NONSECURE_PPI])
468 { .compatible =
"arm,armv7-timer", },
480 pr_err(
"arch_timer: can't find DT node\n");
485 if (!of_property_read_u32(np,
"clock-frequency", &freq))
486 arch_timer_rate =
freq;
496 arch_timer_use_virtual =
false;
499 !arch_timer_ppi[PHYS_NONSECURE_PPI]) {
500 pr_warn(
"arch_timer: No interrupt available, giving up\n");
505 return arch_timer_register();
513 err = arch_timer_available();
517 if (arch_timer_use_virtual)
518 cnt32 = arch_counter_get_cntvct32;
520 cnt32 = arch_counter_get_cntpct32;