|
@@ -386,3 +386,129 @@ static int omap3_pm_suspend(void)
|
|
|
|
|
|
restore:
|
|
|
/* Restore next_pwrsts */
|
|
|
+ list_for_each_entry(pwrst, &pwrst_list, node) {
|
|
|
+ state = pwrdm_read_prev_pwrst(pwrst->pwrdm);
|
|
|
+ if (state > pwrst->next_state) {
|
|
|
+ pr_info("Powerdomain (%s) didn't enter target state %d\n",
|
|
|
+ pwrst->pwrdm->name, pwrst->next_state);
|
|
|
+ ret = -1;
|
|
|
+ }
|
|
|
+ omap_set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state);
|
|
|
+ }
|
|
|
+ if (ret)
|
|
|
+ pr_err("Could not enter target state in pm_suspend\n");
|
|
|
+ else
|
|
|
+ pr_info("Successfully put all powerdomains to target state\n");
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+#endif /* CONFIG_SUSPEND */
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * 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 */
|
|
|
+ omap2_cm_write_mod_reg(0, OMAP3430_IVA2_MOD, CM_FCLKEN);
|
|
|
+
|
|
|
+ /* if no clock activity, nothing else to do */
|
|
|
+ if (!(omap2_cm_read_mod_reg(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSTST) &
|
|
|
+ OMAP3430_CLKACTIVITY_IVA2_MASK))
|
|
|
+ return;
|
|
|
+
|
|
|
+ /* Reset IVA2 */
|
|
|
+ omap2_prm_write_mod_reg(OMAP3430_RST1_IVA2_MASK |
|
|
|
+ OMAP3430_RST2_IVA2_MASK |
|
|
|
+ OMAP3430_RST3_IVA2_MASK,
|
|
|
+ OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL);
|
|
|
+
|
|
|
+ /* Enable IVA2 clock */
|
|
|
+ omap2_cm_write_mod_reg(OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_MASK,
|
|
|
+ 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 */
|
|
|
+ omap2_prm_write_mod_reg(0, OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL);
|
|
|
+
|
|
|
+ /* Disable IVA2 clock */
|
|
|
+ omap2_cm_write_mod_reg(0, OMAP3430_IVA2_MOD, CM_FCLKEN);
|
|
|
+
|
|
|
+ /* Reset IVA2 */
|
|
|
+ omap2_prm_write_mod_reg(OMAP3430_RST1_IVA2_MASK |
|
|
|
+ OMAP3430_RST2_IVA2_MASK |
|
|
|
+ OMAP3430_RST3_IVA2_MASK,
|
|
|
+ OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL);
|
|
|
+}
|
|
|
+
|
|
|
+static void __init omap3_d2d_idle(void)
|
|
|
+{
|
|
|
+ u16 mask, padconf;
|
|
|
+
|
|
|
+ /* In a stand alone OMAP3430 where there is not a stacked
|
|
|
+ * modem for the D2D Idle Ack and D2D MStandby must be pulled
|
|
|
+ * high. S CONTROL_PADCONF_SAD2D_IDLEACK and
|
|
|
+ * CONTROL_PADCONF_SAD2D_MSTDBY to have a pull up. */
|
|
|
+ mask = (1 << 4) | (1 << 3); /* pull-up, enabled */
|
|
|
+ padconf = omap_ctrl_readw(OMAP3_PADCONF_SAD2D_MSTANDBY);
|
|
|
+ padconf |= mask;
|
|
|
+ omap_ctrl_writew(padconf, OMAP3_PADCONF_SAD2D_MSTANDBY);
|
|
|
+
|
|
|
+ padconf = omap_ctrl_readw(OMAP3_PADCONF_SAD2D_IDLEACK);
|
|
|
+ padconf |= mask;
|
|
|
+ omap_ctrl_writew(padconf, OMAP3_PADCONF_SAD2D_IDLEACK);
|
|
|
+
|
|
|
+ /* reset modem */
|
|
|
+ omap2_prm_write_mod_reg(OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RSTPWRON_MASK |
|
|
|
+ OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RST_MASK,
|
|
|
+ CORE_MOD, OMAP2_RM_RSTCTRL);
|
|
|
+ omap2_prm_write_mod_reg(0, CORE_MOD, OMAP2_RM_RSTCTRL);
|
|
|
+}
|
|
|
+
|
|
|
+static void __init prcm_setup_regs(void)
|
|
|
+{
|
|
|
+ u32 omap3630_en_uart4_mask = cpu_is_omap3630() ?
|
|
|
+ OMAP3630_EN_UART4_MASK : 0;
|
|
|
+ u32 omap3630_grpsel_uart4_mask = cpu_is_omap3630() ?
|
|
|
+ OMAP3630_GRPSEL_UART4_MASK : 0;
|
|
|
+
|
|
|
+ /* XXX This should be handled by hwmod code or SCM init code */
|
|
|
+ omap_ctrl_writel(OMAP3430_AUTOIDLE_MASK, OMAP2_CONTROL_SYSCONFIG);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Enable control of expternal oscillator through
|
|
|
+ * sys_clkreq. In the long run clock framework should
|
|
|
+ * take care of this.
|
|
|
+ */
|
|
|
+ omap2_prm_rmw_mod_reg_bits(OMAP_AUTOEXTCLKMODE_MASK,
|
|
|
+ 1 << OMAP_AUTOEXTCLKMODE_SHIFT,
|
|
|
+ OMAP3430_GR_MOD,
|
|
|
+ OMAP3_PRM_CLKSRC_CTRL_OFFSET);
|
|
|
+
|
|
|
+ /* setup wakup source */
|
|
|
+ omap2_prm_write_mod_reg(OMAP3430_EN_IO_MASK | OMAP3430_EN_GPIO1_MASK |
|
|
|
+ OMAP3430_EN_GPT1_MASK | OMAP3430_EN_GPT12_MASK,
|
|
|
+ WKUP_MOD, PM_WKEN);
|
|
|
+ /* No need to write EN_IO, that is always enabled */
|
|
|
+ omap2_prm_write_mod_reg(OMAP3430_GRPSEL_GPIO1_MASK |
|
|
|
+ OMAP3430_GRPSEL_GPT1_MASK |
|
|
|
+ OMAP3430_GRPSEL_GPT12_MASK,
|
|
|
+ WKUP_MOD, OMAP3430_PM_MPUGRPSEL);
|
|
|
+
|
|
|
+ /* Enable PM_WKEN to support DSS LPR */
|
|
|
+ omap2_prm_write_mod_reg(OMAP3430_PM_WKEN_DSS_EN_DSS_MASK,
|
|
|
+ OMAP3430_DSS_MOD, PM_WKEN);
|
|
|
+
|
|
|
+ /* Enable wakeups in PER */
|