Tony Lindgren <tony@xxxxxxxxxxx> writes: > Use dmtimer macros for clocksource. As with the clockevent, > this allows us to initialize the rest of dmtimer code later on. > > Note that eventually we will be initializing the timesource > from init_early so sched_clock will work properly for > CONFIG_PRINTK_TIME. > > Signed-off-by: Tony Lindgren <tony@xxxxxxxxxxx> > Reviewed-by: Kevin Hilman <khilman@xxxxxx> > --- > arch/arm/mach-omap2/timer-gp.c | 64 +++++++++++++++++++++----------------- > arch/arm/plat-omap/counter_32k.c | 2 + > 2 files changed, 37 insertions(+), 29 deletions(-) > > diff --git a/arch/arm/mach-omap2/timer-gp.c b/arch/arm/mach-omap2/timer-gp.c > index cf2ec85..52e295e 100644 > --- a/arch/arm/mach-omap2/timer-gp.c > +++ b/arch/arm/mach-omap2/timer-gp.c > @@ -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); This function makes calls into "real" driver, but is called from sys_timer.init so happens before driver is initialized. > + 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_set_load_start(&clksrc, 1, 0); Here's another call into the real driver. I think you need __omap_dm_timer_set_load_start() here. > + 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 Kevin -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html