OMAP3: PM: Enable IO-CHAIN wakeup
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>
This commit is contained in:
committed by
Kevin Hilman
parent
c16c3f672d
commit
3a7ec26bb4
@@ -94,6 +94,35 @@ static inline void omap3_per_restore_context(void)
|
|||||||
omap_gpio_restore_context();
|
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)
|
static void omap3_core_save_context(void)
|
||||||
{
|
{
|
||||||
u32 control_padconf_off;
|
u32 control_padconf_off;
|
||||||
@@ -367,8 +396,9 @@ static void omap_sram_idle(void)
|
|||||||
omap3_core_save_context();
|
omap3_core_save_context();
|
||||||
omap3_prcm_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);
|
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);
|
pwrdm_set_next_pwrst(per_pwrdm, PWRDM_POWER_OFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disable IO-PAD wakeup */
|
/* Disable IO-PAD and IO-CHAIN wakeup */
|
||||||
if (core_next_state < PWRDM_POWER_ON)
|
if (core_next_state < PWRDM_POWER_ON) {
|
||||||
prm_clear_mod_reg_bits(OMAP3430_EN_IO, WKUP_MOD, PM_WKEN);
|
prm_clear_mod_reg_bits(OMAP3430_EN_IO, WKUP_MOD, PM_WKEN);
|
||||||
|
omap3_disable_io_chain();
|
||||||
|
}
|
||||||
|
|
||||||
pwrdm_post_transition();
|
pwrdm_post_transition();
|
||||||
|
|
||||||
|
@@ -365,6 +365,7 @@
|
|||||||
/* PM_PREPWSTST_GFX specific bits */
|
/* PM_PREPWSTST_GFX specific bits */
|
||||||
|
|
||||||
/* PM_WKEN_WKUP specific bits */
|
/* PM_WKEN_WKUP specific bits */
|
||||||
|
#define OMAP3430_EN_IO_CHAIN (1 << 16)
|
||||||
#define OMAP3430_EN_IO (1 << 8)
|
#define OMAP3430_EN_IO (1 << 8)
|
||||||
#define OMAP3430_EN_GPIO1 (1 << 3)
|
#define OMAP3430_EN_GPIO1 (1 << 3)
|
||||||
|
|
||||||
@@ -373,6 +374,7 @@
|
|||||||
/* PM_IVA2GRPSEL_WKUP specific bits */
|
/* PM_IVA2GRPSEL_WKUP specific bits */
|
||||||
|
|
||||||
/* PM_WKST_WKUP specific bits */
|
/* PM_WKST_WKUP specific bits */
|
||||||
|
#define OMAP3430_ST_IO_CHAIN (1 << 16)
|
||||||
#define OMAP3430_ST_IO (1 << 8)
|
#define OMAP3430_ST_IO (1 << 8)
|
||||||
|
|
||||||
/* PRM_CLKSEL */
|
/* PRM_CLKSEL */
|
||||||
|
Reference in New Issue
Block a user