diff options
author | Philippe Langlais <philippe.langlais@linaro.org> | 2011-05-04 16:50:16 +0200 |
---|---|---|
committer | Ulf Hansson <ulf.hansson@stericsson.com> | 2011-09-19 15:14:55 +0200 |
commit | 0c46c85ad0ab52370ccea4c1a6ea48cfc0393646 (patch) | |
tree | 7afa68fb4798e67642d037da9a9ec03267001d90 /arch/arm/mach-ux500/board-mop500-pins.c | |
parent | 88f8f087a5b61fb5629a3f232b5dedf039c603d7 (diff) |
mach-ux500: Force GPIO power settings in suspend
In order to get good power consumption when the
system is in suspend this patch forces the correct
power save settings. This should not be needed in
the long when all drivers uses pm_runtime to
control their GPIO sleep settings
ST-Ericsson ID: 323382
Change-Id: Ib8d7e2089c157a36697ddf27d622e0f7c08cca58
Signed-off-by: Rickard Andersson <rickard.andersson@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/17700
Reviewed-by: Martin PERSSON <martin.persson@stericsson.com>
Conflicts:
arch/arm/mach-ux500/board-mop500-pins.c
Diffstat (limited to 'arch/arm/mach-ux500/board-mop500-pins.c')
-rw-r--r-- | arch/arm/mach-ux500/board-mop500-pins.c | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/arch/arm/mach-ux500/board-mop500-pins.c b/arch/arm/mach-ux500/board-mop500-pins.c index b6a5000cd22..a65a1e0e32a 100644 --- a/arch/arm/mach-ux500/board-mop500-pins.c +++ b/arch/arm/mach-ux500/board-mop500-pins.c @@ -7,9 +7,12 @@ #include <linux/kernel.h> #include <linux/init.h> #include <linux/gpio.h> +#include <linux/io.h> #include <asm/mach-types.h> #include <plat/pincfg.h> +#include <plat/gpio.h> + #include <mach/hardware.h> #include "pins-db8500.h" @@ -342,6 +345,232 @@ static pin_cfg_t snowball_pins[] = { GPIO216_GPIO | PIN_INPUT_PULLUP,/* WLAN_IRQ */ }; +/* + * This function is called to force gpio power save + * settings during suspend. + * This is a temporary solution until all drivers are + * controlling their pin settings when in inactive mode. + */ +void mop500_pins_suspend_force(void) +{ + u32 bankaddr; + u32 w_imsc; + u32 imsc; + + /* + * Apply HSI GPIO Config for DeepSleep + * + * Bank0 + */ + bankaddr = IO_ADDRESS(U8500_GPIOBANK0_BASE); + + w_imsc = readl(bankaddr + NMK_GPIO_RWIMSC) | + readl(bankaddr + NMK_GPIO_FWIMSC); + + imsc = readl(bankaddr + NMK_GPIO_RIMSC) | + readl(bankaddr + NMK_GPIO_FIMSC); + + writel(0x409C702A & ~w_imsc, bankaddr + NMK_GPIO_DIR); + writel(0x001C002A & ~w_imsc, bankaddr + NMK_GPIO_DATS); + writel(0x807000 & ~w_imsc, bankaddr + NMK_GPIO_DATC); + writel(0x5FFFFFFF & ~w_imsc & ~imsc, bankaddr + NMK_GPIO_PDIS); + writel(0 , bankaddr + NMK_GPIO_SLPC); + + /* Bank1 */ + bankaddr = IO_ADDRESS(U8500_GPIOBANK1_BASE); + + w_imsc = readl(bankaddr + NMK_GPIO_RWIMSC) | + readl(bankaddr + NMK_GPIO_FWIMSC); + + imsc = readl(bankaddr + NMK_GPIO_RIMSC) | + readl(bankaddr + NMK_GPIO_FIMSC); + + writel(0x3 & ~w_imsc, bankaddr + NMK_GPIO_DIRS); + writel(0x1C , bankaddr + NMK_GPIO_DIRC); + writel(0x2 & ~w_imsc, bankaddr + NMK_GPIO_DATC); + writel(0xFFFFFFFF & ~w_imsc & ~imsc, bankaddr + NMK_GPIO_PDIS); + writel(0 , bankaddr + NMK_GPIO_SLPC); + + /* Bank2 */ + + bankaddr = IO_ADDRESS(U8500_GPIOBANK2_BASE); + + w_imsc = readl(bankaddr + NMK_GPIO_RWIMSC) | + readl(bankaddr + NMK_GPIO_FWIMSC); + + imsc = readl(bankaddr + NMK_GPIO_RIMSC) | + readl(bankaddr + NMK_GPIO_FIMSC); + + writel(0x3D7C0 & ~w_imsc, bankaddr + NMK_GPIO_DIRS); + writel(0x803C2830, bankaddr + NMK_GPIO_DIRC); + writel(0x3D7C0 & ~w_imsc , bankaddr + NMK_GPIO_DATC); + writel(0xFFFFFFFF & ~w_imsc & ~imsc, bankaddr + NMK_GPIO_PDIS); + writel(0 , bankaddr + NMK_GPIO_SLPC); + + /* Bank3 */ + bankaddr = IO_ADDRESS(U8500_GPIOBANK3_BASE); + + w_imsc = readl(bankaddr + NMK_GPIO_RWIMSC) | + readl(bankaddr + NMK_GPIO_FWIMSC); + + imsc = readl(bankaddr + NMK_GPIO_RIMSC) | + readl(bankaddr + NMK_GPIO_FIMSC); + + writel(0x3 & ~w_imsc, bankaddr + NMK_GPIO_DIRS); + writel(0x3 & ~w_imsc, bankaddr + NMK_GPIO_DATC); + writel(0xFFFFFFFF & ~w_imsc & ~imsc, bankaddr + NMK_GPIO_PDIS); + writel(0 , bankaddr + NMK_GPIO_SLPC); + + /* Bank4 */ + bankaddr = IO_ADDRESS(U8500_GPIOBANK4_BASE); + + w_imsc = readl(bankaddr + NMK_GPIO_RWIMSC) | + readl(bankaddr + NMK_GPIO_FWIMSC); + + imsc = readl(bankaddr + NMK_GPIO_RIMSC) | + readl(bankaddr + NMK_GPIO_FIMSC); + + writel(0x5E000 & ~w_imsc, bankaddr + NMK_GPIO_DIRS); + writel(0xFFDA1800 , bankaddr + NMK_GPIO_DIRC); + writel(0x4E000 & ~w_imsc, bankaddr + NMK_GPIO_DATC); + writel(0x10000 & ~w_imsc, bankaddr + NMK_GPIO_DATS); + writel(0xFFFFFFF9 & ~w_imsc & ~imsc, bankaddr + NMK_GPIO_PDIS); + writel(0 , bankaddr + NMK_GPIO_SLPC); + + /* Bank5 */ + bankaddr = IO_ADDRESS(U8500_GPIOBANK5_BASE); + + w_imsc = readl(bankaddr + NMK_GPIO_RWIMSC) | + readl(bankaddr + NMK_GPIO_FWIMSC); + + imsc = readl(bankaddr + NMK_GPIO_RIMSC) | + readl(bankaddr + NMK_GPIO_FIMSC); + + writel(0x3FF , bankaddr + NMK_GPIO_DIRC); + writel(0xC00 & ~w_imsc, bankaddr + NMK_GPIO_DIRS); + writel(0xC00 & ~w_imsc, bankaddr + NMK_GPIO_DATC); + writel(0xFFFFFFFF & ~w_imsc & ~imsc, bankaddr + NMK_GPIO_PDIS); + writel(0 , bankaddr + NMK_GPIO_SLPC); + + /* Bank6 */ + bankaddr = IO_ADDRESS(U8500_GPIOBANK6_BASE); + + w_imsc = readl(bankaddr + NMK_GPIO_RWIMSC) | + readl(bankaddr + NMK_GPIO_FWIMSC); + + imsc = readl(bankaddr + NMK_GPIO_RIMSC) | + readl(bankaddr + NMK_GPIO_FIMSC); + + writel(0x8810810 & ~w_imsc, bankaddr + NMK_GPIO_DIRS); + writel(0xF57EF7EF, bankaddr + NMK_GPIO_DIRC); + writel(0x8810810 & ~w_imsc, bankaddr + NMK_GPIO_DATC); + writel(0xFFFFFFFF & ~w_imsc & ~imsc, bankaddr + NMK_GPIO_PDIS); + writel(0 , bankaddr + NMK_GPIO_SLPC); + + + /* Bank7 */ + bankaddr = IO_ADDRESS(U8500_GPIOBANK7_BASE); + + w_imsc = readl(bankaddr + NMK_GPIO_RWIMSC) | + readl(bankaddr + NMK_GPIO_FWIMSC); + + imsc = readl(bankaddr + NMK_GPIO_RIMSC) | + readl(bankaddr + NMK_GPIO_FIMSC); + + writel(0x1C & ~w_imsc, bankaddr + NMK_GPIO_DIRS); + writel(0x63 , bankaddr + NMK_GPIO_DIRC); + writel(0x18 & ~w_imsc, bankaddr + NMK_GPIO_DATC); + writel(0xFFFFFFFF & ~w_imsc & ~imsc, bankaddr + NMK_GPIO_PDIS); + writel(0 , bankaddr + NMK_GPIO_SLPC); + + /* Bank8 */ + bankaddr = IO_ADDRESS(U8500_GPIOBANK8_BASE); + + w_imsc = readl(bankaddr + NMK_GPIO_RWIMSC) | + readl(bankaddr + NMK_GPIO_FWIMSC); + + imsc = readl(bankaddr + NMK_GPIO_RIMSC) | + readl(bankaddr + NMK_GPIO_FIMSC); + + writel(0x2 & ~w_imsc, bankaddr + NMK_GPIO_DIRS); + writel(0xFF0 , bankaddr + NMK_GPIO_DIRC); + writel(0x2 & ~w_imsc, bankaddr + NMK_GPIO_DATS); + writel(0x2 & ~w_imsc & ~imsc, bankaddr + NMK_GPIO_PDIS); + writel(0 , bankaddr + NMK_GPIO_SLPC); +} + +/* + * This function is called to force gpio power save + * mux settings during suspend. + * This is a temporary solution until all drivers are + * controlling their pin settings when in inactive mode. + */ +void mop500_pins_suspend_force_mux(void) +{ + u32 bankaddr; + + + /* + * Apply HSI GPIO Config for DeepSleep + * + * Bank0 + */ + bankaddr = IO_ADDRESS(U8500_GPIOBANK0_BASE); + + writel(0xE0000000, bankaddr + NMK_GPIO_AFSLA); + writel(0xE0000000, bankaddr + NMK_GPIO_AFSLB); + + /* Bank1 */ + bankaddr = IO_ADDRESS(U8500_GPIOBANK1_BASE); + + 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); + + /* Bank3 */ + bankaddr = IO_ADDRESS(U8500_GPIOBANK3_BASE); + + writel(0 , bankaddr + NMK_GPIO_AFSLA); + writel(0 , bankaddr + NMK_GPIO_AFSLB); + + /* Bank4 */ + bankaddr = IO_ADDRESS(U8500_GPIOBANK4_BASE); + + writel(0x7FF , bankaddr + NMK_GPIO_AFSLA); + writel(0 , bankaddr + NMK_GPIO_AFSLB); + + /* Bank5 */ + bankaddr = IO_ADDRESS(U8500_GPIOBANK5_BASE); + + writel(0 , bankaddr + NMK_GPIO_AFSLA); + writel(0 , bankaddr + NMK_GPIO_AFSLB); + + /* Bank6 */ + bankaddr = IO_ADDRESS(U8500_GPIOBANK6_BASE); + + writel(0 , bankaddr + NMK_GPIO_AFSLA); + writel(0 , bankaddr + NMK_GPIO_AFSLB); + + /* Bank7 */ + bankaddr = IO_ADDRESS(U8500_GPIOBANK7_BASE); + + writel(0 , bankaddr + NMK_GPIO_AFSLA); + writel(0 , bankaddr + NMK_GPIO_AFSLB); + + /* Bank8 */ + bankaddr = IO_ADDRESS(U8500_GPIOBANK8_BASE); + + writel(0 , bankaddr + NMK_GPIO_AFSLA); + writel(0 , bankaddr + NMK_GPIO_AFSLB); + + +} + void __init mop500_pins_init(void) { nmk_config_pins(mop500_pins_common, |