diff mbox

[07/10] omap2+: Reserve clocksource and timesource and initialize dmtimer later

Message ID 20110620092343.357.60445.stgit@kaulin (mailing list archive)
State New, archived
Headers show

Commit Message

Tony Lindgren June 20, 2011, 9:23 a.m. UTC
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: Tony Lindgren <tony@atomide.com>
Reviewed-by: Kevin Hilman <khilman@ti.com>
---
 arch/arm/mach-omap1/timer32k.c            |    4 ----
 arch/arm/mach-omap2/timer-gp.c            |    6 ++++--
 arch/arm/plat-omap/dmtimer.c              |    8 ++++++++
 arch/arm/plat-omap/include/plat/dmtimer.h |    1 +
 4 files changed, 13 insertions(+), 6 deletions(-)

Comments

Kevin Hilman June 23, 2011, 5:01 p.m. UTC | #1
Tony Lindgren <tony@atomide.com> writes:

> There's no need to initialize the dmtimer framework early.

Actually, there is, because it's being used from the early code.

The sys_timer.init functions are called before arch_initcalls, so before
omap_dm_timer_init() is called, you have:

omap3_timer_init()
    omap2_gp_clockevent_init()
        omap_dm_timer_init_one()
           omap_dm_timer_request_specific()
               

Among other things, the spinlock is taken before it has been initialized
in omap_dm_timer_init() (that's how I noticed this problem), but the
rest of the init of course hasn't been done either.

Basically, the problem is that this "early init" code is not only using
the new macros, but it's also using functions from the "real" driver,
which is not yet initialized.

Kevin

> Just mark the clocksource and timesource as reserved, and
> initialize dmtimer with an arch_initcall.
>
> Signed-off-by: Tony Lindgren <tony@atomide.com>
> Reviewed-by: Kevin Hilman <khilman@ti.com>
> ---
>  arch/arm/mach-omap1/timer32k.c            |    4 ----
>  arch/arm/mach-omap2/timer-gp.c            |    6 ++++--
>  arch/arm/plat-omap/dmtimer.c              |    8 ++++++++
>  arch/arm/plat-omap/include/plat/dmtimer.h |    1 +
>  4 files changed, 13 insertions(+), 6 deletions(-)
>
> diff --git a/arch/arm/mach-omap1/timer32k.c b/arch/arm/mach-omap1/timer32k.c
> index 13d7b8f..96604a5 100644
> --- a/arch/arm/mach-omap1/timer32k.c
> +++ b/arch/arm/mach-omap1/timer32k.c
> @@ -183,10 +183,6 @@ static __init void omap_init_32k_timer(void)
>  bool __init omap_32k_timer_init(void)
>  {
>  	omap_init_clocksource_32k();
> -
> -#ifdef CONFIG_OMAP_DM_TIMER
> -	omap_dm_timer_init();
> -#endif
>  	omap_init_32k_timer();
>  
>  	return true;
> diff --git a/arch/arm/mach-omap2/timer-gp.c b/arch/arm/mach-omap2/timer-gp.c
> index 578e9df..cf2ec85 100644
> --- a/arch/arm/mach-omap2/timer-gp.c
> +++ b/arch/arm/mach-omap2/timer-gp.c
> @@ -69,6 +69,8 @@
>  /* MAX_GPTIMER_ID: number of GPTIMERs on the chip */
>  #define MAX_GPTIMER_ID		12
>  
> +u32 sys_timer_reserved;
> +
>  /* Clockevent code */
>  
>  static struct omap_dm_timer clkev;
> @@ -195,6 +197,8 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,
>  
>  	omap_hwmod_enable(oh);
>  
> +	sys_timer_reserved |= (1 << (gptimer_id - 1));
> +
>  	if (gptimer_id != 12) {
>  		struct clk *src;
>  
> @@ -321,7 +325,6 @@ static void __init omap2_gp_clocksource_init(void)
>  #define OMAP_SYS_TIMER_INIT(name, clkev_nr, clkev_src)			\
>  static void __init omap##name##_timer_init(void)			\
>  {									\
> -	omap_dm_timer_init();						\
>  	omap2_gp_clockevent_init((clkev_nr), clkev_src);		\
>  	omap2_gp_clocksource_init();					\
>  }
> @@ -350,7 +353,6 @@ static void __init omap4_timer_init(void)
>  	twd_base = ioremap(OMAP44XX_LOCAL_TWD_BASE, SZ_256);
>  	BUG_ON(!twd_base);
>  #endif
> -	omap_dm_timer_init();
>  	omap2_gp_clockevent_init(1, OMAP4_CLKEV_SOURCE);
>  	omap2_gp_clocksource_init();
>  }
> diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c
> index 7c5cb4e..1462784 100644
> --- a/arch/arm/plat-omap/dmtimer.c
> +++ b/arch/arm/plat-omap/dmtimer.c
> @@ -625,8 +625,16 @@ int __init omap_dm_timer_init(void)
>  			sprintf(clk_name, "gpt%d_fck", i + 1);
>  			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
>  	}
>  
>  	return 0;
>  }
> +
> +arch_initcall(omap_dm_timer_init);
> diff --git a/arch/arm/plat-omap/include/plat/dmtimer.h b/arch/arm/plat-omap/include/plat/dmtimer.h
> index dd8b3ff..f6dc77a 100644
> --- a/arch/arm/plat-omap/include/plat/dmtimer.h
> +++ b/arch/arm/plat-omap/include/plat/dmtimer.h
> @@ -222,6 +222,7 @@ struct omap_dm_timer {
>  	unsigned posted:1;
>  };
>  
> +extern u32 sys_timer_reserved;
>  void omap_dm_timer_prepare(struct omap_dm_timer *timer);
>  
>  static inline u32 __omap_dm_timer_read(void __iomem *base, u32 reg,
Kevin Hilman June 23, 2011, 5:13 p.m. UTC | #2
Tony Lindgren <tony@atomide.com> writes:

> 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: Tony Lindgren <tony@atomide.com>
> Reviewed-by: Kevin Hilman <khilman@ti.com>

Also, when you are able to fully get rid of omap_dm_timer_init(), you
can probably remove it from dmtimer.h and make it static in dmtimer.c

Kevin
Tony Lindgren June 27, 2011, 7:48 a.m. UTC | #3
* Kevin Hilman <khilman@ti.com> [110623 09:56]:
> Tony Lindgren <tony@atomide.com> writes:
> 
> > There's no need to initialize the dmtimer framework early.
> 
> Actually, there is, because it's being used from the early code.
> 
> The sys_timer.init functions are called before arch_initcalls, so before
> omap_dm_timer_init() is called, you have:
> 
> omap3_timer_init()
>     omap2_gp_clockevent_init()
>         omap_dm_timer_init_one()
>            omap_dm_timer_request_specific()
>                
> 
> Among other things, the spinlock is taken before it has been initialized
> in omap_dm_timer_init() (that's how I noticed this problem), but the
> rest of the init of course hasn't been done either.
> 
> Basically, the problem is that this "early init" code is not only using
> the new macros, but it's also using functions from the "real" driver,
> which is not yet initialized.

Sounds like you did not apply the previous patch to remove the PM hack?

There's no need to call to omap_dm_timer_request_specific here unless
you added back the PM hack.

Regards,

Tony
Tony Lindgren June 27, 2011, 7:51 a.m. UTC | #4
* Kevin Hilman <khilman@ti.com> [110623 10:08]:
> Tony Lindgren <tony@atomide.com> writes:
> 
> > 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: Tony Lindgren <tony@atomide.com>
> > Reviewed-by: Kevin Hilman <khilman@ti.com>
> 
> Also, when you are able to fully get rid of omap_dm_timer_init(), you
> can probably remove it from dmtimer.h and make it static in dmtimer.c

Good catch. That can be made static now.

Tony
Kevin Hilman June 27, 2011, 4:41 p.m. UTC | #5
Tony Lindgren <tony@atomide.com> writes:

> * Kevin Hilman <khilman@ti.com> [110623 09:56]:
>> Tony Lindgren <tony@atomide.com> writes:
>> 
>> > There's no need to initialize the dmtimer framework early.
>> 
>> Actually, there is, because it's being used from the early code.
>> 
>> The sys_timer.init functions are called before arch_initcalls, so before
>> omap_dm_timer_init() is called, you have:
>> 
>> omap3_timer_init()
>>     omap2_gp_clockevent_init()
>>         omap_dm_timer_init_one()
>>            omap_dm_timer_request_specific()
>>                
>> 
>> Among other things, the spinlock is taken before it has been initialized
>> in omap_dm_timer_init() (that's how I noticed this problem), but the
>> rest of the init of course hasn't been done either.
>> 
>> Basically, the problem is that this "early init" code is not only using
>> the new macros, but it's also using functions from the "real" driver,
>> which is not yet initialized.
>
> Sounds like you did not apply the previous patch to remove the PM hack?
>
> There's no need to call to omap_dm_timer_request_specific here unless
> you added back the PM hack.

Right, I added it back not noticing that it also removed the
_request_specific call.

Thanks for the clarification,

Kevin
diff mbox

Patch

diff --git a/arch/arm/mach-omap1/timer32k.c b/arch/arm/mach-omap1/timer32k.c
index 13d7b8f..96604a5 100644
--- a/arch/arm/mach-omap1/timer32k.c
+++ b/arch/arm/mach-omap1/timer32k.c
@@ -183,10 +183,6 @@  static __init void omap_init_32k_timer(void)
 bool __init omap_32k_timer_init(void)
 {
 	omap_init_clocksource_32k();
-
-#ifdef CONFIG_OMAP_DM_TIMER
-	omap_dm_timer_init();
-#endif
 	omap_init_32k_timer();
 
 	return true;
diff --git a/arch/arm/mach-omap2/timer-gp.c b/arch/arm/mach-omap2/timer-gp.c
index 578e9df..cf2ec85 100644
--- a/arch/arm/mach-omap2/timer-gp.c
+++ b/arch/arm/mach-omap2/timer-gp.c
@@ -69,6 +69,8 @@ 
 /* MAX_GPTIMER_ID: number of GPTIMERs on the chip */
 #define MAX_GPTIMER_ID		12
 
+u32 sys_timer_reserved;
+
 /* Clockevent code */
 
 static struct omap_dm_timer clkev;
@@ -195,6 +197,8 @@  static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,
 
 	omap_hwmod_enable(oh);
 
+	sys_timer_reserved |= (1 << (gptimer_id - 1));
+
 	if (gptimer_id != 12) {
 		struct clk *src;
 
@@ -321,7 +325,6 @@  static void __init omap2_gp_clocksource_init(void)
 #define OMAP_SYS_TIMER_INIT(name, clkev_nr, clkev_src)			\
 static void __init omap##name##_timer_init(void)			\
 {									\
-	omap_dm_timer_init();						\
 	omap2_gp_clockevent_init((clkev_nr), clkev_src);		\
 	omap2_gp_clocksource_init();					\
 }
@@ -350,7 +353,6 @@  static void __init omap4_timer_init(void)
 	twd_base = ioremap(OMAP44XX_LOCAL_TWD_BASE, SZ_256);
 	BUG_ON(!twd_base);
 #endif
-	omap_dm_timer_init();
 	omap2_gp_clockevent_init(1, OMAP4_CLKEV_SOURCE);
 	omap2_gp_clocksource_init();
 }
diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c
index 7c5cb4e..1462784 100644
--- a/arch/arm/plat-omap/dmtimer.c
+++ b/arch/arm/plat-omap/dmtimer.c
@@ -625,8 +625,16 @@  int __init omap_dm_timer_init(void)
 			sprintf(clk_name, "gpt%d_fck", i + 1);
 			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
 	}
 
 	return 0;
 }
+
+arch_initcall(omap_dm_timer_init);
diff --git a/arch/arm/plat-omap/include/plat/dmtimer.h b/arch/arm/plat-omap/include/plat/dmtimer.h
index dd8b3ff..f6dc77a 100644
--- a/arch/arm/plat-omap/include/plat/dmtimer.h
+++ b/arch/arm/plat-omap/include/plat/dmtimer.h
@@ -222,6 +222,7 @@  struct omap_dm_timer {
 	unsigned posted:1;
 };
 
+extern u32 sys_timer_reserved;
 void omap_dm_timer_prepare(struct omap_dm_timer *timer);
 
 static inline u32 __omap_dm_timer_read(void __iomem *base, u32 reg,