diff options
author | Rabin Vincent <rabin.vincent@stericsson.com> | 2011-05-02 16:19:44 +0530 |
---|---|---|
committer | Henrik Aberg <henrik.aberg@stericsson.com> | 2011-05-18 09:40:13 +0200 |
commit | 73b6e8443281c09beacf3064e0e53181ce26c790 (patch) | |
tree | d405d7cf31f120c84ef6a98dffed29b71c2e5c4b | |
parent | c4516a2dade14df50b76a603427c0f94208970fb (diff) |
ux500: pm: access the "force pins in suspend" functions indrectly
To allow the suspend code to be built for DB5500 (and also on
other 8500 boards).
ST-Ericsson Linux next: -
ST-Ericsson ID: WP257121
ST-Ericsson FOSS-OUT ID: Trivial
Change-Id: I1684cabaf00bb202689a72b9fb0e30e4baae1ff5
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/22014
Tested-by: Rabin VINCENT <rabin.vincent@stericsson.com>
Reviewed-by: QATEST
Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
Reviewed-by: Rickard ANDERSSON <rickard.andersson@stericsson.com>
-rw-r--r-- | arch/arm/mach-ux500/board-mop500-pins.c | 8 | ||||
-rw-r--r-- | arch/arm/mach-ux500/include/mach/suspend.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-ux500/pm/suspend.c | 47 |
3 files changed, 36 insertions, 20 deletions
diff --git a/arch/arm/mach-ux500/board-mop500-pins.c b/arch/arm/mach-ux500/board-mop500-pins.c index 4a313f60b8a..54167c2dfc5 100644 --- a/arch/arm/mach-ux500/board-mop500-pins.c +++ b/arch/arm/mach-ux500/board-mop500-pins.c @@ -15,6 +15,7 @@ #include <plat/gpio.h> #include <mach/hardware.h> +#include <mach/suspend.h> #include "pins-db8500.h" #include "pins.h" @@ -403,7 +404,7 @@ static struct ux500_pin_lookup mop500_pins[] = { * This is a temporary solution until all drivers are * controlling their pin settings when in inactive mode. */ -void mop500_pins_suspend_force(void) +static void mop500_pins_suspend_force(void) { u32 bankaddr; u32 w_imsc; @@ -586,7 +587,7 @@ void mop500_pins_suspend_force(void) * This is a temporary solution until all drivers are * controlling their pin settings when in inactive mode. */ -void mop500_pins_suspend_force_mux(void) +static void mop500_pins_suspend_force_mux(void) { u32 bankaddr; @@ -692,5 +693,8 @@ void __init mop500_pins_init(void) default: break; } + + suspend_set_pins_force_fn(mop500_pins_suspend_force, + mop500_pins_suspend_force_mux); } diff --git a/arch/arm/mach-ux500/include/mach/suspend.h b/arch/arm/mach-ux500/include/mach/suspend.h index f001d49a294..582fa324df3 100644 --- a/arch/arm/mach-ux500/include/mach/suspend.h +++ b/arch/arm/mach-ux500/include/mach/suspend.h @@ -8,5 +8,6 @@ void suspend_block_sleep(void); void suspend_unblock_sleep(void); +void suspend_set_pins_force_fn(void (*force)(void), void (*force_mux)(void)); #endif /* __MACH_SUSPEND_H */ diff --git a/arch/arm/mach-ux500/pm/suspend.c b/arch/arm/mach-ux500/pm/suspend.c index bb7a10e0fdd..6b5659e318e 100644 --- a/arch/arm/mach-ux500/pm/suspend.c +++ b/arch/arm/mach-ux500/pm/suspend.c @@ -21,8 +21,14 @@ #include "pm.h" #include "suspend_dbg.h" -extern void mop500_pins_suspend_force(void); -extern void mop500_pins_suspend_force_mux(void); +static void (*pins_suspend_force)(void); +static void (*pins_suspend_force_mux)(void); + +void suspend_set_pins_force_fn(void (*force)(void), void (*force_mux)(void)) +{ + pins_suspend_force = force; + pins_suspend_force_mux = force_mux; +} static atomic_t block_sleep = ATOMIC_INIT(0); @@ -43,6 +49,7 @@ static bool sleep_is_blocked(void) static int suspend(bool do_deepsleep) { + bool pins_force = pins_suspend_force_mux && pins_suspend_force; int ret = 0; u32 divps_rate; @@ -61,19 +68,21 @@ static int suspend(bool do_deepsleep) context_vape_save(); - /* - * Save GPIO settings before applying power save - * settings - */ - context_gpio_save(); + if (pins_force) { + /* + * Save GPIO settings before applying power save + * settings + */ + context_gpio_save(); - /* Apply GPIO power save mux settings */ - context_gpio_mux_safe_switch(true); - mop500_pins_suspend_force_mux(); - context_gpio_mux_safe_switch(false); + /* Apply GPIO power save mux settings */ + context_gpio_mux_safe_switch(true); + pins_suspend_force_mux(); + context_gpio_mux_safe_switch(false); - /* Apply GPIO power save settings */ - mop500_pins_suspend_force(); + /* Apply GPIO power save settings */ + pins_suspend_force(); + } ux500_pm_gic_decouple(); @@ -135,11 +144,13 @@ static int suspend(bool do_deepsleep) ux500_pm_prcmu_set_ioforce(false); exit: - /* Restore gpio settings */ - context_gpio_mux_safe_switch(true); - context_gpio_restore_mux(); - context_gpio_mux_safe_switch(false); - context_gpio_restore(); + if (pins_force) { + /* Restore gpio settings */ + context_gpio_mux_safe_switch(true); + context_gpio_restore_mux(); + context_gpio_mux_safe_switch(false); + context_gpio_restore(); + } /* This is what cpuidle wants */ prcmu_enable_wakeups(PRCMU_WAKEUP(ARM) | PRCMU_WAKEUP(RTC) | |