|
@@ -72,6 +72,7 @@ struct tegra_gpio_bank {
|
|
|
u32 oe[4];
|
|
|
u32 int_enb[4];
|
|
|
u32 int_lvl[4];
|
|
|
+ u32 wake_enb[4];
|
|
|
#endif
|
|
|
};
|
|
|
|
|
@@ -333,15 +334,31 @@ static int tegra_gpio_suspend(struct device *dev)
|
|
|
bank->oe[p] = tegra_gpio_readl(GPIO_OE(gpio));
|
|
|
bank->int_enb[p] = tegra_gpio_readl(GPIO_INT_ENB(gpio));
|
|
|
bank->int_lvl[p] = tegra_gpio_readl(GPIO_INT_LVL(gpio));
|
|
|
+
|
|
|
+ /* Enable gpio irq for wake up source */
|
|
|
+ tegra_gpio_writel(bank->wake_enb[p],
|
|
|
+ GPIO_INT_ENB(gpio));
|
|
|
}
|
|
|
}
|
|
|
local_irq_restore(flags);
|
|
|
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);
|
|
|
+ int gpio = d->hwirq;
|
|
|
+ u32 port, bit, mask;
|
|
|
+
|
|
|
+ port = GPIO_PORT(gpio);
|
|
|
+ bit = GPIO_BIT(gpio);
|
|
|
+ mask = BIT(bit);
|
|
|
+
|
|
|
+ if (enable)
|
|
|
+ bank->wake_enb[port] |= mask;
|
|
|
+ else
|
|
|
+ bank->wake_enb[port] &= ~mask;
|
|
|
+
|
|
|
return irq_set_irq_wake(bank->irq, enable);
|
|
|
}
|
|
|
#endif
|
|
@@ -353,7 +370,7 @@ static struct irq_chip tegra_gpio_irq_chip = {
|
|
|
.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,
|
|
|
+ .irq_set_wake = tegra_gpio_irq_set_wake,
|
|
|
#endif
|
|
|
};
|
|
|
|