@@ -89,5 +89,12 @@ DSP_STATUS DSP_PeripheralClocks_Enable(struct WMD_DEV_CONTEXT *pDevContext,
*/
void DSPClkWakeupEventCtrl(u32 ClkId, bool enable);
+/**
+ * tiomap3430_bump_dsp_opp_level() - bump up opp if required
+ *
+ * if the system is at a minimum opp, request for higher opp
+ */
+DSP_STATUS tiomap3430_bump_dsp_opp_level(void);
+
#endif /* _TIOMAP_PWR_ */
@@ -1132,7 +1132,7 @@ void IO_Schedule(struct IO_MGR *pIOMgr)
spin_lock_irqsave(&pIOMgr->dpc_lock, flags);
pIOMgr->dpc_req++;
spin_unlock_irqrestore(&pIOMgr->dpc_lock, flags);
-
+ tiomap3430_bump_dsp_opp_level();
/* Schedule DPC */
tasklet_schedule(&pIOMgr->dpc_tasklet);
}
@@ -806,3 +806,34 @@ void DSPClkWakeupEventCtrl(u32 ClkId, bool enable)
break;
}
}
+
+/**
+ * tiomap3430_bump_dsp_opp_level() - bump up the opp if at minimum
+ *
+ * if we need a higher opp index, request for the same
+ */
+DSP_STATUS tiomap3430_bump_dsp_opp_level(void)
+{
+#ifndef CONFIG_BRIDGE_DVFS
+ u32 opplevel;
+
+ struct dspbridge_platform_data *pdata =
+ omap_dspbridge_dev->dev.platform_data;
+
+ if (pdata->dsp_get_opp) {
+ opplevel = (*pdata->dsp_get_opp)();
+
+ /*
+ * If OPP is at minimum level, increase it before waking
+ * up the DSP.
+ */
+ if (opplevel == 1 && pdata->dsp_set_min_opp) {
+ (*pdata->dsp_set_min_opp)(opp_level + 1);
+ DBG_Trace(DBG_LEVEL7, "CHNLSM_InterruptDSP: Setting "
+ "the vdd1 constraint level to %d before "
+ "waking DSP \n", opp_level + 1);
+ }
+ }
+#endif
+ return DSP_SOK;
+}
@@ -96,11 +96,6 @@ DSP_STATUS CHNLSM_DisableInterrupt(struct WMD_DEV_CONTEXT *pDevContext)
DSP_STATUS CHNLSM_InterruptDSP2(struct WMD_DEV_CONTEXT *pDevContext,
u16 wMbVal)
{
-#ifdef CONFIG_BRIDGE_DVFS
- struct dspbridge_platform_data *pdata =
- omap_dspbridge_dev->dev.platform_data;
- u32 opplevel = 0;
-#endif
struct CFG_HOSTRES resources;
DSP_STATUS status = DSP_SOK;
unsigned long timeout;
@@ -114,12 +109,8 @@ DSP_STATUS CHNLSM_InterruptDSP2(struct WMD_DEV_CONTEXT *pDevContext,
if (pDevContext->dwBrdState == BRD_DSP_HIBERNATION ||
pDevContext->dwBrdState == BRD_HIBERNATION) {
#ifdef CONFIG_BRIDGE_DVFS
- if (pdata->dsp_get_opp)
- opplevel = (*pdata->dsp_get_opp)();
- if (opplevel == VDD1_OPP1) {
- if (pdata->dsp_set_min_opp)
- (*pdata->dsp_set_min_opp)(VDD1_OPP2);
- }
+ if (!in_interrupt())
+ tiomap3430_bump_dsp_opp_level();
#endif
/* Restart the peripheral clocks */
DSP_PeripheralClocks_Enable(pDevContext, NULL);