"Kalliguddi, Hema" <[email protected]> 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-omap" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html