Re: [PATCH 5/8] OMAP3 PM: Adding conditional core powerdomain context save and restore

2010-01-22 Thread Kevin Hilman
Thara Gopinath th...@ti.com writes:

 This patch adds a parameter core_state , depicting the power state
 which the core domain will attempt to enter, to omap3_core_save_context
 and omap3_core_restore_context. This is so as to distinguish between
 the context save and restore required when core domain is attempting
 OSWR and OFF. Core OSWR does not require interrupt controller,
 system control module and dma controller context save and retore
 where as Core OFF reuires these.

 Signed-off-by: Thara Gopinath th...@ti.com

Looks good, pulling this into PM branch after one minor fixup below...

 ---
  arch/arm/mach-omap2/pm34xx.c |   71 
 +-
  1 files changed, 42 insertions(+), 29 deletions(-)

 diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
 index 895e9ef..e4db1ea 100644
 --- a/arch/arm/mach-omap2/pm34xx.c
 +++ b/arch/arm/mach-omap2/pm34xx.c
 @@ -150,44 +150,57 @@ static void omap3_disable_io_chain(void)
   prm_clear_mod_reg_bits(OMAP3430_EN_IO_CHAIN, WKUP_MOD, PM_WKEN);
  }
  
 -static void omap3_core_save_context(void)
 +static void omap3_core_save_context(int core_state)
  {
 - u32 control_padconf_off;
 + if (core_state == PWRDM_POWER_OFF) {
 + u32 control_padconf_off;
 +
 + /* Save the padconf registers */
 + control_padconf_off = omap_ctrl_readl(
 + OMAP343X_CONTROL_PADCONF_OFF);
 + control_padconf_off |= START_PADCONF_SAVE;
 + omap_ctrl_writel(control_padconf_off,
 + OMAP343X_CONTROL_PADCONF_OFF);
 + /* wait for the save to complete */
 + while (!(omap_ctrl_readl(
 + OMAP343X_CONTROL_GENERAL_PURPOSE_STATUS) 
 + PADCONF_SAVE_DONE))
 + udelay(1);
  
 - /* Save the padconf registers */
 - control_padconf_off = omap_ctrl_readl(OMAP343X_CONTROL_PADCONF_OFF);
 - control_padconf_off |= START_PADCONF_SAVE;
 - omap_ctrl_writel(control_padconf_off, OMAP343X_CONTROL_PADCONF_OFF);
 - /* wait for the save to complete */
 - while (!(omap_ctrl_readl(OMAP343X_CONTROL_GENERAL_PURPOSE_STATUS)
 -  PADCONF_SAVE_DONE))
 - udelay(1);
 + /*
 +  * Force write last pad into memory, as this can fail in some
 +  * cases according to erratas 1.157, 1.185
 +  */
 + omap_ctrl_writel(omap_ctrl_readl(OMAP343X_PADCONF_ETK_D14),
 + OMAP343X_CONTROL_MEM_WKUP + 0x2a0);
  
 - /*
 -  * Force write last pad into memory, as this can fail in some
 -  * cases according to erratas 1.157, 1.185
 -  */
 - omap_ctrl_writel(omap_ctrl_readl(OMAP343X_PADCONF_ETK_D14),
 - OMAP343X_CONTROL_MEM_WKUP + 0x2a0);
 + /* Save the Interrupt controller context */
 + omap_intc_save_context();
 +
 + /* Save the system control module context,
 +  * padconf already save above
 +  */
 + omap3_control_save_context();
 + omap_dma_global_context_save();
 + }
  
 - /* Save the Interrupt controller context */
 - omap_intc_save_context();
   /* Save the GPMC context */
   omap3_gpmc_save_context();
 - /* Save the system control module context, padconf already save above*/
 - omap3_control_save_context();
 - omap_dma_global_context_save();
  }
  
 -static void omap3_core_restore_context(void)
 +static void omap3_core_restore_context(int core_state)
  {
 - /* Restore the control module context, padconf restored by h/w */
 - omap3_control_restore_context();
 + if (core_state == PWRDM_POWER_OFF) {
 + /* Restore the control module context,
 +  * padconf restored by h/w
 +  */

changing this to proper multi-line comment.

Kevin

 + omap3_control_restore_context();
 + /* Restore the interrupt controller context */
 + omap_intc_restore_context();
 + omap_dma_global_context_restore();
 + }
   /* Restore the GPMC context */
   omap3_gpmc_restore_context();
 - /* Restore the interrupt controller context */
 - omap_intc_restore_context();
 - omap_dma_global_context_restore();
  }
  
  /*
 @@ -445,7 +458,7 @@ void omap_sram_idle(void)
   prm_set_mod_reg_bits(voltctrl,
OMAP3430_GR_MOD,
OMAP3_PRM_VOLTCTRL_OFFSET);
 - omap3_core_save_context();
 + omap3_core_save_context(PWRDM_POWER_OFF);
   omap3_prcm_save_context();
   } else if (core_next_state == PWRDM_POWER_RET) {
   prm_set_mod_reg_bits(OMAP3430_AUTO_RET,
 @@ -497,7 +510,7 @@ void omap_sram_idle(void)
   if (core_next_state  

[PATCH 5/8] OMAP3 PM: Adding conditional core powerdomain context save and restore

2010-01-20 Thread Thara Gopinath
This patch adds a parameter core_state , depicting the power state
which the core domain will attempt to enter, to omap3_core_save_context
and omap3_core_restore_context. This is so as to distinguish between
the context save and restore required when core domain is attempting
OSWR and OFF. Core OSWR does not require interrupt controller,
system control module and dma controller context save and retore
where as Core OFF reuires these.

Signed-off-by: Thara Gopinath th...@ti.com
---
 arch/arm/mach-omap2/pm34xx.c |   71 +-
 1 files changed, 42 insertions(+), 29 deletions(-)

diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
index 895e9ef..e4db1ea 100644
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -150,44 +150,57 @@ static void omap3_disable_io_chain(void)
prm_clear_mod_reg_bits(OMAP3430_EN_IO_CHAIN, WKUP_MOD, PM_WKEN);
 }
 
-static void omap3_core_save_context(void)
+static void omap3_core_save_context(int core_state)
 {
-   u32 control_padconf_off;
+   if (core_state == PWRDM_POWER_OFF) {
+   u32 control_padconf_off;
+
+   /* Save the padconf registers */
+   control_padconf_off = omap_ctrl_readl(
+   OMAP343X_CONTROL_PADCONF_OFF);
+   control_padconf_off |= START_PADCONF_SAVE;
+   omap_ctrl_writel(control_padconf_off,
+   OMAP343X_CONTROL_PADCONF_OFF);
+   /* wait for the save to complete */
+   while (!(omap_ctrl_readl(
+   OMAP343X_CONTROL_GENERAL_PURPOSE_STATUS) 
+   PADCONF_SAVE_DONE))
+   udelay(1);
 
-   /* Save the padconf registers */
-   control_padconf_off = omap_ctrl_readl(OMAP343X_CONTROL_PADCONF_OFF);
-   control_padconf_off |= START_PADCONF_SAVE;
-   omap_ctrl_writel(control_padconf_off, OMAP343X_CONTROL_PADCONF_OFF);
-   /* wait for the save to complete */
-   while (!(omap_ctrl_readl(OMAP343X_CONTROL_GENERAL_PURPOSE_STATUS)
-PADCONF_SAVE_DONE))
-   udelay(1);
+   /*
+* Force write last pad into memory, as this can fail in some
+* cases according to erratas 1.157, 1.185
+*/
+   omap_ctrl_writel(omap_ctrl_readl(OMAP343X_PADCONF_ETK_D14),
+   OMAP343X_CONTROL_MEM_WKUP + 0x2a0);
 
-   /*
-* Force write last pad into memory, as this can fail in some
-* cases according to erratas 1.157, 1.185
-*/
-   omap_ctrl_writel(omap_ctrl_readl(OMAP343X_PADCONF_ETK_D14),
-   OMAP343X_CONTROL_MEM_WKUP + 0x2a0);
+   /* Save the Interrupt controller context */
+   omap_intc_save_context();
+
+   /* Save the system control module context,
+* padconf already save above
+*/
+   omap3_control_save_context();
+   omap_dma_global_context_save();
+   }
 
-   /* Save the Interrupt controller context */
-   omap_intc_save_context();
/* Save the GPMC context */
omap3_gpmc_save_context();
-   /* Save the system control module context, padconf already save above*/
-   omap3_control_save_context();
-   omap_dma_global_context_save();
 }
 
-static void omap3_core_restore_context(void)
+static void omap3_core_restore_context(int core_state)
 {
-   /* Restore the control module context, padconf restored by h/w */
-   omap3_control_restore_context();
+   if (core_state == PWRDM_POWER_OFF) {
+   /* Restore the control module context,
+* padconf restored by h/w
+*/
+   omap3_control_restore_context();
+   /* Restore the interrupt controller context */
+   omap_intc_restore_context();
+   omap_dma_global_context_restore();
+   }
/* Restore the GPMC context */
omap3_gpmc_restore_context();
-   /* Restore the interrupt controller context */
-   omap_intc_restore_context();
-   omap_dma_global_context_restore();
 }
 
 /*
@@ -445,7 +458,7 @@ void omap_sram_idle(void)
prm_set_mod_reg_bits(voltctrl,
 OMAP3430_GR_MOD,
 OMAP3_PRM_VOLTCTRL_OFFSET);
-   omap3_core_save_context();
+   omap3_core_save_context(PWRDM_POWER_OFF);
omap3_prcm_save_context();
} else if (core_next_state == PWRDM_POWER_RET) {
prm_set_mod_reg_bits(OMAP3430_AUTO_RET,
@@ -497,7 +510,7 @@ void omap_sram_idle(void)
if (core_next_state  PWRDM_POWER_ON) {
core_prev_state = pwrdm_read_prev_pwrst(core_pwrdm);
if (core_prev_state ==