aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio
diff options
context:
space:
mode:
authorTarun Kanti DebBarma <tarun.kanti@ti.com>2012-03-06 01:38:16 -0500
committerTarun Kanti DebBarma <tarun.kanti@ti.com>2012-03-21 00:48:54 -0400
commit2a900eb74c123a21054836ab2c63d6ff46f854c6 (patch)
tree1607c091f750be0704c00d7e6f0446087f8659cf /drivers/gpio
parent960edffe29dfd845ee532ee51398592cba96d701 (diff)
gpio/omap: fix incorrect update to context.irqenable1
In _enable_gpio_irqbank() when bank->regs->set_irqenable is TRUE, 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 avoid overwriting it with gpio_mask at the end of the function. Instead, update irqenable1 appropriately by OR'ing with gpio_mask. For the case where bank->regs->set_irqenable is FALSE, irqenable1 can be directly overwritten with 'l' which holds correct computed value. 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 similar change for _disable_gpio_irqbank(). Signed-off-by: Tarun Kanti DebBarma <tarun.kanti@ti.com> Reviewed-by: Santosh Shilimkar <santosh.shilimkar@ti.com> Reviewed-by: Kevin Hilman <khilman@ti.com> Signed-off-by: Kevin Hilman <khilman@ti.com>
Diffstat (limited to 'drivers/gpio')
-rw-r--r--drivers/gpio/gpio-omap.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index bcb1061dbd6d..6c17e5812312 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -451,6 +451,7 @@ static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
451 if (bank->regs->set_irqenable) { 451 if (bank->regs->set_irqenable) {
452 reg += bank->regs->set_irqenable; 452 reg += bank->regs->set_irqenable;
453 l = gpio_mask; 453 l = gpio_mask;
454 bank->context.irqenable1 |= gpio_mask;
454 } else { 455 } else {
455 reg += bank->regs->irqenable; 456 reg += bank->regs->irqenable;
456 l = __raw_readl(reg); 457 l = __raw_readl(reg);
@@ -458,10 +459,10 @@ static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
458 l &= ~gpio_mask; 459 l &= ~gpio_mask;
459 else 460 else
460 l |= gpio_mask; 461 l |= gpio_mask;
462 bank->context.irqenable1 = l;
461 } 463 }
462 464
463 __raw_writel(l, reg); 465 __raw_writel(l, reg);
464 bank->context.irqenable1 = l;
465} 466}
466 467
467static void _disable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask) 468static void _disable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
@@ -472,6 +473,7 @@ static void _disable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
472 if (bank->regs->clr_irqenable) { 473 if (bank->regs->clr_irqenable) {
473 reg += bank->regs->clr_irqenable; 474 reg += bank->regs->clr_irqenable;
474 l = gpio_mask; 475 l = gpio_mask;
476 bank->context.irqenable1 &= ~gpio_mask;
475 } else { 477 } else {
476 reg += bank->regs->irqenable; 478 reg += bank->regs->irqenable;
477 l = __raw_readl(reg); 479 l = __raw_readl(reg);
@@ -479,10 +481,10 @@ static void _disable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
479 l |= gpio_mask; 481 l |= gpio_mask;
480 else 482 else
481 l &= ~gpio_mask; 483 l &= ~gpio_mask;
484 bank->context.irqenable1 = l;
482 } 485 }
483 486
484 __raw_writel(l, reg); 487 __raw_writel(l, reg);
485 bank->context.irqenable1 = l;
486} 488}
487 489
488static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int enable) 490static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int enable)