On Thu, Apr 26, 2012 at 13:15:18, Russ Dill wrote: > On Wed, Apr 25, 2012 at 11:23 PM, Hiremath, Vaibhav <hvaibhav@xxxxxx> wrote: > > On Thu, Apr 26, 2012 at 11:26:09, Russ Dill wrote: > >> On Wed, Apr 25, 2012 at 10:42 PM, Hiremath, Vaibhav <hvaibhav@xxxxxx> wrote: > >> > On Thu, Apr 26, 2012 at 10:06:40, Russ Dill wrote: > >> >> On Tue, Apr 24, 2012 at 2:45 AM, Vaibhav Hiremath <hvaibhav@xxxxxx> wrote: > >> >> > Current OMAP code supports couple of clocksource options based > >> >> > on compilation flag (CONFIG_OMAP_32K_TIMER). The 32KHz sync-timer > >> >> > and a gptimer which can run on 32KHz or system clock (e.g 38.4 MHz). > >> >> > So there can be 3 options - > >> >> > > >> >> > 1. 32KHz sync-timer > >> >> > 2. Sys_clock based (e.g 13/19.2/26/38.4 MHz) gptimer > >> >> > 3. 32KHz based gptimer. > >> >> > <Snip> > > > > You mean to say, on Beagleboard it boots up fine. And same fails on EVM? > > > yes > I am able to reproduce this issue, and it seems the issue is really weird and I am completely clueless here. With below patch/change it always works, 100% success. The moment I add 0x10 offset to the ioremaped virtual base address, gone...95% of the time it fails. I have observed that, the execution always stays at wfi (default_idle) thread. Really strange behavior...and I am clueless now. - The 32k sync timer address space is part of iotable. - The ioremap() internally masks the addr to page aligned addr and gets pfn, At the end, offset is being added. So I don't really understand how is it different than adding offset before and after ioremap(). Also, this issue is nothing to do with my patch, it also happens with the original code. Just add 0x10 offset after ioremap(), and booooooom.... (95% of the time) ----------Patch which works (on top of this patch-series)---------- diff --git a/arch/arm/plat-omap/counter_32k.c b/arch/arm/plat-omap/counter_32k.c index 3e3cdab..b0ef8ce 100644 --- a/arch/arm/plat-omap/counter_32k.c +++ b/arch/arm/plat-omap/counter_32k.c @@ -90,6 +90,7 @@ int __init omap_init_clocksource_32k(u32 pbase, unsigned long size) * For this to work we must have a static mapping in io.c * for this area */ + pbase = pbase + OMAP2_32KSYNCNT_CR_OFF; base = ioremap(pbase, size); if (!base) { pr_err("32k_counter: failed to map base addr\n"); @@ -100,7 +101,7 @@ int __init omap_init_clocksource_32k(u32 pbase, unsigned long size) if (!IS_ERR(sync32k_ick)) clk_enable(sync32k_ick); - sync32k_cnt_reg = base + OMAP2_32KSYNCNT_CR_OFF; + sync32k_cnt_reg = base; /* * 120000 rough estimate from the calculations in Thanks, Vaibhav -- 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