summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRabin Vincent <rabin.vincent@stericsson.com>2011-05-02 16:19:44 +0530
committerHenrik Aberg <henrik.aberg@stericsson.com>2011-05-18 09:40:13 +0200
commit73b6e8443281c09beacf3064e0e53181ce26c790 (patch)
treed405d7cf31f120c84ef6a98dffed29b71c2e5c4b
parentc4516a2dade14df50b76a603427c0f94208970fb (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.c8
-rw-r--r--arch/arm/mach-ux500/include/mach/suspend.h1
-rw-r--r--arch/arm/mach-ux500/pm/suspend.c47
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) |