diff options
Diffstat (limited to 'arch/arm/mach-pxa/pxa25x.c')
| -rw-r--r-- | arch/arm/mach-pxa/pxa25x.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c index ef40c049d9e2..0d6a72504caa 100644 --- a/arch/arm/mach-pxa/pxa25x.c +++ b/arch/arm/mach-pxa/pxa25x.c | |||
| @@ -227,10 +227,52 @@ static void __init pxa25x_init_pm(void) | |||
| 227 | } | 227 | } |
| 228 | #endif | 228 | #endif |
| 229 | 229 | ||
| 230 | /* PXA25x: supports wakeup from GPIO0..GPIO15 and RTC alarm | ||
| 231 | */ | ||
| 232 | |||
| 233 | static int pxa25x_set_wake(unsigned int irq, unsigned int on) | ||
| 234 | { | ||
| 235 | int gpio = IRQ_TO_GPIO(irq); | ||
| 236 | uint32_t gpio_bit, mask = 0; | ||
| 237 | |||
| 238 | if (gpio >= 0 && gpio <= 15) { | ||
| 239 | gpio_bit = GPIO_bit(gpio); | ||
| 240 | mask = gpio_bit; | ||
| 241 | if (on) { | ||
| 242 | if (GRER(gpio) | gpio_bit) | ||
| 243 | PRER |= gpio_bit; | ||
| 244 | else | ||
| 245 | PRER &= ~gpio_bit; | ||
| 246 | |||
| 247 | if (GFER(gpio) | gpio_bit) | ||
| 248 | PFER |= gpio_bit; | ||
| 249 | else | ||
| 250 | PFER &= ~gpio_bit; | ||
| 251 | } | ||
| 252 | goto set_pwer; | ||
| 253 | } | ||
| 254 | |||
| 255 | if (irq == IRQ_RTCAlrm) { | ||
| 256 | mask = PWER_RTC; | ||
| 257 | goto set_pwer; | ||
| 258 | } | ||
| 259 | |||
| 260 | return -EINVAL; | ||
| 261 | |||
| 262 | set_pwer: | ||
| 263 | if (on) | ||
| 264 | PWER |= mask; | ||
| 265 | else | ||
| 266 | PWER &=~mask; | ||
| 267 | |||
| 268 | return 0; | ||
| 269 | } | ||
| 270 | |||
| 230 | void __init pxa25x_init_irq(void) | 271 | void __init pxa25x_init_irq(void) |
| 231 | { | 272 | { |
| 232 | pxa_init_irq_low(); | 273 | pxa_init_irq_low(); |
| 233 | pxa_init_irq_gpio(85); | 274 | pxa_init_irq_gpio(85); |
| 275 | pxa_init_irq_set_wake(pxa25x_set_wake); | ||
| 234 | } | 276 | } |
| 235 | 277 | ||
| 236 | static struct platform_device *pxa25x_devices[] __initdata = { | 278 | static struct platform_device *pxa25x_devices[] __initdata = { |
