|
@@ -290,3 +290,81 @@ static void __init prcm_setup_regs(void)
|
|
omap2_prm_write_mod_reg(OMAP24XX_AUTO_EXTVOLT_MASK |
|
|
omap2_prm_write_mod_reg(OMAP24XX_AUTO_EXTVOLT_MASK |
|
|
(0x1 << OMAP24XX_SETOFF_LEVEL_SHIFT) |
|
|
(0x1 << OMAP24XX_SETOFF_LEVEL_SHIFT) |
|
|
OMAP24XX_MEMRETCTRL_MASK |
|
|
OMAP24XX_MEMRETCTRL_MASK |
|
|
|
|
+ (0x1 << OMAP24XX_SETRET_LEVEL_SHIFT) |
|
|
|
|
+ (0x0 << OMAP24XX_VOLT_LEVEL_SHIFT),
|
|
|
|
+ OMAP24XX_GR_MOD, OMAP2_PRCM_VOLTCTRL_OFFSET);
|
|
|
|
+
|
|
|
|
+ /* Enable wake-up events */
|
|
|
|
+ omap2_prm_write_mod_reg(OMAP24XX_EN_GPIOS_MASK | OMAP24XX_EN_GPT1_MASK,
|
|
|
|
+ WKUP_MOD, PM_WKEN);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int __init omap2_pm_init(void)
|
|
|
|
+{
|
|
|
|
+ u32 l;
|
|
|
|
+
|
|
|
|
+ printk(KERN_INFO "Power Management for OMAP2 initializing\n");
|
|
|
|
+ l = omap2_prm_read_mod_reg(OCP_MOD, OMAP2_PRCM_REVISION_OFFSET);
|
|
|
|
+ printk(KERN_INFO "PRCM revision %d.%d\n", (l >> 4) & 0x0f, l & 0x0f);
|
|
|
|
+
|
|
|
|
+ /* Look up important powerdomains */
|
|
|
|
+
|
|
|
|
+ mpu_pwrdm = pwrdm_lookup("mpu_pwrdm");
|
|
|
|
+ if (!mpu_pwrdm)
|
|
|
|
+ pr_err("PM: mpu_pwrdm not found\n");
|
|
|
|
+
|
|
|
|
+ core_pwrdm = pwrdm_lookup("core_pwrdm");
|
|
|
|
+ if (!core_pwrdm)
|
|
|
|
+ pr_err("PM: core_pwrdm not found\n");
|
|
|
|
+
|
|
|
|
+ /* Look up important clockdomains */
|
|
|
|
+
|
|
|
|
+ mpu_clkdm = clkdm_lookup("mpu_clkdm");
|
|
|
|
+ if (!mpu_clkdm)
|
|
|
|
+ pr_err("PM: mpu_clkdm not found\n");
|
|
|
|
+
|
|
|
|
+ wkup_clkdm = clkdm_lookup("wkup_clkdm");
|
|
|
|
+ if (!wkup_clkdm)
|
|
|
|
+ pr_err("PM: wkup_clkdm not found\n");
|
|
|
|
+
|
|
|
|
+ dsp_clkdm = clkdm_lookup("dsp_clkdm");
|
|
|
|
+ if (!dsp_clkdm)
|
|
|
|
+ pr_err("PM: dsp_clkdm not found\n");
|
|
|
|
+
|
|
|
|
+ gfx_clkdm = clkdm_lookup("gfx_clkdm");
|
|
|
|
+ if (!gfx_clkdm)
|
|
|
|
+ pr_err("PM: gfx_clkdm not found\n");
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ osc_ck = clk_get(NULL, "osc_ck");
|
|
|
|
+ if (IS_ERR(osc_ck)) {
|
|
|
|
+ printk(KERN_ERR "could not get osc_ck\n");
|
|
|
|
+ return -ENODEV;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (cpu_is_omap242x()) {
|
|
|
|
+ emul_ck = clk_get(NULL, "emul_ck");
|
|
|
|
+ if (IS_ERR(emul_ck)) {
|
|
|
|
+ printk(KERN_ERR "could not get emul_ck\n");
|
|
|
|
+ clk_put(osc_ck);
|
|
|
|
+ return -ENODEV;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ prcm_setup_regs();
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * We copy the assembler sleep/wakeup routines to SRAM.
|
|
|
|
+ * These routines need to be in SRAM as that's the only
|
|
|
|
+ * memory the MPU can see when it wakes up.
|
|
|
|
+ */
|
|
|
|
+ omap2_sram_idle = omap_sram_push(omap24xx_idle_loop_suspend,
|
|
|
|
+ omap24xx_idle_loop_suspend_sz);
|
|
|
|
+
|
|
|
|
+ omap2_sram_suspend = omap_sram_push(omap24xx_cpu_suspend,
|
|
|
|
+ omap24xx_cpu_suspend_sz);
|
|
|
|
+
|
|
|
|
+ arm_pm_idle = omap2_pm_idle;
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|