summaryrefslogtreecommitdiff
path: root/drivers/gpio
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2010-08-18 00:19:27 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 00:46:47 -0700
commitb52130e46621d87fb027f7b2fb9b03795b30c22e (patch)
tree85e6beb390f1781eef9d100151fd339512218d06 /drivers/gpio
parent9f577a50a6ccbab7a6c8a6021a067edc89602aa4 (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.c27
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 = {