"Kalliguddi, Hema" <hemahk@xxxxxx> writes: [...] >>>> >>>> static u64 musb_dmamask = DMA_BIT_MASK(32); >>>>@@ -80,6 +89,7 @@ void __init usb_musb_init(struct omap_mu >>>> const char *oh_name = "usb_otg_hs"; >>>> struct musb_hdrc_platform_data *pdata; >>>> >>>>+ core_pwrdm = pwrdm_lookup("per_pwrdm"); >>> >>>per or core ??? >>> >>Oh! It should be core. Now I understand why save/restore >>counts were not matching with >>Core-off counts. >>Thanks for pointing this out. > > If I call pm_runtime_put_sync and pm_runtime_get_sync based on the core domain state then > the USB connect/reset interrupt is not triggered once the core hits off. > > In omap3_enter_idle_bm() there is no core next state being programmed to PRCM register, > > but the drivers functions which are called from omap3_device_idle are suppose to read the > core next state from the PRCM register. > I am missing something here? Ah, this is indeed a big problem. Good catch. Both the CORE and MPU states are programmed in omap3_enter_idle(), but that doesn't happen until after omap3_device_idle(). hmmm.... > If I use the per_pwrdm states to save the context and restore everything works fine. Yes, because PER is programmed in omap3_enter_idle_bm() so it's available already in the registers. I've updated my "idle reorg" series which creates omap3_device_idle & _resume (and enables interrupts in CPUidle.) I updated it to not call omap3_device_idle until the MPU & CORE registers are programmed (diff below.) This is in my pm-wip/idle-reorg branch, which is based on pm-core. Thanks, Kevin diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c index cf4207f..51fef17 100644 --- a/arch/arm/mach-omap2/cpuidle34xx.c +++ b/arch/arm/mach-omap2/cpuidle34xx.c @@ -125,14 +125,16 @@ static int omap3_enter_idle(struct cpuidle_device *dev, current_cx_state = *cx; - /* Used to keep track of the total time in idle */ - getnstimeofday(&ts_preidle); + pwrdm_set_next_pwrst(mpu_pd, mpu_state); + pwrdm_set_next_pwrst(core_pd, core_state); + + omap3_device_idle(); local_irq_disable(); local_fiq_disable(); - pwrdm_set_next_pwrst(mpu_pd, mpu_state); - pwrdm_set_next_pwrst(core_pd, core_state); + /* Used to keep track of the total time in idle */ + getnstimeofday(&ts_preidle); if (omap_irq_pending() || need_resched()) goto return_sleep_time; @@ -157,6 +159,8 @@ return_sleep_time: local_irq_enable(); local_fiq_enable(); + omap3_device_resume(); + return ts_idle.tv_nsec / NSEC_PER_USEC + ts_idle.tv_sec * USEC_PER_SEC; } -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html