diff options
author | eric miao <eric.miao@marvell.com> | 2008-03-10 21:46:28 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2008-04-19 06:29:05 -0400 |
commit | c0a596d6a138ea281bed4ff3018c07c45dd245a2 (patch) | |
tree | ab3c25663433bf8c3f16026d969f9722d4ecff92 /arch/arm/mach-pxa/pxa25x.c | |
parent | 9b02b2df0099c083ea40ba8c7068e3dcbe381302 (diff) |
[ARM] pxa: allow dynamic enable/disable of GPIO wakeup for pxa{25x,27x}
Changes include:
1. rename MFP_LPM_WAKEUP_ENABLE into MFP_LPM_CAN_WAKEUP to indicate
the board capability of this pin to wakeup the system
2. add gpio_set_wake() and keypad_set_wake() to allow dynamically
enable/disable wakeup from GPIOs and keypad GPIO
* these functions are currently kept in mfp-pxa2xx.c due to their
dependency to the MFP configuration
3. pxa2xx_mfp_config() only gives early warning if MFP_LPM_CAN_WAKEUP
is set on incorrect pins
So that the GPIO's wakeup capability is now decided by the following:
a) processor's capability: (only those GPIOs which have dedicated
bits within PWER/PRER/PFER can wakeup the system), this is
initialized by pxa{25x,27x}_init_mfp()
b) board design decides:
- whether the pin is designed to wakeup the system (some of
the GPIOs are configured as other functions, which is not
intended to be a wakeup source), by OR'ing the pin config
with MFP_LPM_CAN_WAKEUP
- which edge the pin is designed to wakeup the system, this
may depends on external peripherals/connections, which is
totally board specific; this is indicated by MFP_LPM_EDGE_*
c) the corresponding device's (most likely the gpio_keys.c) wakeup
attribute:
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/pxa25x.c')
-rw-r--r-- | arch/arm/mach-pxa/pxa25x.c | 23 |
1 files changed, 5 insertions, 18 deletions
diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c index 653a3b63d073..c486c3055cfb 100644 --- a/arch/arm/mach-pxa/pxa25x.c +++ b/arch/arm/mach-pxa/pxa25x.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <asm/hardware.h> | 26 | #include <asm/hardware.h> |
27 | #include <asm/arch/irqs.h> | 27 | #include <asm/arch/irqs.h> |
28 | #include <asm/arch/pxa-regs.h> | 28 | #include <asm/arch/pxa-regs.h> |
29 | #include <asm/arch/mfp-pxa25x.h> | ||
29 | #include <asm/arch/pm.h> | 30 | #include <asm/arch/pm.h> |
30 | #include <asm/arch/dma.h> | 31 | #include <asm/arch/dma.h> |
31 | 32 | ||
@@ -230,24 +231,10 @@ static inline void pxa25x_init_pm(void) {} | |||
230 | static int pxa25x_set_wake(unsigned int irq, unsigned int on) | 231 | static int pxa25x_set_wake(unsigned int irq, unsigned int on) |
231 | { | 232 | { |
232 | int gpio = IRQ_TO_GPIO(irq); | 233 | int gpio = IRQ_TO_GPIO(irq); |
233 | uint32_t gpio_bit, mask = 0; | 234 | uint32_t mask = 0; |
234 | 235 | ||
235 | if (gpio >= 0 && gpio <= 15) { | 236 | if (gpio >= 0 && gpio < 85) |
236 | gpio_bit = GPIO_bit(gpio); | 237 | return gpio_set_wake(gpio, on); |
237 | mask = gpio_bit; | ||
238 | if (on) { | ||
239 | if (GRER(gpio) | gpio_bit) | ||
240 | PRER |= gpio_bit; | ||
241 | else | ||
242 | PRER &= ~gpio_bit; | ||
243 | |||
244 | if (GFER(gpio) | gpio_bit) | ||
245 | PFER |= gpio_bit; | ||
246 | else | ||
247 | PFER &= ~gpio_bit; | ||
248 | } | ||
249 | goto set_pwer; | ||
250 | } | ||
251 | 238 | ||
252 | if (irq == IRQ_RTCAlrm) { | 239 | if (irq == IRQ_RTCAlrm) { |
253 | mask = PWER_RTC; | 240 | mask = PWER_RTC; |