提交 11a0186f 编写于 作者: T Tony Lindgren

omap2+: Reserve clocksource and timesource and initialize dmtimer later

There's no need to initialize the dmtimer framework early.
Just mark the clocksource and timesource as reserved, and
initialize dmtimer with an arch_initcall.
Signed-off-by: NTony Lindgren <tony@atomide.com>
Reviewed-by: NKevin Hilman <khilman@ti.com>
上级 98e182a2
...@@ -183,10 +183,6 @@ static __init void omap_init_32k_timer(void) ...@@ -183,10 +183,6 @@ static __init void omap_init_32k_timer(void)
bool __init omap_32k_timer_init(void) bool __init omap_32k_timer_init(void)
{ {
omap_init_clocksource_32k(); omap_init_clocksource_32k();
#ifdef CONFIG_OMAP_DM_TIMER
omap_dm_timer_init();
#endif
omap_init_32k_timer(); omap_init_32k_timer();
return true; return true;
......
...@@ -69,6 +69,8 @@ ...@@ -69,6 +69,8 @@
/* MAX_GPTIMER_ID: number of GPTIMERs on the chip */ /* MAX_GPTIMER_ID: number of GPTIMERs on the chip */
#define MAX_GPTIMER_ID 12 #define MAX_GPTIMER_ID 12
u32 sys_timer_reserved;
/* Clockevent code */ /* Clockevent code */
static struct omap_dm_timer clkev; static struct omap_dm_timer clkev;
...@@ -195,6 +197,8 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer, ...@@ -195,6 +197,8 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,
omap_hwmod_enable(oh); omap_hwmod_enable(oh);
sys_timer_reserved |= (1 << (gptimer_id - 1));
if (gptimer_id != 12) { if (gptimer_id != 12) {
struct clk *src; struct clk *src;
...@@ -321,7 +325,6 @@ static void __init omap2_gp_clocksource_init(void) ...@@ -321,7 +325,6 @@ static void __init omap2_gp_clocksource_init(void)
#define OMAP_SYS_TIMER_INIT(name, clkev_nr, clkev_src) \ #define OMAP_SYS_TIMER_INIT(name, clkev_nr, clkev_src) \
static void __init omap##name##_timer_init(void) \ static void __init omap##name##_timer_init(void) \
{ \ { \
omap_dm_timer_init(); \
omap2_gp_clockevent_init((clkev_nr), clkev_src); \ omap2_gp_clockevent_init((clkev_nr), clkev_src); \
omap2_gp_clocksource_init(); \ omap2_gp_clocksource_init(); \
} }
...@@ -350,7 +353,6 @@ static void __init omap4_timer_init(void) ...@@ -350,7 +353,6 @@ static void __init omap4_timer_init(void)
twd_base = ioremap(OMAP44XX_LOCAL_TWD_BASE, SZ_256); twd_base = ioremap(OMAP44XX_LOCAL_TWD_BASE, SZ_256);
BUG_ON(!twd_base); BUG_ON(!twd_base);
#endif #endif
omap_dm_timer_init();
omap2_gp_clockevent_init(1, OMAP4_CLKEV_SOURCE); omap2_gp_clockevent_init(1, OMAP4_CLKEV_SOURCE);
omap2_gp_clocksource_init(); omap2_gp_clocksource_init();
} }
......
...@@ -572,7 +572,7 @@ int omap_dm_timers_active(void) ...@@ -572,7 +572,7 @@ int omap_dm_timers_active(void)
} }
EXPORT_SYMBOL_GPL(omap_dm_timers_active); EXPORT_SYMBOL_GPL(omap_dm_timers_active);
int __init omap_dm_timer_init(void) static int __init omap_dm_timer_init(void)
{ {
struct omap_dm_timer *timer; struct omap_dm_timer *timer;
int i, map_size = SZ_8K; /* Module 4KB + L4 4KB except on omap1 */ int i, map_size = SZ_8K; /* Module 4KB + L4 4KB except on omap1 */
...@@ -625,8 +625,16 @@ int __init omap_dm_timer_init(void) ...@@ -625,8 +625,16 @@ int __init omap_dm_timer_init(void)
sprintf(clk_name, "gpt%d_fck", i + 1); sprintf(clk_name, "gpt%d_fck", i + 1);
timer->fclk = clk_get(NULL, clk_name); timer->fclk = clk_get(NULL, clk_name);
} }
/* One or two timers may be set up early for sys_timer */
if (sys_timer_reserved & (1 << i)) {
timer->reserved = 1;
timer->posted = 1;
}
#endif #endif
} }
return 0; return 0;
} }
arch_initcall(omap_dm_timer_init);
...@@ -61,8 +61,6 @@ ...@@ -61,8 +61,6 @@
struct omap_dm_timer; struct omap_dm_timer;
struct clk; struct clk;
int omap_dm_timer_init(void);
struct omap_dm_timer *omap_dm_timer_request(void); struct omap_dm_timer *omap_dm_timer_request(void);
struct omap_dm_timer *omap_dm_timer_request_specific(int timer_id); struct omap_dm_timer *omap_dm_timer_request_specific(int timer_id);
void omap_dm_timer_free(struct omap_dm_timer *timer); void omap_dm_timer_free(struct omap_dm_timer *timer);
...@@ -221,6 +219,7 @@ struct omap_dm_timer { ...@@ -221,6 +219,7 @@ struct omap_dm_timer {
unsigned posted:1; unsigned posted:1;
}; };
extern u32 sys_timer_reserved;
void omap_dm_timer_prepare(struct omap_dm_timer *timer); void omap_dm_timer_prepare(struct omap_dm_timer *timer);
static inline u32 __omap_dm_timer_read(void __iomem *base, u32 reg, static inline u32 __omap_dm_timer_read(void __iomem *base, u32 reg,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册