summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorRanjani Vaidyanathan <ra5478@freescale.com>2010-10-22 07:55:11 -0500
committerJustin Waters <justin.waters@timesys.com>2010-12-13 16:10:35 -0500
commit1853252c517c4ce70ec9457806747db8a5d84418 (patch)
treed4c59cbc5bac90538e6387a4ffbc8085c2d58bc0 /arch
parent544291991515d0e29bc9a30b7b52ed4a558fa90e (diff)
ENGR00132875-2: MX50EVK:Add platform specific Suspend/Resume support
EIM IOMUX settings that improve the power numbers break keypad. Move the EIM IOMUX settings to platform specific functions called during suspend/resume. Signed-off-by: Ranjani Vaidyanathan <ra5478@freescale.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-mx5/devices.c5
-rw-r--r--arch/arm/mach-mx5/devices.h1
-rw-r--r--arch/arm/mach-mx5/mx50_rdp.c64
-rw-r--r--arch/arm/mach-mx5/pm.c23
4 files changed, 69 insertions, 24 deletions
diff --git a/arch/arm/mach-mx5/devices.c b/arch/arm/mach-mx5/devices.c
index 0ae180143de3..c0f88902a056 100644
--- a/arch/arm/mach-mx5/devices.c
+++ b/arch/arm/mach-mx5/devices.c
@@ -951,6 +951,11 @@ struct platform_device busfreq_device = {
.id = 0,
};
+struct platform_device pm_device = {
+ .name = "mx5_pm",
+ .id = 0,
+};
+
static struct resource mxc_m4if_resources[] = {
{
.start = M4IF_BASE_ADDR,
diff --git a/arch/arm/mach-mx5/devices.h b/arch/arm/mach-mx5/devices.h
index 27f9db9a0bb5..eaf99c9a564e 100644
--- a/arch/arm/mach-mx5/devices.h
+++ b/arch/arm/mach-mx5/devices.h
@@ -89,3 +89,4 @@ extern struct platform_device mxs_dma_apbh_device;
extern struct platform_device gpmi_nfc_device;
extern struct platform_device mxc_rngb_device;
extern struct platform_device dcp_device;
+extern struct platform_device pm_device;
diff --git a/arch/arm/mach-mx5/mx50_rdp.c b/arch/arm/mach-mx5/mx50_rdp.c
index 83c8db69c823..e698a8aed549 100644
--- a/arch/arm/mach-mx5/mx50_rdp.c
+++ b/arch/arm/mach-mx5/mx50_rdp.c
@@ -265,7 +265,6 @@ static struct pad_desc mx50_rdp[] = {
/* SGTL500_OSC_EN */
MX50_PAD_UART1_CTS__GPIO_6_8,
-
/* Keypad */
MX50_PAD_KEY_COL0__KEY_COL0,
MX50_PAD_KEY_ROW0__KEY_ROW0,
@@ -283,15 +282,7 @@ static struct pad_desc mx50_rdp[] = {
MX50_PAD_EIM_DA5__KEY_ROW6,
MX50_PAD_EIM_DA6__KEY_COL7,
MX50_PAD_EIM_DA7__KEY_ROW7,
-
/*EIM pads */
- MX50_PAD_EIM_DA0__GPIO_1_0,
- MX50_PAD_EIM_DA1__GPIO_1_1,
- MX50_PAD_EIM_DA2__GPIO_1_2,
- MX50_PAD_EIM_DA3__GPIO_1_3,
- MX50_PAD_EIM_DA4__GPIO_1_4,
- MX50_PAD_EIM_DA5__GPIO_1_5,
- MX50_PAD_EIM_DA7__GPIO_1_7,
MX50_PAD_EIM_DA8__GPIO_1_8,
MX50_PAD_EIM_DA9__GPIO_1_9,
MX50_PAD_EIM_DA10__GPIO_1_10,
@@ -333,6 +324,26 @@ static struct pad_desc mx50_gpmi_nand[] = {
MX50_PIN_SD3_WP__NANDF_RESETN,
};
+static struct pad_desc suspend_enter_pads[] = {
+ MX50_PAD_EIM_DA0__GPIO_1_0,
+ MX50_PAD_EIM_DA1__GPIO_1_1,
+ MX50_PAD_EIM_DA2__GPIO_1_2,
+ MX50_PAD_EIM_DA3__GPIO_1_3,
+ MX50_PAD_EIM_DA4__GPIO_1_4,
+ MX50_PAD_EIM_DA5__GPIO_1_5,
+ MX50_PAD_EIM_DA7__GPIO_1_7,
+};
+
+static struct pad_desc suspend_exit_pads[] = {
+ MX50_PAD_EIM_DA0__KEY_COL4,
+ MX50_PAD_EIM_DA1__KEY_ROW4,
+ MX50_PAD_EIM_DA2__KEY_COL5,
+ MX50_PAD_EIM_DA3__KEY_ROW5,
+ MX50_PAD_EIM_DA4__KEY_COL6,
+ MX50_PAD_EIM_DA5__KEY_ROW6,
+ MX50_PAD_EIM_DA7__KEY_ROW7,
+};
+
static struct mxc_dvfs_platform_data dvfs_core_data = {
.reg_id = "SW1",
.clk1_id = "cpu_clk",
@@ -1137,6 +1148,40 @@ static struct gpmi_nfc_platform_data gpmi_nfc_platform_data = {
.partition_count = 0,
};
+static void mx50_suspend_enter()
+{
+ struct pad_desc iomux_setting =
+ MX50_PAD_I2C3_SDA__GPIO_6_23;
+
+ /* Disable the Pull/keeper */
+ iomux_setting.pad_ctrl = 0xE;
+ mxc_iomux_v3_setup_pad(&iomux_setting);
+
+ mxc_iomux_v3_setup_multiple_pads(
+ suspend_enter_pads,
+ ARRAY_SIZE(suspend_enter_pads));
+}
+
+static void mx50_suspend_exit()
+{
+ struct pad_desc iomux_setting =
+ MX50_PAD_I2C3_SDA__GPIO_6_23;
+
+ mxc_iomux_v3_setup_multiple_pads(
+ suspend_exit_pads,
+ ARRAY_SIZE(suspend_exit_pads));
+
+ /* Enable the Pull/keeper */
+ iomux_setting.pad_ctrl = 0x8e;
+ mxc_iomux_v3_setup_pad(&iomux_setting);
+}
+
+static struct mxc_pm_platform_data mx50_pm_data = {
+ .suspend_enter = mx50_suspend_enter,
+ .suspend_exit = mx50_suspend_exit,
+};
+
+
/*!
* Board specific fixup function. It is called by \b setup_arch() in
* setup.c file very early on during kernel starts. It allows the user to
@@ -1256,6 +1301,7 @@ static void __init mxc_board_init(void)
mxc_register_device(&mxc_pxp_client_device, NULL);
mxc_register_device(&mxc_pxp_v4l2, NULL);
mxc_register_device(&busfreq_device, NULL);
+ mxc_register_device(&pm_device, &mx50_pm_data);
mxc_register_device(&mxc_dvfs_core_device, &dvfs_core_data);
if (enable_keypad)
diff --git a/arch/arm/mach-mx5/pm.c b/arch/arm/mach-mx5/pm.c
index 5636242ae544..8c964e82260e 100644
--- a/arch/arm/mach-mx5/pm.c
+++ b/arch/arm/mach-mx5/pm.c
@@ -21,6 +21,7 @@
#include <linux/proc_fs.h>
#include <linux/cpufreq.h>
#include <linux/iram_alloc.h>
+#include <linux/fsl_devices.h>
#include <asm/cacheflush.h>
#include <asm/tlb.h>
#include <asm/mach/map.h>
@@ -39,6 +40,7 @@
static struct cpu_wp *cpu_wp_tbl;
static struct clk *cpu_clk;
+static struct mxc_pm_platform_data *pm_data;
#if defined(CONFIG_CPU_FREQ)
static int org_freq;
@@ -94,23 +96,13 @@ static int mx5_suspend_enter(suspend_state_t state)
__raw_writel(0, MXC_SRPG_EMPGC1_SRPGCR);
} else {
/* Setup GPIO/IOMUX settings to lower power. */
- struct pad_desc cspi_keeper1 =
- MX50_PAD_I2C3_SDA__GPIO_6_23;
- /* Disable the Pull/keeper */
- cspi_keeper1.pad_ctrl = 0xE;
- mxc_iomux_v3_setup_pad(&cspi_keeper1);
-
- gpio_request(FEC_EN, "fec-en");
- gpio_direction_input(FEC_EN);
-
+ if (pm_data->suspend_enter)
+ pm_data->suspend_enter();
/* Suspend now. */
suspend_in_iram(databahn_base);
- /* Enable the Pull/keeper */
- cspi_keeper1.pad_ctrl = 0x8e;
- mxc_iomux_v3_setup_pad(&cspi_keeper1);
-
- gpio_direction_output(FEC_EN, 0);
+ if (pm_data->suspend_exit)
+ pm_data->suspend_exit();
}
} else {
cpu_do_idle();
@@ -186,10 +178,11 @@ struct platform_suspend_ops mx5_suspend_ops = {
.end = mx5_suspend_end,
};
-
static int __devinit mx5_pm_probe(struct platform_device *pdev)
{
pm_dev = &pdev->dev;
+ pm_data = pdev->dev.platform_data;
+
return 0;
}