In _enable_gpio_irqbank() when bank->regs->set_irqenable is valid, gpio_mask can be directly set by writing to set_irqenable register without overwriting current value. In order to ensure the same is stored in context.irqenable1, we must read from regs->irqenable instead of overwriting it with gpio_mask. The overwriting makes sense only in the second case where irqenable is explicitly read and updated with new gpio_mask before writing it back. However, for consistency reading regs->irqenable into the bank->context.irqenable1 takes care of both the scenarios. if (bank->regs->set_irqenable) { reg += bank->regs->set_irqenable; l = gpio_mask; } else { reg += bank->regs->irqenable; l = __raw_readl(reg); if (bank->regs->irqenable_inv) l &= ~gpio_mask; else l |= gpio_mask; } Make the same change for _disable_gpio_irqbank(). Signed-off-by: Tarun Kanti DebBarma <tarun.kanti@xxxxxx> --- drivers/gpio/gpio-omap.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index ccfbae0..8b0d3ab 100644 --- a/drivers/gpio/gpio-omap.c +++ b/drivers/gpio/gpio-omap.c @@ -453,7 +453,8 @@ static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask) } __raw_writel(l, reg); - bank->context.irqenable1 = l; + bank->context.irqenable1 = + __raw_readl(bank->base + bank->regs->irqenable); } static void _disable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask) @@ -474,7 +475,8 @@ static void _disable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask) } __raw_writel(l, reg); - bank->context.irqenable1 = l; + bank->context.irqenable1 = + __raw_readl(bank->base + bank->regs->irqenable); } static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int enable) -- 1.7.0.4 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html