forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'gpio/merge' of git://git.secretlab.ca/git/linux-2.6
* 'gpio/merge' of git://git.secretlab.ca/git/linux-2.6: gpio/basic_mmio: add missing include of spinlock_types.h gpio/nomadik: fix sleepmode for elder Nomadik
- Loading branch information
Showing
4 changed files
with
34 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,6 +4,7 @@ | |
* Copyright (C) 2008,2009 STMicroelectronics | ||
* Copyright (C) 2009 Alessandro Rubini <[email protected]> | ||
* Rewritten based on work by Prafulla WADASKAR <[email protected]> | ||
* Copyright (C) 2011 Linus Walleij <[email protected]> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
|
@@ -49,6 +50,7 @@ struct nmk_gpio_chip { | |
u32 (*get_secondary_status)(unsigned int bank); | ||
void (*set_ioforce)(bool enable); | ||
spinlock_t lock; | ||
bool sleepmode; | ||
/* Keep track of configured edges */ | ||
u32 edge_rising; | ||
u32 edge_falling; | ||
|
@@ -393,14 +395,25 @@ EXPORT_SYMBOL(nmk_config_pins_sleep); | |
* @gpio: pin number | ||
* @mode: NMK_GPIO_SLPM_INPUT or NMK_GPIO_SLPM_NOCHANGE, | ||
* | ||
* Sets the sleep mode of a pin. If @mode is NMK_GPIO_SLPM_INPUT, the pin is | ||
* changed to an input (with pullup/down enabled) in sleep and deep sleep. If | ||
* @mode is NMK_GPIO_SLPM_NOCHANGE, the pin remains in the state it was | ||
* configured even when in sleep and deep sleep. | ||
* This register is actually in the pinmux layer, not the GPIO block itself. | ||
* The GPIO1B_SLPM register defines the GPIO mode when SLEEP/DEEP-SLEEP | ||
* mode is entered (i.e. when signal IOFORCE is HIGH by the platform code). | ||
* Each GPIO can be configured to be forced into GPIO mode when IOFORCE is | ||
* HIGH, overriding the normal setting defined by GPIO_AFSELx registers. | ||
* When IOFORCE returns LOW (by software, after SLEEP/DEEP-SLEEP exit), | ||
* the GPIOs return to the normal setting defined by GPIO_AFSELx registers. | ||
* | ||
* On DB8500v2 onwards, this setting loses the previous meaning and instead | ||
* indicates if wakeup detection is enabled on the pin. Note that | ||
* enable_irq_wake() will automatically enable wakeup detection. | ||
* If @mode is NMK_GPIO_SLPM_INPUT, the corresponding GPIO is switched to GPIO | ||
* mode when signal IOFORCE is HIGH (i.e. when SLEEP/DEEP-SLEEP mode is | ||
* entered) regardless of the altfunction selected. Also wake-up detection is | ||
* ENABLED. | ||
* | ||
* If @mode is NMK_GPIO_SLPM_NOCHANGE, the corresponding GPIO remains | ||
* controlled by NMK_GPIO_DATC, NMK_GPIO_DATS, NMK_GPIO_DIR, NMK_GPIO_PDIS | ||
* (for altfunction GPIO) or respective on-chip peripherals (for other | ||
* altfuncs) when IOFORCE is HIGH. Also wake-up detection DISABLED. | ||
* | ||
* Note that enable_irq_wake() will automatically enable wakeup detection. | ||
*/ | ||
int nmk_gpio_set_slpm(int gpio, enum nmk_gpio_slpm mode) | ||
{ | ||
|
@@ -551,6 +564,12 @@ static void __nmk_gpio_irq_modify(struct nmk_gpio_chip *nmk_chip, | |
static void __nmk_gpio_set_wake(struct nmk_gpio_chip *nmk_chip, | ||
int gpio, bool on) | ||
{ | ||
if (nmk_chip->sleepmode) { | ||
__nmk_gpio_set_slpm(nmk_chip, gpio - nmk_chip->chip.base, | ||
on ? NMK_GPIO_SLPM_WAKEUP_ENABLE | ||
: NMK_GPIO_SLPM_WAKEUP_DISABLE); | ||
} | ||
|
||
__nmk_gpio_irq_modify(nmk_chip, gpio, WAKE, on); | ||
} | ||
|
||
|
@@ -901,7 +920,7 @@ void nmk_gpio_wakeups_suspend(void) | |
writel(chip->fwimsc & chip->real_wake, | ||
chip->addr + NMK_GPIO_FWIMSC); | ||
|
||
if (cpu_is_u8500v2()) { | ||
if (chip->sleepmode) { | ||
chip->slpm = readl(chip->addr + NMK_GPIO_SLPC); | ||
|
||
/* 0 -> wakeup enable */ | ||
|
@@ -923,7 +942,7 @@ void nmk_gpio_wakeups_resume(void) | |
writel(chip->rwimsc, chip->addr + NMK_GPIO_RWIMSC); | ||
writel(chip->fwimsc, chip->addr + NMK_GPIO_FWIMSC); | ||
|
||
if (cpu_is_u8500v2()) | ||
if (chip->sleepmode) | ||
writel(chip->slpm, chip->addr + NMK_GPIO_SLPC); | ||
} | ||
} | ||
|
@@ -1010,6 +1029,7 @@ static int __devinit nmk_gpio_probe(struct platform_device *dev) | |
nmk_chip->secondary_parent_irq = secondary_irq; | ||
nmk_chip->get_secondary_status = pdata->get_secondary_status; | ||
nmk_chip->set_ioforce = pdata->set_ioforce; | ||
nmk_chip->sleepmode = pdata->supports_sleepmode; | ||
spin_lock_init(&nmk_chip->lock); | ||
|
||
chip = &nmk_chip->chip; | ||
|
@@ -1065,5 +1085,3 @@ core_initcall(nmk_gpio_init); | |
MODULE_AUTHOR("Prafulla WADASKAR and Alessandro Rubini"); | ||
MODULE_DESCRIPTION("Nomadik GPIO Driver"); | ||
MODULE_LICENSE("GPL"); | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters