From 5ffd8ac7edab076d821b1498bc5629f5ef9beb10 Mon Sep 17 00:00:00 2001 From: Eero Nurkkala Date: Fri, 28 Aug 2009 10:51:36 -0700 Subject: [PATCH] --- yaml --- r: 163119 b: refs/heads/master c: 82dbb9d39f58e3d12b5903764901df5fec759daf h: refs/heads/master i: 163117: 46ea64fa14bef4f2d05ab62aa7381ae2efbcfeef 163115: c8ae760c13614ac11cad7a8d460f389cd7aad820 163111: f6de96989e57711dd99691b96bb5992b88276d97 163103: da31e8d6c6567add2e4e9a5d6e5c6eb1b2dc78a5 v: v3 --- [refs] | 2 +- trunk/arch/arm/plat-omap/gpio.c | 27 +++++++++++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index be6ce2baee02..b767e0f44a43 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 79e44c952cec025295b3f0fd0ff2a875689b98c4 +refs/heads/master: 82dbb9d39f58e3d12b5903764901df5fec759daf diff --git a/trunk/arch/arm/plat-omap/gpio.c b/trunk/arch/arm/plat-omap/gpio.c index b55b4adffbe7..7c70a6afcf66 100644 --- a/trunk/arch/arm/plat-omap/gpio.c +++ b/trunk/arch/arm/plat-omap/gpio.c @@ -1895,7 +1895,7 @@ void omap2_gpio_resume_after_retention(void) return; for (i = 0; i < gpio_bank_count; i++) { struct gpio_bank *bank = &gpio_bank[i]; - u32 l; + u32 l, gen, gen0, gen1; if (!(bank->enabled_non_wakeup_gpios)) continue; @@ -1916,14 +1916,33 @@ void omap2_gpio_resume_after_retention(void) #endif l ^= bank->saved_datain; l &= bank->non_wakeup_gpios; - if (l) { + + /* + * No need to generate IRQs for the rising edge for gpio IRQs + * configured with falling edge only; and vice versa. + */ + gen0 = l & bank->saved_fallingdetect; + gen0 &= bank->saved_datain; + + gen1 = l & bank->saved_risingdetect; + gen1 &= ~(bank->saved_datain); + + /* FIXME: Consider GPIO IRQs with level detections properly! */ + gen = l & (~(bank->saved_fallingdetect) & + ~(bank->saved_risingdetect)); + /* Consider all GPIO IRQs needed to be updated */ + gen |= gen0 | gen1; + + if (gen) { u32 old0, old1; #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \ defined(CONFIG_ARCH_OMAP4) old0 = __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT0); old1 = __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT1); - __raw_writel(old0 | l, bank->base + OMAP24XX_GPIO_LEVELDETECT0); - __raw_writel(old1 | l, bank->base + OMAP24XX_GPIO_LEVELDETECT1); + __raw_writel(old0 | gen, bank->base + + OMAP24XX_GPIO_LEVELDETECT0); + __raw_writel(old1 | gen, bank->base + + OMAP24XX_GPIO_LEVELDETECT1); __raw_writel(old0, bank->base + OMAP24XX_GPIO_LEVELDETECT0); __raw_writel(old1, bank->base + OMAP24XX_GPIO_LEVELDETECT1); #endif