summaryrefslogtreecommitdiff
path: root/arch/arm/mach-ux500/pm/context.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-ux500/pm/context.c')
-rw-r--r--arch/arm/mach-ux500/pm/context.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/arch/arm/mach-ux500/pm/context.c b/arch/arm/mach-ux500/pm/context.c
index e63fd4fbe8c..01040b6202f 100644
--- a/arch/arm/mach-ux500/pm/context.c
+++ b/arch/arm/mach-ux500/pm/context.c
@@ -32,6 +32,8 @@
#include "../product.h"
#include "../prcc.h"
+#include "../board-pins-sleep-force.h"
+
#define GPIO_NUM_BANKS 9
#define GPIO_NUM_SAVE_REGISTERS 7
@@ -638,6 +640,7 @@ void context_vape_restore(void)
void context_gpio_save(void)
{
int i;
+ unsigned int rimsc, fimsc;
for (i = 0; i < GPIO_NUM_BANKS; i++) {
gpio_save[i][0] = readl(gpio_bankaddr[i] + NMK_GPIO_AFSLA);
@@ -647,6 +650,22 @@ void context_gpio_save(void)
gpio_save[i][4] = readl(gpio_bankaddr[i] + NMK_GPIO_DAT);
gpio_save[i][6] = readl(gpio_bankaddr[i] + NMK_GPIO_SLPC);
}
+ /* Mask GPIO140 and GPIO32 which gives
+ * spurious interrupts during sleep
+ */
+ rimsc = readl(gpio_bankaddr[4] + NMK_GPIO_RIMSC);
+ fimsc = readl(gpio_bankaddr[4] + NMK_GPIO_FIMSC);
+ rimsc &= ~(0x1 << (140 % NMK_GPIO_PER_CHIP));
+ fimsc &= ~(0x1 << (140 % NMK_GPIO_PER_CHIP));
+ writel(rimsc, gpio_bankaddr[4] + NMK_GPIO_RIMSC);
+ writel(fimsc, gpio_bankaddr[4] + NMK_GPIO_FIMSC);
+
+ rimsc = readl(gpio_bankaddr[1] + NMK_GPIO_RIMSC);
+ fimsc = readl(gpio_bankaddr[1] + NMK_GPIO_FIMSC);
+ rimsc &= ~0x1;
+ fimsc &= ~0x1;
+ writel(rimsc, gpio_bankaddr[1] + NMK_GPIO_RIMSC);
+ writel(fimsc, gpio_bankaddr[1] + NMK_GPIO_FIMSC);
}
/*
@@ -660,6 +679,7 @@ void context_gpio_restore(void)
u32 pull_up;
u32 pull_down;
u32 pull;
+ unsigned int rimsc, fimsc;
for (i = 0; i < GPIO_NUM_BANKS; i++) {
writel(gpio_save[i][2], gpio_bankaddr[i] + NMK_GPIO_PDIS);
@@ -695,8 +715,23 @@ void context_gpio_restore(void)
writel(pull_down, gpio_bankaddr[i] + NMK_GPIO_DATC);
writel(gpio_save[i][6], gpio_bankaddr[i] + NMK_GPIO_SLPC);
-
}
+ /* Restore Masks for GPIO140 and GPIO32 which gives
+ * spurious interrupts during sleep
+ */
+ rimsc = readl(gpio_bankaddr[4] + NMK_GPIO_RIMSC);
+ fimsc = readl(gpio_bankaddr[4] + NMK_GPIO_FIMSC);
+ rimsc |= (0x1 << 140 % NMK_GPIO_PER_CHIP);
+ fimsc |= (0x1 << 140 % NMK_GPIO_PER_CHIP);
+ writel(rimsc, gpio_bankaddr[4] + NMK_GPIO_RIMSC);
+ writel(fimsc, gpio_bankaddr[4] + NMK_GPIO_FIMSC);
+
+ rimsc = readl(gpio_bankaddr[1] + NMK_GPIO_RIMSC);
+ fimsc = readl(gpio_bankaddr[1] + NMK_GPIO_FIMSC);
+ rimsc |= 0x1;
+ fimsc |= 0x1;
+ writel(rimsc, gpio_bankaddr[1] + NMK_GPIO_RIMSC);
+ writel(fimsc, gpio_bankaddr[1] + NMK_GPIO_FIMSC);
}
/*