OMAP3: PM: Enable IO-CHAIN wakeup
authorKalle Jokiniemi <kalle.jokiniemi@digia.com>
Thu, 26 Mar 2009 13:59:01 +0000 (15:59 +0200)
committerKevin Hilman <khilman@deeprootsystems.com>
Wed, 11 Nov 2009 22:42:28 +0000 (14:42 -0800)
OMAP 3430 ES3.1 chips have a separate bit for IO daisy-chain
wake up enabling. It needs to be enabled when entering
retention or off state, otherwise waking up might not work
in all situations.

Signed-off-by: Kalle Jokiniemi <kalle.jokiniemi@digia.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
arch/arm/mach-omap2/pm34xx.c
arch/arm/mach-omap2/prm-regbits-34xx.h

index 7623eda..511a57d 100644 (file)
@@ -94,6 +94,35 @@ static inline void omap3_per_restore_context(void)
        omap_gpio_restore_context();
 }
 
+static void omap3_enable_io_chain(void)
+{
+       int timeout = 0;
+
+       if (omap_rev() >= OMAP3430_REV_ES3_1) {
+               prm_set_mod_reg_bits(OMAP3430_EN_IO_CHAIN, WKUP_MOD, PM_WKEN);
+               /* Do a readback to assure write has been done */
+               prm_read_mod_reg(WKUP_MOD, PM_WKEN);
+
+               while (!(prm_read_mod_reg(WKUP_MOD, PM_WKST) &
+                        OMAP3430_ST_IO_CHAIN)) {
+                       timeout++;
+                       if (timeout > 1000) {
+                               printk(KERN_ERR "Wake up daisy chain "
+                                      "activation failed.\n");
+                               return;
+                       }
+                       prm_set_mod_reg_bits(OMAP3430_ST_IO_CHAIN,
+                                            WKUP_MOD, PM_WKST);
+               }
+       }
+}
+
+static void omap3_disable_io_chain(void)
+{
+       if (omap_rev() >= OMAP3430_REV_ES3_1)
+               prm_clear_mod_reg_bits(OMAP3430_EN_IO_CHAIN, WKUP_MOD, PM_WKEN);
+}
+
 static void omap3_core_save_context(void)
 {
        u32 control_padconf_off;
@@ -367,8 +396,9 @@ static void omap_sram_idle(void)
                        omap3_core_save_context();
                        omap3_prcm_save_context();
                }
-               /* Enable IO-PAD wakeup */
+               /* Enable IO-PAD and IO-CHAIN wakeups */
                prm_set_mod_reg_bits(OMAP3430_EN_IO, WKUP_MOD, PM_WKEN);
+               omap3_enable_io_chain();
        }
 
        /*
@@ -432,9 +462,11 @@ static void omap_sram_idle(void)
                        pwrdm_set_next_pwrst(per_pwrdm, PWRDM_POWER_OFF);
        }
 
-       /* Disable IO-PAD wakeup */
-       if (core_next_state < PWRDM_POWER_ON)
+       /* Disable IO-PAD and IO-CHAIN wakeup */
+       if (core_next_state < PWRDM_POWER_ON) {
                prm_clear_mod_reg_bits(OMAP3430_EN_IO, WKUP_MOD, PM_WKEN);
+               omap3_disable_io_chain();
+       }
 
        pwrdm_post_transition();
 
index 9fd03a2..8f21bae 100644 (file)
 /* PM_PREPWSTST_GFX specific bits */
 
 /* PM_WKEN_WKUP specific bits */
+#define OMAP3430_EN_IO_CHAIN                           (1 << 16)
 #define OMAP3430_EN_IO                                 (1 << 8)
 #define OMAP3430_EN_GPIO1                              (1 << 3)
 
 /* PM_IVA2GRPSEL_WKUP specific bits */
 
 /* PM_WKST_WKUP specific bits */
+#define OMAP3430_ST_IO_CHAIN                           (1 << 16)
 #define OMAP3430_ST_IO                                 (1 << 8)
 
 /* PRM_CLKSEL */