diff options
author | Colin Cross <ccross@android.com> | 2010-08-18 00:19:27 -0700 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2013-09-14 00:46:47 -0700 |
commit | b52130e46621d87fb027f7b2fb9b03795b30c22e (patch) | |
tree | 85e6beb390f1781eef9d100151fd339512218d06 /drivers/gpio | |
parent | 9f577a50a6ccbab7a6c8a6021a067edc89602aa4 (diff) |
ARM: tegra: gpio: Add support for waking from suspend
Change-Id: Ifd11daa6eac4ca747aba4a4d98f41270b7055bbb
Signed-off-by: Colin Cross <ccross@android.com>
Rebase-Id: Rfbaad5ea8b92152b80a36966ce101568b1aee771
Diffstat (limited to 'drivers/gpio')
-rw-r--r-- | drivers/gpio/gpio-tegra.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/drivers/gpio/gpio-tegra.c b/drivers/gpio/gpio-tegra.c index 09810a1fd87e..93ab8fbb4bdf 100644 --- a/drivers/gpio/gpio-tegra.c +++ b/drivers/gpio/gpio-tegra.c @@ -31,6 +31,8 @@ #include <linux/pinctrl/consumer.h> #include <linux/pm.h> +#include "pm-irq.h" + #define GPIO_BANK(x) ((x) >> 5) #define GPIO_PORT(x) (((x) >> 3) & 0x3) #define GPIO_BIT(x) ((x) & 0x7) @@ -247,6 +249,8 @@ static int tegra_gpio_irq_set_type(struct irq_data *d, unsigned int type) else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) __irq_set_handler_locked(d->irq, handle_edge_irq); + tegra_pm_irq_set_wake_type(d->irq, type); + return 0; } @@ -338,11 +342,25 @@ static int tegra_gpio_suspend(struct device *dev) return 0; } -static int tegra_gpio_wake_enable(struct irq_data *d, unsigned int enable) +static int tegra_gpio_irq_set_wake(struct irq_data *d, unsigned int enable) { struct tegra_gpio_bank *bank = irq_data_get_irq_chip_data(d); - return irq_set_irq_wake(bank->irq, enable); + int ret = 0; + + ret = tegra_pm_irq_set_wake(d->irq, enable); + + if (ret) + return ret; + + ret = irq_set_irq_wake(bank->irq, enable); + + if (ret) + tegra_pm_irq_set_wake(d->irq, !enable); + + return ret; } +#else +#define tegra_gpio_irq_set_wake NULL #endif static struct irq_chip tegra_gpio_irq_chip = { @@ -351,9 +369,8 @@ static struct irq_chip tegra_gpio_irq_chip = { .irq_mask = tegra_gpio_irq_mask, .irq_unmask = tegra_gpio_irq_unmask, .irq_set_type = tegra_gpio_irq_set_type, -#ifdef CONFIG_PM_SLEEP - .irq_set_wake = tegra_gpio_wake_enable, -#endif + .irq_set_wake = tegra_gpio_irq_set_wake, + .flags = IRQCHIP_MASK_ON_SUSPEND, }; static const struct dev_pm_ops tegra_gpio_pm_ops = { |