diff options
Diffstat (limited to 'drivers/gpio/gpio-tegra.c')
-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 6b1e70e58e21..abc0ceeadac3 100644 --- a/drivers/gpio/gpio-tegra.c +++ b/drivers/gpio/gpio-tegra.c @@ -29,6 +29,8 @@ #include <mach/iomap.h> +#include "pm-irq.h" + #define GPIO_BANK(x) ((x) >> 5) #define GPIO_PORT(x) (((x) >> 3) & 0x3) #define GPIO_BIT(x) ((x) & 0x7) @@ -214,6 +216,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; } @@ -303,11 +307,25 @@ void tegra_gpio_suspend(void) local_irq_restore(flags); } -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 = { @@ -316,9 +334,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 - .irq_set_wake = tegra_gpio_wake_enable, -#endif + .irq_set_wake = tegra_gpio_irq_set_wake, + .flags = IRQCHIP_MASK_ON_SUSPEND, }; |