Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3a7ec26b authored by Kalle Jokiniemi's avatar Kalle Jokiniemi Committed by Kevin Hilman
Browse files

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: default avatarKalle Jokiniemi <kalle.jokiniemi@digia.com>
Signed-off-by: default avatarKevin Hilman <khilman@deeprootsystems.com>
parent c16c3f67
Loading
Loading
Loading
Loading
+35 −3
Original line number Diff line number Diff line
@@ -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();

+2 −0
Original line number Diff line number Diff line
@@ -365,6 +365,7 @@
/* 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)

@@ -373,6 +374,7 @@
/* 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 */