|
@@ -66,20 +66,6 @@
|
|
|
#define OMAP3_32K_SOURCE "omap_32k_fck"
|
|
|
#define OMAP4_32K_SOURCE "sys_32k_ck"
|
|
|
|
|
|
-#ifdef CONFIG_OMAP_32K_TIMER
|
|
|
-#define OMAP2_CLKEV_SOURCE OMAP2_32K_SOURCE
|
|
|
-#define OMAP3_CLKEV_SOURCE OMAP3_32K_SOURCE
|
|
|
-#define OMAP4_CLKEV_SOURCE OMAP4_32K_SOURCE
|
|
|
-#define OMAP3_SECURE_TIMER 12
|
|
|
-#define TIMER_PROP_SECURE "ti,timer-secure"
|
|
|
-#else
|
|
|
-#define OMAP2_CLKEV_SOURCE OMAP2_MPU_SOURCE
|
|
|
-#define OMAP3_CLKEV_SOURCE OMAP3_MPU_SOURCE
|
|
|
-#define OMAP4_CLKEV_SOURCE OMAP4_MPU_SOURCE
|
|
|
-#define OMAP3_SECURE_TIMER 1
|
|
|
-#define TIMER_PROP_SECURE "ti,timer-alwon"
|
|
|
-#endif
|
|
|
-
|
|
|
#define REALTIME_COUNTER_BASE 0x48243200
|
|
|
#define INCREMENTER_NUMERATOR_OFFSET 0x10
|
|
|
#define INCREMENTER_DENUMERATOR_RELOAD_OFFSET 0x14
|
|
@@ -400,7 +386,6 @@ static u32 notrace dmtimer_read_sched_clock(void)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_OMAP_32K_TIMER
|
|
|
static struct of_device_id omap_counter_match[] __initdata = {
|
|
|
{ .compatible = "ti,omap-counter32k", },
|
|
|
{ }
|
|
@@ -466,12 +451,6 @@ static int __init omap2_sync32k_clocksource_init(void)
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
-#else
|
|
|
-static inline int omap2_sync32k_clocksource_init(void)
|
|
|
-{
|
|
|
- return -ENODEV;
|
|
|
-}
|
|
|
-#endif
|
|
|
|
|
|
static void __init omap2_gptimer_clocksource_init(int gptimer_id,
|
|
|
const char *fck_source)
|
|
@@ -497,25 +476,6 @@ static void __init omap2_gptimer_clocksource_init(int gptimer_id,
|
|
|
gptimer_id, clksrc.rate);
|
|
|
}
|
|
|
|
|
|
-static void __init omap2_clocksource_init(int gptimer_id,
|
|
|
- const char *fck_source)
|
|
|
-{
|
|
|
- /*
|
|
|
- * First give preference to kernel parameter configuration
|
|
|
- * by user (clocksource="gp_timer").
|
|
|
- *
|
|
|
- * In case of missing kernel parameter for clocksource,
|
|
|
- * first check for availability for 32k-sync timer, in case
|
|
|
- * of failure in finding 32k_counter module or registering
|
|
|
- * it as clocksource, execution will fallback to gp-timer.
|
|
|
- */
|
|
|
- if (use_gptimer_clksrc == true)
|
|
|
- omap2_gptimer_clocksource_init(gptimer_id, fck_source);
|
|
|
- else if (omap2_sync32k_clocksource_init())
|
|
|
- /* Fall back to gp-timer code */
|
|
|
- omap2_gptimer_clocksource_init(gptimer_id, fck_source);
|
|
|
-}
|
|
|
-
|
|
|
#ifdef CONFIG_SOC_HAS_REALTIME_COUNTER
|
|
|
/*
|
|
|
* The realtime counter also called master counter, is a free-running
|
|
@@ -594,52 +554,62 @@ static inline void __init realtime_counter_init(void)
|
|
|
{}
|
|
|
#endif
|
|
|
|
|
|
-#define OMAP_SYS_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop, \
|
|
|
+#define OMAP_SYS_GP_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop, \
|
|
|
+ clksrc_nr, clksrc_src) \
|
|
|
+static void __init omap##name##_gptimer_timer_init(void) \
|
|
|
+{ \
|
|
|
+ omap_dmtimer_init(); \
|
|
|
+ omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \
|
|
|
+ omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src); \
|
|
|
+}
|
|
|
+
|
|
|
+#define OMAP_SYS_32K_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop, \
|
|
|
clksrc_nr, clksrc_src) \
|
|
|
-static void __init omap##name##_timer_init(void) \
|
|
|
+static void __init omap##name##_sync32k_timer_init(void) \
|
|
|
{ \
|
|
|
omap_dmtimer_init(); \
|
|
|
omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \
|
|
|
- omap2_clocksource_init((clksrc_nr), clksrc_src); \
|
|
|
+ /* Enable the use of clocksource="gp_timer" kernel parameter */ \
|
|
|
+ if (use_gptimer_clksrc) \
|
|
|
+ omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src);\
|
|
|
+ else \
|
|
|
+ omap2_sync32k_clocksource_init(); \
|
|
|
}
|
|
|
|
|
|
-#define OMAP_SYS_TIMER(name) \
|
|
|
+#define OMAP_SYS_TIMER(name, clksrc) \
|
|
|
struct sys_timer omap##name##_timer = { \
|
|
|
- .init = omap##name##_timer_init, \
|
|
|
+ .init = omap##name##_##clksrc##_timer_init, \
|
|
|
};
|
|
|
|
|
|
#ifdef CONFIG_ARCH_OMAP2
|
|
|
-OMAP_SYS_TIMER_INIT(2, 1, OMAP2_CLKEV_SOURCE, "ti,timer-alwon",
|
|
|
- 2, OMAP2_MPU_SOURCE)
|
|
|
-OMAP_SYS_TIMER(2)
|
|
|
-#endif
|
|
|
+OMAP_SYS_32K_TIMER_INIT(2, 1, OMAP2_32K_SOURCE, "ti,timer-alwon",
|
|
|
+ 2, OMAP2_MPU_SOURCE);
|
|
|
+OMAP_SYS_TIMER(2, sync32k);
|
|
|
+#endif /* CONFIG_ARCH_OMAP2 */
|
|
|
|
|
|
#ifdef CONFIG_ARCH_OMAP3
|
|
|
-OMAP_SYS_TIMER_INIT(3, 1, OMAP3_CLKEV_SOURCE, "ti,timer-alwon",
|
|
|
- 2, OMAP3_MPU_SOURCE)
|
|
|
-OMAP_SYS_TIMER(3)
|
|
|
-OMAP_SYS_TIMER_INIT(3_secure, OMAP3_SECURE_TIMER, OMAP3_CLKEV_SOURCE,
|
|
|
- TIMER_PROP_SECURE, 2, OMAP3_MPU_SOURCE)
|
|
|
-OMAP_SYS_TIMER(3_secure)
|
|
|
-#endif
|
|
|
+OMAP_SYS_32K_TIMER_INIT(3, 1, OMAP3_32K_SOURCE, "ti,timer-alwon",
|
|
|
+ 2, OMAP3_MPU_SOURCE);
|
|
|
+OMAP_SYS_TIMER(3, sync32k);
|
|
|
+OMAP_SYS_32K_TIMER_INIT(3_secure, 12, OMAP3_32K_SOURCE, "ti,timer-secure",
|
|
|
+ 2, OMAP3_MPU_SOURCE);
|
|
|
+OMAP_SYS_TIMER(3_secure, sync32k);
|
|
|
+#endif /* CONFIG_ARCH_OMAP3 */
|
|
|
|
|
|
#ifdef CONFIG_SOC_AM33XX
|
|
|
-OMAP_SYS_TIMER_INIT(3_am33xx, 1, OMAP4_MPU_SOURCE, "ti,timer-alwon",
|
|
|
- 2, OMAP4_MPU_SOURCE)
|
|
|
-OMAP_SYS_TIMER(3_am33xx)
|
|
|
-#endif
|
|
|
+OMAP_SYS_GP_TIMER_INIT(3_am33xx, 1, OMAP4_MPU_SOURCE, "ti,timer-alwon",
|
|
|
+ 2, OMAP4_MPU_SOURCE);
|
|
|
+OMAP_SYS_TIMER(3_am33xx, gptimer);
|
|
|
+#endif /* CONFIG_SOC_AM33XX */
|
|
|
|
|
|
#ifdef CONFIG_ARCH_OMAP4
|
|
|
+OMAP_SYS_32K_TIMER_INIT(4, 1, OMAP4_32K_SOURCE, "ti,timer-alwon",
|
|
|
+ 2, OMAP4_MPU_SOURCE);
|
|
|
#ifdef CONFIG_LOCAL_TIMERS
|
|
|
-static DEFINE_TWD_LOCAL_TIMER(twd_local_timer,
|
|
|
- OMAP44XX_LOCAL_TWD_BASE, 29);
|
|
|
-#endif
|
|
|
-
|
|
|
-static void __init omap4_timer_init(void)
|
|
|
+static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, OMAP44XX_LOCAL_TWD_BASE, 29);
|
|
|
+static void __init omap4_local_timer_init(void)
|
|
|
{
|
|
|
- omap2_gp_clockevent_init(1, OMAP4_CLKEV_SOURCE, "ti,timer-alwon");
|
|
|
- omap2_clocksource_init(2, OMAP4_MPU_SOURCE);
|
|
|
-#ifdef CONFIG_LOCAL_TIMERS
|
|
|
+ omap4_sync32k_timer_init();
|
|
|
/* Local timers are not supprted on OMAP4430 ES1.0 */
|
|
|
if (omap_rev() != OMAP4430_REV_ES1_0) {
|
|
|
int err;
|
|
@@ -653,26 +623,32 @@ static void __init omap4_timer_init(void)
|
|
|
if (err)
|
|
|
pr_err("twd_local_timer_register failed %d\n", err);
|
|
|
}
|
|
|
-#endif
|
|
|
}
|
|
|
-OMAP_SYS_TIMER(4)
|
|
|
-#endif
|
|
|
+#else /* CONFIG_LOCAL_TIMERS */
|
|
|
+static inline void omap4_local_timer_init(void)
|
|
|
+{
|
|
|
+ omap4_sync32_timer_init();
|
|
|
+}
|
|
|
+#endif /* CONFIG_LOCAL_TIMERS */
|
|
|
+OMAP_SYS_TIMER(4, local);
|
|
|
+#endif /* CONFIG_ARCH_OMAP4 */
|
|
|
|
|
|
#ifdef CONFIG_SOC_OMAP5
|
|
|
-static void __init omap5_timer_init(void)
|
|
|
+OMAP_SYS_32K_TIMER_INIT(5, 1, OMAP4_32K_SOURCE, "ti,timer-alwon",
|
|
|
+ 2, OMAP4_MPU_SOURCE);
|
|
|
+static void __init omap5_realtime_timer_init(void)
|
|
|
{
|
|
|
int err;
|
|
|
|
|
|
- omap2_gp_clockevent_init(1, OMAP4_CLKEV_SOURCE, "ti,timer-alwon");
|
|
|
- omap2_clocksource_init(2, OMAP4_MPU_SOURCE);
|
|
|
+ omap5_sync32k_timer_init();
|
|
|
realtime_counter_init();
|
|
|
|
|
|
err = arch_timer_of_register();
|
|
|
if (err)
|
|
|
pr_err("%s: arch_timer_register failed %d\n", __func__, err);
|
|
|
}
|
|
|
-OMAP_SYS_TIMER(5)
|
|
|
-#endif
|
|
|
+OMAP_SYS_TIMER(5, realtime);
|
|
|
+#endif /* CONFIG_SOC_OMAP5 */
|
|
|
|
|
|
/**
|
|
|
* omap_timer_init - build and register timer device with an
|