[PATCH/RFC 2/3] ARM: shmobile: initialise clock early on kzm9g-reference

Guennadi Liakhovetski g.liakhovetski at gmx.de
Thu Apr 4 03:13:07 EDT 2013


Hi Simon

On Thu, 4 Apr 2013, Simon Horman wrote:

> On Wed, Apr 03, 2013 at 06:13:55PM +0200, Guennadi Liakhovetski wrote:
> > To prepare to enable TWD on kzm9g-reference, clock initialisation has to be
> > done early. Move it from .init_machine to .init_time stage.
> 
> I'm pretty surprised by this given how much effort has
> been made to avoid early clock initialisation.

Yes, sorry, I probably failed to explain exactly the meaning of "RFC" in 
these patches. My goal was to find a way to activate the TWD on kzm9g in 
the "-reference" configuration, i.e. with DT, when TWD is also 
instantiated as a DT node. This didn't work out of the box by simply 
adding the respective DT node as in patch/rfc #3 in this series. Doing 
that just resulted in a lock up with no output. The reason was, that TWD 
was trying to initialise before any other timers / clocks and its 
calibration in twd_calibrate_rate() was cycling endlessly. So, I tried to 
find a way to fix this lock-up, which produced these RFCs. I'm perfectly 
aware, that this might not be what we want to have in the mainline, this 
is just an illustration, what I had to do to get TWD running with DT.

As for "avoid early clock initialisation" - I'm aware of this goal in 
principle, but I'm not sure about details - how early is too early and 
when it is already allowed, why is this important with DT and not with 
legacy (because we want to initialise all clocks from DT?), what are 
proper ways to solve problems like this one? Note, that TWD has to be 
registered before secondary_start_kernel() is run. So, we need a 
clocksource before that time for a successful TWD calibration.

Thanks
Guennadi

> > Signed-off-by: Guennadi Liakhovetski <g.liakhovetski+renesas at gmail.com>
> > ---
> >  arch/arm/mach-shmobile/board-kzm9g-reference.c |    8 +++++++-
> >  arch/arm/mach-shmobile/setup-sh73a0.c          |   13 +++++++++----
> >  2 files changed, 16 insertions(+), 5 deletions(-)
> > 
> > diff --git a/arch/arm/mach-shmobile/board-kzm9g-reference.c b/arch/arm/mach-shmobile/board-kzm9g-reference.c
> > index aefa50d..0f9b276 100644
> > --- a/arch/arm/mach-shmobile/board-kzm9g-reference.c
> > +++ b/arch/arm/mach-shmobile/board-kzm9g-reference.c
> > @@ -90,6 +90,12 @@ static void __init kzm_init(void)
> >  #endif
> >  }
> >  
> > +static void __init timer_init(void)
> > +{
> > +	sh73a0_clock_init();
> > +	shmobile_timer_init();
> > +}
> > +
> >  static const char *kzm9g_boards_compat_dt[] __initdata = {
> >  	"renesas,kzm9g-reference",
> >  	NULL,
> > @@ -102,6 +108,6 @@ DT_MACHINE_START(KZM9G_DT, "kzm9g-reference")
> >  	.nr_irqs	= NR_IRQS_LEGACY,
> >  	.init_irq	= irqchip_init,
> >  	.init_machine	= kzm_init,
> > -	.init_time	= shmobile_timer_init,
> > +	.init_time	= timer_init,
> >  	.dt_compat	= kzm9g_boards_compat_dt,
> >  MACHINE_END
> > diff --git a/arch/arm/mach-shmobile/setup-sh73a0.c b/arch/arm/mach-shmobile/setup-sh73a0.c
> > index 0469e84..8a1bc1c 100644
> > --- a/arch/arm/mach-shmobile/setup-sh73a0.c
> > +++ b/arch/arm/mach-shmobile/setup-sh73a0.c
> > @@ -1018,9 +1018,6 @@ void __init sh73a0_add_standard_devices_dt(void)
> >  {
> >  	struct platform_device_info devinfo = { .name = "cpufreq-cpu0", .id = -1, };
> >  
> > -	/* clocks are setup late during boot in the case of DT */
> > -	sh73a0_clock_init();
> > -
> >  	platform_add_devices(sh73a0_devices_dt,
> >  			     ARRAY_SIZE(sh73a0_devices_dt));
> >  	of_platform_populate(NULL, of_default_bus_match_table,
> > @@ -1030,6 +1027,14 @@ void __init sh73a0_add_standard_devices_dt(void)
> >  	platform_device_register_full(&devinfo);
> >  }
> >  
> > +static void __init add_standard_devices(void)
> > +{
> > +	/* clocks are setup late during boot in the case of DT */
> > +	sh73a0_clock_init();
> > +
> > +	sh73a0_add_standard_devices_dt();
> > +}
> > +
> >  static const char *sh73a0_boards_compat_dt[] __initdata = {
> >  	"renesas,sh73a0",
> >  	NULL,
> > @@ -1041,7 +1046,7 @@ DT_MACHINE_START(SH73A0_DT, "Generic SH73A0 (Flattened Device Tree)")
> >  	.init_early	= sh73a0_init_delay,
> >  	.nr_irqs	= NR_IRQS_LEGACY,
> >  	.init_irq	= irqchip_init,
> > -	.init_machine	= sh73a0_add_standard_devices_dt,
> > +	.init_machine	= add_standard_devices,
> >  	.init_time	= shmobile_timer_init,
> >  	.dt_compat	= sh73a0_boards_compat_dt,
> >  MACHINE_END
> > -- 
> > 1.7.2.5
> > 
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-sh" in
> > the body of a message to majordomo at vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> > 
> 

---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
http://www.open-technology.de/



More information about the linux-arm-kernel mailing list