|
@@ -262,20 +262,22 @@ static void __init omap2_gp_clockevent_init(int gptimer_id,
|
|
|
* sync counter. See clocksource setup in plat-omap/counter_32k.c
|
|
|
*/
|
|
|
|
|
|
-static void __init omap2_gp_clocksource_init(void)
|
|
|
+static void __init omap2_gp_clocksource_init(int unused, const char *dummy)
|
|
|
{
|
|
|
omap_init_clocksource_32k();
|
|
|
}
|
|
|
|
|
|
#else
|
|
|
+
|
|
|
+static struct omap_dm_timer clksrc;
|
|
|
+
|
|
|
/*
|
|
|
* clocksource
|
|
|
*/
|
|
|
static DEFINE_CLOCK_DATA(cd);
|
|
|
-static struct omap_dm_timer *gpt_clocksource;
|
|
|
static cycle_t clocksource_read_cycles(struct clocksource *cs)
|
|
|
{
|
|
|
- return (cycle_t)omap_dm_timer_read_counter(gpt_clocksource);
|
|
|
+ return (cycle_t)__omap_dm_timer_read_counter(clksrc.io_base, 1);
|
|
|
}
|
|
|
|
|
|
static struct clocksource clocksource_gpt = {
|
|
@@ -290,43 +292,48 @@ static void notrace dmtimer_update_sched_clock(void)
|
|
|
{
|
|
|
u32 cyc;
|
|
|
|
|
|
- cyc = omap_dm_timer_read_counter(gpt_clocksource);
|
|
|
+ cyc = __omap_dm_timer_read_counter(clksrc.io_base, 1);
|
|
|
|
|
|
update_sched_clock(&cd, cyc, (u32)~0);
|
|
|
}
|
|
|
|
|
|
-/* Setup free-running counter for clocksource */
|
|
|
-static void __init omap2_gp_clocksource_init(void)
|
|
|
+unsigned long long notrace sched_clock(void)
|
|
|
{
|
|
|
- static struct omap_dm_timer *gpt;
|
|
|
- u32 tick_rate;
|
|
|
- static char err1[] __initdata = KERN_ERR
|
|
|
- "%s: failed to request dm-timer\n";
|
|
|
- static char err2[] __initdata = KERN_ERR
|
|
|
- "%s: can't register clocksource!\n";
|
|
|
+ u32 cyc = 0;
|
|
|
|
|
|
- gpt = omap_dm_timer_request();
|
|
|
- if (!gpt)
|
|
|
- printk(err1, clocksource_gpt.name);
|
|
|
- gpt_clocksource = gpt;
|
|
|
+ if (clksrc.reserved)
|
|
|
+ cyc = __omap_dm_timer_read_counter(clksrc.io_base, 1);
|
|
|
|
|
|
- omap_dm_timer_set_source(gpt, OMAP_TIMER_SRC_SYS_CLK);
|
|
|
- tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gpt));
|
|
|
+ return cyc_to_sched_clock(&cd, cyc, (u32)~0);
|
|
|
+}
|
|
|
+
|
|
|
+/* Setup free-running counter for clocksource */
|
|
|
+static void __init omap2_gp_clocksource_init(int gptimer_id,
|
|
|
+ const char *fck_source)
|
|
|
+{
|
|
|
+ int res;
|
|
|
+
|
|
|
+ res = omap_dm_timer_init_one(&clksrc, gptimer_id, fck_source);
|
|
|
+ BUG_ON(res);
|
|
|
|
|
|
- omap_dm_timer_set_load_start(gpt, 1, 0);
|
|
|
+ pr_info("OMAP clocksource: GPTIMER%d at %lu Hz\n",
|
|
|
+ gptimer_id, clksrc.rate);
|
|
|
|
|
|
- init_sched_clock(&cd, dmtimer_update_sched_clock, 32, tick_rate);
|
|
|
+ __omap_dm_timer_load_start(clksrc.io_base, OMAP_TIMER_CTRL_ST, 0, 1);
|
|
|
+ init_sched_clock(&cd, dmtimer_update_sched_clock, 32, clksrc.rate);
|
|
|
|
|
|
- if (clocksource_register_hz(&clocksource_gpt, tick_rate))
|
|
|
- printk(err2, clocksource_gpt.name);
|
|
|
+ if (clocksource_register_hz(&clocksource_gpt, clksrc.rate))
|
|
|
+ pr_err("Could not register clocksource %s\n",
|
|
|
+ clocksource_gpt.name);
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
-#define OMAP_SYS_TIMER_INIT(name, clkev_nr, clkev_src) \
|
|
|
+#define OMAP_SYS_TIMER_INIT(name, clkev_nr, clkev_src, \
|
|
|
+ clksrc_nr, clksrc_src) \
|
|
|
static void __init omap##name##_timer_init(void) \
|
|
|
{ \
|
|
|
omap2_gp_clockevent_init((clkev_nr), clkev_src); \
|
|
|
- omap2_gp_clocksource_init(); \
|
|
|
+ omap2_gp_clocksource_init((clksrc_nr), clksrc_src); \
|
|
|
}
|
|
|
|
|
|
#define OMAP_SYS_TIMER(name) \
|
|
@@ -335,14 +342,15 @@ struct sys_timer omap##name##_timer = { \
|
|
|
};
|
|
|
|
|
|
#ifdef CONFIG_ARCH_OMAP2
|
|
|
-OMAP_SYS_TIMER_INIT(2, 1, OMAP2_CLKEV_SOURCE)
|
|
|
+OMAP_SYS_TIMER_INIT(2, 1, OMAP2_CLKEV_SOURCE, 2, OMAP2_MPU_SOURCE)
|
|
|
OMAP_SYS_TIMER(2)
|
|
|
#endif
|
|
|
|
|
|
#ifdef CONFIG_ARCH_OMAP3
|
|
|
-OMAP_SYS_TIMER_INIT(3, 1, OMAP3_CLKEV_SOURCE)
|
|
|
+OMAP_SYS_TIMER_INIT(3, 1, OMAP3_CLKEV_SOURCE, 2, OMAP3_MPU_SOURCE)
|
|
|
OMAP_SYS_TIMER(3)
|
|
|
-OMAP_SYS_TIMER_INIT(3_secure, OMAP3_SECURE_TIMER, OMAP3_CLKEV_SOURCE)
|
|
|
+OMAP_SYS_TIMER_INIT(3_secure, OMAP3_SECURE_TIMER, OMAP3_CLKEV_SOURCE,
|
|
|
+ 2, OMAP3_MPU_SOURCE)
|
|
|
OMAP_SYS_TIMER(3_secure)
|
|
|
#endif
|
|
|
|
|
@@ -354,7 +362,7 @@ static void __init omap4_timer_init(void)
|
|
|
BUG_ON(!twd_base);
|
|
|
#endif
|
|
|
omap2_gp_clockevent_init(1, OMAP4_CLKEV_SOURCE);
|
|
|
- omap2_gp_clocksource_init();
|
|
|
+ omap2_gp_clocksource_init(2, OMAP4_MPU_SOURCE);
|
|
|
}
|
|
|
OMAP_SYS_TIMER(4)
|
|
|
#endif
|