From b7933349d0fd0f5e7fee1607c737cc8fd7ce5d96 Mon Sep 17 00:00:00 2001 From: Ranjani Vaidyanathan Date: Fri, 22 Oct 2010 07:55:11 -0500 Subject: 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 --- arch/arm/mach-mx5/devices.c | 5 ++++ arch/arm/mach-mx5/devices.h | 1 + arch/arm/mach-mx5/mx50_rdp.c | 64 +++++++++++++++++++++++++++++++++++++------- arch/arm/mach-mx5/pm.c | 23 ++++++---------- 4 files changed, 69 insertions(+), 24 deletions(-) (limited to 'arch') 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 #include #include +#include #include #include #include @@ -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; } -- cgit v1.2.3