diff options
author | eric miao <eric.miao@marvell.com> | 2008-03-04 09:13:58 +0100 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2008-04-19 12:29:04 +0200 |
commit | 663707c1a99b23a79f9e21117b7c1bdbfe80a899 (patch) | |
tree | f864865940e4f5252b56ee295cf317cbb0c12631 /arch/arm/mach-pxa/gpio.c | |
parent | [ARM] pxa: merge assignment of set_wake into pxa_init_{irq,gpio}() (diff) | |
download | linux-663707c1a99b23a79f9e21117b7c1bdbfe80a899.tar.xz linux-663707c1a99b23a79f9e21117b7c1bdbfe80a899.zip |
[ARM] pxa: move GPIO sysdev outside of generic.c into gpio.c
Signed-off-by: eric miao <eric.miao@marvell.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/mach-pxa/gpio.c')
-rw-r--r-- | arch/arm/mach-pxa/gpio.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/arch/arm/mach-pxa/gpio.c b/arch/arm/mach-pxa/gpio.c index bf4c08408f2e..a98b2da4c962 100644 --- a/arch/arm/mach-pxa/gpio.c +++ b/arch/arm/mach-pxa/gpio.c @@ -15,6 +15,7 @@ #include <linux/init.h> #include <linux/module.h> #include <linux/irq.h> +#include <linux/sysdev.h> #include <asm/gpio.h> #include <asm/hardware.h> @@ -338,3 +339,59 @@ void __init pxa_init_gpio(int gpio_nr, set_wake_t fn) gpiochip_add(&pxa_gpio_chip[i].chip); } } + +#ifdef CONFIG_PM + +static unsigned long saved_gplr[4]; +static unsigned long saved_gpdr[4]; +static unsigned long saved_grer[4]; +static unsigned long saved_gfer[4]; + +static int pxa_gpio_suspend(struct sys_device *dev, pm_message_t state) +{ + int i, gpio; + + for (gpio = 0, i = 0; gpio < pxa_last_gpio; gpio += 32, i++) { + saved_gplr[i] = GPLR(gpio); + saved_gpdr[i] = GPDR(gpio); + saved_grer[i] = GRER(gpio); + saved_gfer[i] = GFER(gpio); + + /* Clear GPIO transition detect bits */ + GEDR(gpio) = GEDR(gpio); + } + return 0; +} + +static int pxa_gpio_resume(struct sys_device *dev) +{ + int i, gpio; + + for (gpio = 0, i = 0; gpio < pxa_last_gpio; gpio += 32, i++) { + /* restore level with set/clear */ + GPSR(gpio) = saved_gplr[i]; + GPCR(gpio) = ~saved_gplr[i]; + + GRER(gpio) = saved_grer[i]; + GFER(gpio) = saved_gfer[i]; + GPDR(gpio) = saved_gpdr[i]; + } + return 0; +} +#else +#define pxa_gpio_suspend NULL +#define pxa_gpio_resume NULL +#endif + +struct sysdev_class pxa_gpio_sysclass = { + .name = "gpio", + .suspend = pxa_gpio_suspend, + .resume = pxa_gpio_resume, +}; + +static int __init pxa_gpio_init(void) +{ + return sysdev_class_register(&pxa_gpio_sysclass); +} + +core_initcall(pxa_gpio_init); |