summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRickard Andersson <rickard.andersson@stericsson.com>2011-05-02 16:18:19 +0200
committerHenrik Aberg <henrik.aberg@stericsson.com>2011-05-18 09:40:15 +0200
commit95769f26527700c1eb1564018db575e7db461d2c (patch)
tree8e6ee0e0ca00b392659c5d5517546d2a44e0ca87
parente4536e1494836274547f6d28d8497f1a9e84ce60 (diff)
arm: ux500: Configure modem STM pins correctly in sleep
Modem STM pins was not correctly configured for the sleep states ApSleep and ApDeepSleep. This is now fixed both for suspend and cpuidle. ST Ericsson ID: 323509 ST Ericsson FOSS-OUT ID: trivial ST Ericsson Linux next: - Change-Id: I48e8bd3f00e2a6320d8d41a61acee271d4c81d91 Signed-off-by: Rickard Andersson <rickard.andersson@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/22434 Reviewed-by: QATEST Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
-rw-r--r--arch/arm/mach-ux500/board-mop500-pins.c14
-rw-r--r--arch/arm/mach-ux500/devices-db8500.c14
-rw-r--r--arch/arm/mach-ux500/pm/context.c11
-rw-r--r--arch/arm/plat-nomadik/include/plat/pincfg.h1
4 files changed, 20 insertions, 20 deletions
diff --git a/arch/arm/mach-ux500/board-mop500-pins.c b/arch/arm/mach-ux500/board-mop500-pins.c
index 54167c2dfc5..b1526c21492 100644
--- a/arch/arm/mach-ux500/board-mop500-pins.c
+++ b/arch/arm/mach-ux500/board-mop500-pins.c
@@ -452,7 +452,6 @@ static void mop500_pins_suspend_force(void)
writel(0 , bankaddr + NMK_GPIO_SLPC);
/* Bank2 */
-
bankaddr = IO_ADDRESS(U8500_GPIOBANK2_BASE);
w_imsc = readl(bankaddr + NMK_GPIO_RWIMSC) |
@@ -470,7 +469,12 @@ static void mop500_pins_suspend_force(void)
writel(0x803C2830 & ~mask, bankaddr + NMK_GPIO_DIRC);
writel(0x3D7C0 & ~w_imsc & ~mask, bankaddr + NMK_GPIO_DATC);
writel(0xFFFFFFFF & ~w_imsc & ~imsc & ~mask, bankaddr + NMK_GPIO_PDIS);
- writel(0 , bankaddr + NMK_GPIO_SLPC);
+ /*
+ * No need to set SLPC (SLPM) register. This can break modem STM
+ * settings on pins (70-76) because modem is special and needs to
+ * have its mux connected even in suspend because modem could still
+ * be on and might send interesting STM debugging data.
+ */
/* Bank3 */
bankaddr = IO_ADDRESS(U8500_GPIOBANK3_BASE);
@@ -608,11 +612,7 @@ static void mop500_pins_suspend_force_mux(void)
writel(0x1 , bankaddr + NMK_GPIO_AFSLA);
writel(0x1 , bankaddr + NMK_GPIO_AFSLB);
- /* Bank2 */
- bankaddr = IO_ADDRESS(U8500_GPIOBANK2_BASE);
-
- writel(0 , bankaddr + NMK_GPIO_AFSLA);
- writel(0 , bankaddr + NMK_GPIO_AFSLB);
+ /* Bank2 (Nothing needs to be done) */
/* Bank3 */
bankaddr = IO_ADDRESS(U8500_GPIOBANK3_BASE);
diff --git a/arch/arm/mach-ux500/devices-db8500.c b/arch/arm/mach-ux500/devices-db8500.c
index c6287d71d7c..dde1cfd66fd 100644
--- a/arch/arm/mach-ux500/devices-db8500.c
+++ b/arch/arm/mach-ux500/devices-db8500.c
@@ -617,13 +617,13 @@ struct platform_device u8500_ske_keypad_device = {
#ifdef CONFIG_STM_TRACE
static pin_cfg_t mop500_stm_mipi34_pins[] = {
- GPIO70_STMAPE_CLK,
- GPIO71_STMAPE_DAT3,
- GPIO72_STMAPE_DAT2,
- GPIO73_STMAPE_DAT1,
- GPIO74_STMAPE_DAT0,
- GPIO75_U2_RXD,
- GPIO76_U2_TXD,
+ GPIO70_STMAPE_CLK | PIN_SLPM_USE_MUX_SETTINGS_IN_SLEEP,
+ GPIO71_STMAPE_DAT3 | PIN_SLPM_USE_MUX_SETTINGS_IN_SLEEP,
+ GPIO72_STMAPE_DAT2 | PIN_SLPM_USE_MUX_SETTINGS_IN_SLEEP,
+ GPIO73_STMAPE_DAT1 | PIN_SLPM_USE_MUX_SETTINGS_IN_SLEEP,
+ GPIO74_STMAPE_DAT0 | PIN_SLPM_USE_MUX_SETTINGS_IN_SLEEP,
+ GPIO75_U2_RXD | PIN_SLPM_USE_MUX_SETTINGS_IN_SLEEP,
+ GPIO76_U2_TXD | PIN_SLPM_USE_MUX_SETTINGS_IN_SLEEP,
};
static pin_cfg_t mop500_stm_mipi60_pins[] = {
diff --git a/arch/arm/mach-ux500/pm/context.c b/arch/arm/mach-ux500/pm/context.c
index 89747b5a576..7ff2c5bf2ff 100644
--- a/arch/arm/mach-ux500/pm/context.c
+++ b/arch/arm/mach-ux500/pm/context.c
@@ -670,13 +670,15 @@ void context_gpio_restore_mux(void)
/*
* Safe sequence used to switch IOs between GPIO and Alternate-C mode:
- * - Save SLPM registers
- * - Set SLPM=0 for the IOs you want to switch and others to 1
+ * - Save SLPM registers (Not done.)
+ * - Set SLPM=0 for the IOs you want to switch. (We assume that all
+ * SLPM registers already are 0 except for the ones that wants to
+ * have the mux connected in sleep (e.g modem STM)).
* - Configure the GPIO registers for the IOs that are being switched
* - Set IOFORCE=1
* - Modify the AFLSA/B registers for the IOs that are being switched
* - Set IOFORCE=0
- * - Restore SLPM registers
+ * - Restore SLPM registers (Not done.)
* - Any spurious wake up event during switch sequence to be ignored
* and cleared
*/
@@ -691,14 +693,12 @@ void context_gpio_mux_safe_switch(bool begin)
if (begin) {
for (i = 0; i < GPIO_NUM_BANKS; i++) {
/* Save registers */
- slpc[i] = readl(gpio_bankaddr[i] + NMK_GPIO_SLPC);
rwimsc[i] = readl(gpio_bankaddr[i] + NMK_GPIO_RWIMSC);
fwimsc[i] = readl(gpio_bankaddr[i] + NMK_GPIO_FWIMSC);
/* Prevent spurious wakeups */
writel(0, gpio_bankaddr[i] + NMK_GPIO_RWIMSC);
writel(0, gpio_bankaddr[i] + NMK_GPIO_FWIMSC);
- writel(0, gpio_bankaddr[i] + NMK_GPIO_SLPC);
}
ux500_pm_prcmu_set_ioforce(true);
@@ -707,7 +707,6 @@ void context_gpio_mux_safe_switch(bool begin)
/* Restore wake up settings */
for (i = 0; i < GPIO_NUM_BANKS; i++) {
- writel(slpc[i], gpio_bankaddr[i] + NMK_GPIO_SLPC);
writel(rwimsc[i], gpio_bankaddr[i] + NMK_GPIO_RWIMSC);
writel(fwimsc[i], gpio_bankaddr[i] + NMK_GPIO_FWIMSC);
}
diff --git a/arch/arm/plat-nomadik/include/plat/pincfg.h b/arch/arm/plat-nomadik/include/plat/pincfg.h
index 22cb97d2d8a..e1bc46b274e 100644
--- a/arch/arm/plat-nomadik/include/plat/pincfg.h
+++ b/arch/arm/plat-nomadik/include/plat/pincfg.h
@@ -67,6 +67,7 @@ typedef unsigned long pin_cfg_t;
/* These two replace the above in DB8500v2+ */
#define PIN_SLPM_WAKEUP_ENABLE (NMK_GPIO_SLPM_WAKEUP_ENABLE << PIN_SLPM_SHIFT)
#define PIN_SLPM_WAKEUP_DISABLE (NMK_GPIO_SLPM_WAKEUP_DISABLE << PIN_SLPM_SHIFT)
+#define PIN_SLPM_USE_MUX_SETTINGS_IN_SLEEP PIN_SLPM_WAKEUP_DISABLE
#define PIN_DIR_SHIFT 14
#define PIN_DIR_MASK (0x1 << PIN_DIR_SHIFT)