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>
This commit is contained in:
Родитель
960edffe29
Коммит
2a900eb74c
|
@ -451,6 +451,7 @@ static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
|
|||
if (bank->regs->set_irqenable) {
|
||||
reg += bank->regs->set_irqenable;
|
||||
l = gpio_mask;
|
||||
bank->context.irqenable1 |= gpio_mask;
|
||||
} else {
|
||||
reg += bank->regs->irqenable;
|
||||
l = __raw_readl(reg);
|
||||
|
@ -458,10 +459,10 @@ static void _enable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
|
|||
l &= ~gpio_mask;
|
||||
else
|
||||
l |= gpio_mask;
|
||||
bank->context.irqenable1 = l;
|
||||
}
|
||||
|
||||
__raw_writel(l, reg);
|
||||
bank->context.irqenable1 = l;
|
||||
}
|
||||
|
||||
static 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)
|
|||
if (bank->regs->clr_irqenable) {
|
||||
reg += bank->regs->clr_irqenable;
|
||||
l = gpio_mask;
|
||||
bank->context.irqenable1 &= ~gpio_mask;
|
||||
} else {
|
||||
reg += bank->regs->irqenable;
|
||||
l = __raw_readl(reg);
|
||||
|
@ -479,10 +481,10 @@ static void _disable_gpio_irqbank(struct gpio_bank *bank, int gpio_mask)
|
|||
l |= gpio_mask;
|
||||
else
|
||||
l &= ~gpio_mask;
|
||||
bank->context.irqenable1 = l;
|
||||
}
|
||||
|
||||
__raw_writel(l, reg);
|
||||
bank->context.irqenable1 = l;
|
||||
}
|
||||
|
||||
static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int enable)
|
||||
|
|
Загрузка…
Ссылка в новой задаче