ARM: tegra: gpio: Add support for waking from suspend
Colin Cross [Wed, 18 Aug 2010 07:19:27 +0000 (00:19 -0700)]
Change-Id: Ifd11daa6eac4ca747aba4a4d98f41270b7055bbb
Signed-off-by: Colin Cross <ccross@android.com>

drivers/gpio/gpio-tegra.c

index 6b1e70e..abc0cee 100644 (file)
@@ -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,
 };