diff options
-rw-r--r-- | arch/arm/mach-omap2/mux.c | 10 | ||||
-rw-r--r-- | arch/arm/mach-omap2/mux.h | 5 | ||||
-rw-r--r-- | drivers/gpio/gpio-omap.c | 7 |
3 files changed, 22 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c index a2ed524..c7d0b21 100644 --- a/arch/arm/mach-omap2/mux.c +++ b/arch/arm/mach-omap2/mux.c @@ -968,6 +968,16 @@ void omap_mux_set_gpio(u16 val, int gpio) pr_err("%s: Could not set gpio%i\n", __func__, gpio); } +bool omap_mux_get_wakeupevent(struct omap_mux *m) +{ + u16 val; + if (IS_ERR_OR_NULL(m) || !cpu_is_omap44xx()) + return false; + + val = omap_mux_read(m->partition, m->reg_offset); + return val & OMAP_WAKEUP_EVENT; +} + /* Has no locking, don't use on a pad that is remuxed (by hwmod or otherwise) */ bool omap_mux_get_wakeupenable(struct omap_mux *m) { diff --git a/arch/arm/mach-omap2/mux.h b/arch/arm/mach-omap2/mux.h index 87bf022..e631b5e 100644 --- a/arch/arm/mach-omap2/mux.h +++ b/arch/arm/mach-omap2/mux.h @@ -286,6 +286,11 @@ int omap_mux_clear_wakeupenable(struct omap_mux *m); */ bool omap_mux_get_wakeupenable(struct omap_mux *m); +/** omap_mux_get_wakeupevent() - get the wakeupevent bit from a mux struct + * @m: mux struct + */ +bool omap_mux_get_wakeupevent(struct omap_mux *m); + /** * omap_mux_set_gpio() - set mux register value based on GPIO number * @val: New mux register value diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index 6a9bca6..561cb4f 100644 --- a/drivers/gpio/gpio-omap.c +++ b/drivers/gpio/gpio-omap.c @@ -1398,6 +1398,8 @@ static int omap_gpio_pm_runtime_resume(struct device *dev) struct gpio_bank *bank = platform_get_drvdata(pdev); u32 l = 0, gen, gen0, gen1; int j; + unsigned long pad_wakeup; + int i; for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++) clk_enable(bank->dbck); @@ -1421,6 +1423,11 @@ static int omap_gpio_pm_runtime_resume(struct device *dev) l ^= bank->saved_datain; l &= bank->enabled_non_wakeup_gpios; + pad_wakeup = bank->enabled_non_wakeup_gpios; + for_each_set_bit(i, &pad_wakeup, bank->width) + if (omap_mux_get_wakeupevent(bank->mux[i])) + l |= BIT(i); + /* * No need to generate IRQs for the rising edge for gpio IRQs * configured with falling edge only; and vice versa. |