diff options
Diffstat (limited to 'arch/arm/plat-nomadik/gpio.c')
-rw-r--r-- | arch/arm/plat-nomadik/gpio.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/arch/arm/plat-nomadik/gpio.c b/arch/arm/plat-nomadik/gpio.c index 977c8f9a07a2..014da39b6a88 100644 --- a/arch/arm/plat-nomadik/gpio.c +++ b/arch/arm/plat-nomadik/gpio.c | |||
@@ -118,8 +118,8 @@ static void __nmk_config_pin(struct nmk_gpio_chip *nmk_chip, unsigned offset, | |||
118 | [3] /* illegal */ = "??" | 118 | [3] /* illegal */ = "??" |
119 | }; | 119 | }; |
120 | static const char *slpmnames[] = { | 120 | static const char *slpmnames[] = { |
121 | [NMK_GPIO_SLPM_INPUT] = "input", | 121 | [NMK_GPIO_SLPM_INPUT] = "input/wakeup", |
122 | [NMK_GPIO_SLPM_NOCHANGE] = "no-change", | 122 | [NMK_GPIO_SLPM_NOCHANGE] = "no-change/no-wakeup", |
123 | }; | 123 | }; |
124 | 124 | ||
125 | int pin = PIN_NUM(cfg); | 125 | int pin = PIN_NUM(cfg); |
@@ -200,6 +200,10 @@ EXPORT_SYMBOL(nmk_config_pins); | |||
200 | * changed to an input (with pullup/down enabled) in sleep and deep sleep. If | 200 | * changed to an input (with pullup/down enabled) in sleep and deep sleep. If |
201 | * @mode is NMK_GPIO_SLPM_NOCHANGE, the pin remains in the state it was | 201 | * @mode is NMK_GPIO_SLPM_NOCHANGE, the pin remains in the state it was |
202 | * configured even when in sleep and deep sleep. | 202 | * configured even when in sleep and deep sleep. |
203 | * | ||
204 | * On DB8500v2 onwards, this setting loses the previous meaning and instead | ||
205 | * indicates if wakeup detection is enabled on the pin. Note that | ||
206 | * enable_irq_wake() will automatically enable wakeup detection. | ||
203 | */ | 207 | */ |
204 | int nmk_gpio_set_slpm(int gpio, enum nmk_gpio_slpm mode) | 208 | int nmk_gpio_set_slpm(int gpio, enum nmk_gpio_slpm mode) |
205 | { | 209 | { |
@@ -367,7 +371,27 @@ static void nmk_gpio_irq_unmask(unsigned int irq) | |||
367 | 371 | ||
368 | static int nmk_gpio_irq_set_wake(unsigned int irq, unsigned int on) | 372 | static int nmk_gpio_irq_set_wake(unsigned int irq, unsigned int on) |
369 | { | 373 | { |
370 | return nmk_gpio_irq_modify(irq, WAKE, on); | 374 | struct nmk_gpio_chip *nmk_chip; |
375 | unsigned long flags; | ||
376 | int gpio; | ||
377 | |||
378 | gpio = NOMADIK_IRQ_TO_GPIO(irq); | ||
379 | nmk_chip = get_irq_chip_data(irq); | ||
380 | if (!nmk_chip) | ||
381 | return -EINVAL; | ||
382 | |||
383 | spin_lock_irqsave(&nmk_chip->lock, flags); | ||
384 | #ifdef CONFIG_ARCH_U8500 | ||
385 | if (cpu_is_u8500v2()) { | ||
386 | __nmk_gpio_set_slpm(nmk_chip, gpio, | ||
387 | on ? NMK_GPIO_SLPM_WAKEUP_ENABLE | ||
388 | : NMK_GPIO_SLPM_WAKEUP_DISABLE); | ||
389 | } | ||
390 | #endif | ||
391 | __nmk_gpio_irq_modify(nmk_chip, gpio, WAKE, on); | ||
392 | spin_unlock_irqrestore(&nmk_chip->lock, flags); | ||
393 | |||
394 | return 0; | ||
371 | } | 395 | } |
372 | 396 | ||
373 | static int nmk_gpio_irq_set_type(unsigned int irq, unsigned int type) | 397 | static int nmk_gpio_irq_set_type(unsigned int irq, unsigned int type) |