CPU-idle has a possibility of working now, also added full PRCM register dump
into pm-debug.
Signed-off-by: Tero Kristo <[EMAIL PROTECTED]>
---
arch/arm/mach-omap2/cpuidle34xx.c | 30 -------------------------
arch/arm/mach-omap2/pm-debug.c | 17 ++++++++++----
arch/arm/mach-omap2/pm34xx.c | 43 +++++++++++++++++++++++++++---------
3 files changed, 44 insertions(+), 46 deletions(-)
mode change 100644 => 100755 arch/arm/mach-omap2/pm-debug.c
diff --git a/arch/arm/mach-omap2/cpuidle34xx.c
b/arch/arm/mach-omap2/cpuidle34xx.c
index 7af8653..9e65631 100755
--- a/arch/arm/mach-omap2/cpuidle34xx.c
+++ b/arch/arm/mach-omap2/cpuidle34xx.c
@@ -461,10 +461,6 @@ static int omap3_enter_idle(struct cpuidle_device *dev,
per_pwrst = pwrdm_read_pwrst(per_pd);
neon_pwrst = pwrdm_read_pwrst(neon_pd);
- /* Do this before any changes to PRCM registers */
- if (cx->core_state == PWRDM_POWER_OFF)
- omap3_save_prcm_ctx();
-
/* Program MPU to target state */
if (cx->mpu_state < PWRDM_POWER_ON) {
if (neon_pwrst == PWRDM_POWER_ON) {
@@ -478,17 +474,6 @@ static int omap3_enter_idle(struct cpuidle_device *dev,
/* Program CORE and PER to target state */
if (cx->core_state < PWRDM_POWER_ON) {
- if (per_pwrst == PWRDM_POWER_ON) {
- omap2_gpio_prepare_for_retention();
- if (clocks_off_while_idle) {
- omap3_save_per_ctx();
- per_gpio_clk_disable();
- omap_save_uart_ctx(2);
- omap_serial_enable_clocks(0, 2);
- }
- }
- if (cx->core_state == PWRDM_POWER_OFF)
- omap3_save_core_ctx();
pwrdm_set_next_pwrst(core_pd, cx->core_state);
}
@@ -510,22 +495,7 @@ static int omap3_enter_idle(struct cpuidle_device *dev,
}
if (cx->core_state < PWRDM_POWER_ON) {
- if ((cx->core_state == PWRDM_POWER_OFF)
- && (pwrdm_read_prev_pwrst(core_pd) == PWRDM_POWER_OFF)) {
- omap3_restore_core_ctx();
- omap3_restore_prcm_ctx();
- omap3_restore_sram_ctx();
- }
pwrdm_set_next_pwrst(core_pd, PWRDM_POWER_ON);
- if (per_pwrst == PWRDM_POWER_ON) {
- if (clocks_off_while_idle) {
- omap_serial_enable_clocks(1, 2);
- omap_restore_uart_ctx(2);
- per_gpio_clk_enable();
- omap3_restore_per_ctx();
- }
- omap2_gpio_resume_after_retention();
- }
}
pr_debug("MPU prev st:%x,NEON prev st:%x\n",
diff --git a/arch/arm/mach-omap2/pm-debug.c b/arch/arm/mach-omap2/pm-debug.c
old mode 100644
new mode 100755
index b6f8621..f35b082
--- a/arch/arm/mach-omap2/pm-debug.c
+++ b/arch/arm/mach-omap2/pm-debug.c
@@ -182,26 +182,33 @@ struct pm_module_def {
#define MOD_PRM 1
static const struct pm_module_def pm_dbg_reg_modules[] = {
+ { "IVA2", MOD_CM, OMAP3430_IVA2_MOD, 0, 0x4c },
{ "OCP", MOD_CM, OCP_MOD, 0, 0x10 },
{ "MPU", MOD_CM, MPU_MOD, 4, 0x4c },
{ "CORE", MOD_CM, CORE_MOD, 0, 0x4c },
- { "NEON", MOD_CM, OMAP3430_NEON_MOD, 0x20, 0x48 },
+ { "SGX", MOD_CM, OMAP3430ES2_SGX_MOD, 0, 0x4c },
{ "WKUP", MOD_CM, WKUP_MOD, 0, 0x40 },
- { "EMU", MOD_CM, OMAP3430_EMU_MOD, 0x40, 0x54 },
{ "CCR", MOD_CM, PLL_MOD, 0, 0x70 },
{ "DSS", MOD_CM, OMAP3430_DSS_MOD, 0, 0x4c },
+ { "CAM", MOD_CM, OMAP3430_CAM_MOD, 0, 0x4c },
{ "PER", MOD_CM, OMAP3430_PER_MOD, 0, 0x4c },
+ { "EMU", MOD_CM, OMAP3430_EMU_MOD, 0x40, 0x54 },
+ { "NEON", MOD_CM, OMAP3430_NEON_MOD, 0x20, 0x48 },
{ "USB", MOD_CM, OMAP3430ES2_USBHOST_MOD, 0, 0x4c },
- { "OCP", MOD_PRM, OCP_MOD, 0x1c },
+ { "IVA2", MOD_PRM, OMAP3430_IVA2_MOD, 0x50, 0xfc },
+ { "OCP", MOD_PRM, OCP_MOD, 4, 0x1c },
{ "MPU", MOD_PRM, MPU_MOD, 0x58, 0xe8 },
{ "CORE", MOD_PRM, CORE_MOD, 0x58, 0xf8 },
- { "NEON", MOD_PRM, OMAP3430_NEON_MOD, 0x58, 0xe8 },
+ { "SGX", MOD_PRM, OMAP3430ES2_SGX_MOD, 0x58, 0xe8 },
{ "WKUP", MOD_PRM, WKUP_MOD, 0xa0, 0xb0 },
- { "EMU", MOD_PRM, OMAP3430_EMU_MOD, 0x58, 0xe4 },
{ "CCR", MOD_PRM, PLL_MOD, 0x40, 0x70 },
{ "DSS", MOD_PRM, OMAP3430_DSS_MOD, 0x58, 0xe8 },
+ { "CAM", MOD_PRM, OMAP3430_CAM_MOD, 0x58, 0xe8 },
{ "PER", MOD_PRM, OMAP3430_PER_MOD, 0x58, 0xe8 },
+ { "EMU", MOD_PRM, OMAP3430_EMU_MOD, 0x58, 0xe4 },
+ { "GLBL", MOD_PRM, OMAP3430_GR_MOD, 0x20, 0xe4 },
+ { "NEON", MOD_PRM, OMAP3430_NEON_MOD, 0x58, 0xe8 },
{ "USB", MOD_PRM, OMAP3430ES2_USBHOST_MOD, 0x58, 0xe8 },
{ "", 0, 0, 0, 0 },
};
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
index c4afa7d..3c62b68 100755
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -75,6 +75,8 @@ void (*_omap_sram_idle)(u32 *addr, int save_state);
static void (*saved_idle)(void);
static struct powerdomain *mpu_pwrdm;
+static struct powerdomain *core_pwrdm;
+static struct powerdomain *per_pwrdm;
/* XXX This is for gpio fclk hack. Will be removed as gpio driver
* handles fcks correctly */
@@ -235,6 +237,8 @@ void omap_sram_idle(void)
/* save_state = 2 => Only L2 lost */
/* save_state = 3 => L1, L2 and logic lost */
int save_state = 0, mpu_next_state;
+ int save_core;
+ int save_per;
if (!_omap_sram_idle)
return;
@@ -255,17 +259,26 @@ void omap_sram_idle(void)
return;
}
- omap3_save_core_ctx();
- omap3_save_prcm_ctx();
+ save_core = (pwrdm_read_next_pwrst(core_pwrdm) == PWRDM_POWER_OFF);
+ save_per = (pwrdm_read_next_pwrst(per_pwrdm) == PWRDM_POWER_OFF);
+
+ if (save_core) {
+ omap3_save_core_ctx();
+ omap3_save_prcm_ctx();
+ }
+
+ if (save_per)
+ omap3_save_per_ctx();
- omap3_save_per_ctx();
omap2_gpio_prepare_for_retention();
/* XXX This is for gpio fclk hack. Will be removed as gpio driver
* handles fcks correctly */
per_gpio_clk_disable();
- omap_save_uart_ctx();
+ if (save_per)
+ omap_save_uart_ctx();
+
omap_serial_enable_clocks(0);
*(scratchpad_restore_addr) = restore_pointer_address;
@@ -277,19 +290,24 @@ void omap_sram_idle(void)
if (pwrdm_read_prev_pwrst(mpu_pwrdm) == 0x0)
restore_table_entry();
- omap3_restore_prcm_ctx();
- omap3_restore_sram_ctx();
- omap3_restore_core_ctx();
+ if (save_core) {
+ omap3_restore_prcm_ctx();
+ omap3_restore_sram_ctx();
+ omap3_restore_core_ctx();
+ }
omap_serial_enable_clocks(1); /* Causes crash with CORE off */
- omap_restore_uart_ctx();
+ if (save_per)
+ omap_restore_uart_ctx();
/* XXX This is for gpio fclk hack. Will be removed as gpio driver
* handles fcks correctly */
per_gpio_clk_enable();
- omap3_restore_per_ctx();
+
+ if (save_per)
+ omap3_restore_per_ctx();
omap2_gpio_resume_after_retention();
}
@@ -718,10 +736,13 @@ int __init omap3_pm_init(void)
}
mpu_pwrdm = pwrdm_lookup("mpu_pwrdm");
+ core_pwrdm = pwrdm_lookup("core_pwrdm");
+ per_pwrdm = pwrdm_lookup("per_pwrdm");
neon_pwrdm = pwrdm_lookup("neon_pwrdm");
- if (mpu_pwrdm == NULL || neon_pwrdm == NULL) {
- printk(KERN_ERR "Failed to get mpu_pwrdm or neon_pwrdm\n");
+ if (mpu_pwrdm == NULL || neon_pwrdm == NULL || per_pwrdm == NULL ||
+ core_pwrdm == NULL) {
+ printk(KERN_ERR "Failed to get pwrdm pointers\n");
goto err2;
}
--
1.5.4.3
--
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