diff options
author | eric miao <eric.y.miao@gmail.com> | 2007-08-29 05:22:17 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2007-10-12 16:15:33 -0400 |
commit | c95530c7798b760901c5d6212e528b03e323b8ac (patch) | |
tree | 9bb58fcfaa0b7d44da117d94fc2b7606bbb9d98e /arch/arm/mach-pxa/pxa25x.c | |
parent | 30f0b40844e5add7ad879e2f5939ff498f72f3e6 (diff) |
[ARM] 4560/1: pxa: move processor specific set_wake logic out of irq.c
a function pxa_init_irq_set_wake() was introduced, so that
processor specific code could install their own version
code setting PFER and PRER registers within pxa_gpio_irq_type
are removed, and the edge configuration is postponed to the
(*set_wake) and copies the GRER and GFER register, which will
always be set up correctly by pxa_gpio_irq_type()
Signed-off-by: eric miao <eric.y.miao@gmail.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 | 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 = { |