30 #include <linux/time.h>
38 #include <linux/slab.h>
57 #define OMAP2_MPU_SOURCE "sys_ck"
58 #define OMAP3_MPU_SOURCE OMAP2_MPU_SOURCE
59 #define OMAP4_MPU_SOURCE "sys_clkin_ck"
60 #define OMAP2_32K_SOURCE "func_32k_ck"
61 #define OMAP3_32K_SOURCE "omap_32k_fck"
62 #define OMAP4_32K_SOURCE "sys_32k_ck"
64 #ifdef CONFIG_OMAP_32K_TIMER
65 #define OMAP2_CLKEV_SOURCE OMAP2_32K_SOURCE
66 #define OMAP3_CLKEV_SOURCE OMAP3_32K_SOURCE
67 #define OMAP4_CLKEV_SOURCE OMAP4_32K_SOURCE
68 #define OMAP3_SECURE_TIMER 12
70 #define OMAP2_CLKEV_SOURCE OMAP2_MPU_SOURCE
71 #define OMAP3_CLKEV_SOURCE OMAP3_MPU_SOURCE
72 #define OMAP4_CLKEV_SOURCE OMAP4_MPU_SOURCE
73 #define OMAP3_SECURE_TIMER 1
76 #define REALTIME_COUNTER_BASE 0x48243200
77 #define INCREMENTER_NUMERATOR_OFFSET 0x10
78 #define INCREMENTER_DENUMERATOR_RELOAD_OFFSET 0x14
79 #define NUMERATOR_DENUMERATOR_MASK 0xfffff000
84 static struct clock_event_device clockevent_gpt;
88 struct clock_event_device *
evt = &clockevent_gpt;
92 evt->event_handler(evt);
96 static struct irqaction omap2_gp_timer_irq = {
99 .handler = omap2_gp_timer_interrupt,
102 static int omap2_gp_timer_set_next_event(
unsigned long cycles,
103 struct clock_event_device *evt)
106 0xffffffff - cycles, 1);
111 static void omap2_gp_timer_set_mode(
enum clock_event_mode
mode,
112 struct clock_event_device *evt)
116 __omap_dm_timer_stop(&clkev, 1, clkev.rate);
119 case CLOCK_EVT_MODE_PERIODIC:
120 period = clkev.rate /
HZ;
124 0xffffffff - period, 1);
125 __omap_dm_timer_load_start(&clkev,
127 0xffffffff - period, 1);
129 case CLOCK_EVT_MODE_ONESHOT:
131 case CLOCK_EVT_MODE_UNUSED:
132 case CLOCK_EVT_MODE_SHUTDOWN:
133 case CLOCK_EVT_MODE_RESUME:
138 static struct clock_event_device clockevent_gpt = {
140 .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
143 .set_next_event = omap2_gp_timer_set_next_event,
144 .set_mode = omap2_gp_timer_set_mode,
149 const char *fck_source)
158 sprintf(name,
"timer%d", gptimer_id);
167 timer->
irq = irq_rsrc.start;
173 size = mem_rsrc.end - mem_rsrc.start;
182 if (IS_ERR(timer->
fclk))
190 if (gptimer_id != 12) {
197 res = __omap_dm_timer_set_source(timer->
fclk, src);
200 __func__, gptimer_id);
204 __omap_dm_timer_init_regs(timer);
205 __omap_dm_timer_reset(timer, 1, 1);
215 static void __init omap2_gp_clockevent_init(
int gptimer_id,
216 const char *fck_source)
220 res = omap_dm_timer_init_one(&clkev, gptimer_id, fck_source);
223 omap2_gp_timer_irq.
dev_id = &clkev;
224 setup_irq(clkev.irq, &omap2_gp_timer_irq);
229 clockevent_gpt.shift);
230 clockevent_gpt.max_delta_ns =
232 clockevent_gpt.min_delta_ns =
240 pr_info(
"OMAP clockevent source: GPTIMER%d at %lu Hz\n",
241 gptimer_id, clkev.rate);
246 static bool use_gptimer_clksrc;
253 return (
cycle_t)__omap_dm_timer_read_counter(&clksrc, 1);
259 .read = clocksource_read_cycles,
264 static u32 notrace dmtimer_read_sched_clock(
void)
267 return __omap_dm_timer_read_counter(&clksrc, 1);
272 #ifdef CONFIG_OMAP_32K_TIMER
274 static int __init omap2_sync32k_clocksource_init(
void)
279 const char *oh_name =
"counter_32k";
292 pr_warn(
"%s: failed to get counter_32k resource\n", __func__);
298 pr_warn(
"%s: failed to enable counter_32k module (%d)\n",
305 pr_warn(
"%s: failed to initialize counter_32k as a clocksource (%d)\n",
313 static inline int omap2_sync32k_clocksource_init(
void)
319 static void __init omap2_gptimer_clocksource_init(
int gptimer_id,
320 const char *fck_source)
324 res = omap_dm_timer_init_one(&clksrc, gptimer_id, fck_source);
327 __omap_dm_timer_load_start(&clksrc,
331 if (clocksource_register_hz(&clocksource_gpt, clksrc.rate))
332 pr_err(
"Could not register clocksource %s\n",
333 clocksource_gpt.
name);
335 pr_info(
"OMAP clocksource: GPTIMER%d at %lu Hz\n",
336 gptimer_id, clksrc.rate);
339 static void __init omap2_clocksource_init(
int gptimer_id,
340 const char *fck_source)
351 if (use_gptimer_clksrc ==
true)
352 omap2_gptimer_clocksource_init(gptimer_id, fck_source);
353 else if (omap2_sync32k_clocksource_init())
355 omap2_gptimer_clocksource_init(gptimer_id, fck_source);
358 #ifdef CONFIG_SOC_HAS_REALTIME_COUNTER
368 static void __init realtime_counter_init(
void)
377 pr_err(
"%s: ioremap failed\n", __func__);
381 if (IS_ERR(sys_clk)) {
382 pr_err(
"%s: failed to get system clock handle\n", __func__);
432 static inline void __init realtime_counter_init(
void)
436 #define OMAP_SYS_TIMER_INIT(name, clkev_nr, clkev_src, \
437 clksrc_nr, clksrc_src) \
438 static void __init omap##name##_timer_init(void) \
440 omap2_gp_clockevent_init((clkev_nr), clkev_src); \
441 omap2_clocksource_init((clksrc_nr), clksrc_src); \
444 #define OMAP_SYS_TIMER(name) \
445 struct sys_timer omap##name##_timer = { \
446 .init = omap##name##_timer_init, \
449 #ifdef CONFIG_ARCH_OMAP2
454 #ifdef CONFIG_ARCH_OMAP3
462 #ifdef CONFIG_SOC_AM33XX
467 #ifdef CONFIG_ARCH_OMAP4
468 #ifdef CONFIG_LOCAL_TIMERS
473 static void __init omap4_timer_init(
void)
477 #ifdef CONFIG_LOCAL_TIMERS
482 if (of_have_populated_dt()) {
483 twd_local_timer_of_register();
489 pr_err(
"twd_local_timer_register failed %d\n", err);
496 #ifdef CONFIG_SOC_OMAP5
497 static void __init omap5_timer_init(
void)
503 realtime_counter_init();
507 pr_err(
"%s: arch_timer_register failed %d\n", __func__, err);
528 char *name =
"omap_timer";
543 pr_err(
"%s: No memory for [%s]\n", __func__, oh->
name);
566 pr_err(
"%s: Can't build omap_device for %s: %s.\n",
567 __func__, name, oh->
name);
582 static int __init omap2_dm_timer_init(
void)
588 pr_err(
"%s: device registration failed.\n", __func__);
605 static int __init omap2_override_clocksource(
char *
str)
614 if (!
strcmp(str,
"gp_timer"))
615 use_gptimer_clksrc =
true;
619 early_param(
"clocksource", omap2_override_clocksource);