@@ -46,6 +46,7 @@
#include "sdram-qimonda-hyb18m512160af-6.h"
#include "mmc-twl4030.h"
#include "pm.h"
+#include "prm-regbits-34xx.h"
#include "omap3-opp.h"
#define SDP3430_TS_GPIO_IRQ_SDPV1 3
@@ -91,6 +92,85 @@ static struct cpuidle_params omap3_cpuidle_params_table[] = {
{10000, 30000, 300000},
};
+#ifdef CONFIG_PM
+/*
+ * Save the state of keypad
+ *
+ * TODO: This definition should ideally be in a header file, but
+ * matrix_keypad.h is not the right one. Also, plat/keypad.h
+ * is no longer used.
+ */
+struct omap_keypad_pm_state {
+ void __iomem *wk_st;
+ void __iomem *wk_en;
+ u32 wk_mask;
+ u32 padconf;
+};
+
+/*
+ * Board specific hook for keypad suspend
+ */
+void sdp3430_kp_suspend(void *ptr)
+{
+ struct omap_keypad_pm_state *pstate =
+ (struct omap_keypad_pm_state *)ptr;
+
+ if (pstate) {
+ /*
+ * Set wake-enable bit
+ */
+ if (pstate->wk_en && pstate->wk_mask) {
+ u32 v = __raw_readl(pstate->wk_en);
+ v |= pstate->wk_mask;
+ __raw_writel(v, pstate->wk_en);
+ }
+ /*
+ * Set corresponding IOPAD wakeup-enable
+ */
+ if (cpu_is_omap34xx() && pstate->padconf) {
+ u16 v = omap_ctrl_readw(pstate->padconf);
+ v |= OMAP3_PADCONF_WAKEUPENABLE0;
+ omap_ctrl_writew(v, pstate->padconf);
+ }
+ }
+}
+
+/*
+ * Board specific hook for keypad resume
+ */
+void sdp3430_kp_resume(void *ptr)
+{
+ struct omap_keypad_pm_state *pstate =
+ (struct omap_keypad_pm_state *)ptr;
+
+ if (pstate) {
+ /*
+ * Clear wake-enable bit
+ */
+ if (pstate->wk_en && pstate->wk_mask) {
+ u32 v = __raw_readl(pstate->wk_en);
+ v &= ~pstate->wk_mask;
+ __raw_writel(v, pstate->wk_en);
+ }
+ /*
+ * Clear corresponding IOPAD wakeup-enable
+ */
+ if (cpu_is_omap34xx() && pstate->padconf) {
+ u16 v = omap_ctrl_readw(pstate->padconf);
+ v &= ~OMAP3_PADCONF_WAKEUPENABLE0;
+ omap_ctrl_writew(v, pstate->padconf);
+ }
+ }
+}
+
+static struct omap_keypad_pm_state omap3evm_kp_pm_state = {
+ .wk_st = OMAP34XX_PRM_REGADDR(WKUP_MOD, PM_WKEN1),
+ .wk_en = OMAP34XX_PRM_REGADDR(WKUP_MOD, PM_WKST1),
+ .wk_mask = OMAP3430_EN_GPIO1,
+ .padconf = 0x1e0,
+};
+#endif /* CONFIG_PM */
+
static int board_keymap[] = {
KEY(0, 0, KEY_LEFT),
KEY(0, 1, KEY_RIGHT),
@@ -135,6 +215,15 @@ static struct twl4030_keypad_data sdp3430_kp_data = {
.rows = 5,
.cols = 6,
.rep = 1,
+#ifdef CONFIG_PM
+ .pm_state = (void *)&omap3evm_kp_pm_state,
+ .on_suspend = sdp3430_kp_suspend,
+ .on_resume = sdp3430_kp_resume,
+#else
+ .pm_state = NULL,
+ .on_suspend = NULL,
+ .on_resume = NULL,
+#endif /* CONFIG_PM */
};
static int ts_gpio; /* Needed for ads7846_get_pendown_state */