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 = { |