|
@@ -352,6 +352,54 @@ static struct platform_suspend_ops omap_pm_ops = {
|
|
.valid = suspend_valid_only_mem,
|
|
.valid = suspend_valid_only_mem,
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * omap3_iva_idle(): ensure IVA is in idle so it can be put into
|
|
|
|
+ * retention
|
|
|
|
+ *
|
|
|
|
+ * In cases where IVA2 is activated by bootcode, it may prevent
|
|
|
|
+ * full-chip retention or off-mode because it is not idle. This
|
|
|
|
+ * function forces the IVA2 into idle state so it can go
|
|
|
|
+ * into retention/off and thus allow full-chip retention/off.
|
|
|
|
+ *
|
|
|
|
+ **/
|
|
|
|
+static void __init omap3_iva_idle(void)
|
|
|
|
+{
|
|
|
|
+ /* ensure IVA2 clock is disabled */
|
|
|
|
+ cm_write_mod_reg(0, OMAP3430_IVA2_MOD, CM_FCLKEN);
|
|
|
|
+
|
|
|
|
+ /* if no clock activity, nothing else to do */
|
|
|
|
+ if (!(cm_read_mod_reg(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSTST) &
|
|
|
|
+ OMAP3430_CLKACTIVITY_IVA2_MASK))
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ /* Reset IVA2 */
|
|
|
|
+ prm_write_mod_reg(OMAP3430_RST1_IVA2 |
|
|
|
|
+ OMAP3430_RST2_IVA2 |
|
|
|
|
+ OMAP3430_RST3_IVA2,
|
|
|
|
+ OMAP3430_IVA2_MOD, RM_RSTCTRL);
|
|
|
|
+
|
|
|
|
+ /* Enable IVA2 clock */
|
|
|
|
+ cm_write_mod_reg(OMAP3430_CM_FCLKEN_IVA2_EN_IVA2,
|
|
|
|
+ OMAP3430_IVA2_MOD, CM_FCLKEN);
|
|
|
|
+
|
|
|
|
+ /* Set IVA2 boot mode to 'idle' */
|
|
|
|
+ omap_ctrl_writel(OMAP3_IVA2_BOOTMOD_IDLE,
|
|
|
|
+ OMAP343X_CONTROL_IVA2_BOOTMOD);
|
|
|
|
+
|
|
|
|
+ /* Un-reset IVA2 */
|
|
|
|
+ prm_write_mod_reg(0, OMAP3430_IVA2_MOD, RM_RSTCTRL);
|
|
|
|
+
|
|
|
|
+ /* Disable IVA2 clock */
|
|
|
|
+ cm_write_mod_reg(0, OMAP3430_IVA2_MOD, CM_FCLKEN);
|
|
|
|
+
|
|
|
|
+ /* Reset IVA2 */
|
|
|
|
+ prm_write_mod_reg(OMAP3430_RST1_IVA2 |
|
|
|
|
+ OMAP3430_RST2_IVA2 |
|
|
|
|
+ OMAP3430_RST3_IVA2,
|
|
|
|
+ OMAP3430_IVA2_MOD, RM_RSTCTRL);
|
|
|
|
+}
|
|
|
|
+
|
|
static void __init prcm_setup_regs(void)
|
|
static void __init prcm_setup_regs(void)
|
|
{
|
|
{
|
|
/* reset modem */
|
|
/* reset modem */
|
|
@@ -511,6 +559,8 @@ static void __init prcm_setup_regs(void)
|
|
* it is selected to mpu wakeup goup */
|
|
* it is selected to mpu wakeup goup */
|
|
prm_write_mod_reg(OMAP3430_IO_EN | OMAP3430_WKUP_EN,
|
|
prm_write_mod_reg(OMAP3430_IO_EN | OMAP3430_WKUP_EN,
|
|
OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET);
|
|
OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET);
|
|
|
|
+
|
|
|
|
+ omap3_iva_idle();
|
|
}
|
|
}
|
|
|
|
|
|
static int __init pwrdms_setup(struct powerdomain *pwrdm)
|
|
static int __init pwrdms_setup(struct powerdomain *pwrdm)
|