pinctrl: sunxi: Read register before writing to it in irq_set_type
authorMaxime Ripard <maxime.ripard@free-electrons.com>
Sun, 4 Aug 2013 10:38:47 +0000 (12:38 +0200)
committerLinus Walleij <linus.walleij@stericsson.com>
Wed, 7 Aug 2013 18:39:25 +0000 (20:39 +0200)
The current irq_set_type code doesn't read the current register value
before writing to it, leading to the older programmed values being
overwritten and everything but the latest value being reset.

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: Linus Walleij <linus.walleij@stericsson.com>
drivers/pinctrl/pinctrl-sunxi.c

index c47fd1e..7b3a56c 100644 (file)
@@ -526,6 +526,7 @@ static int sunxi_pinctrl_irq_set_type(struct irq_data *d,
        struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
        u32 reg = sunxi_irq_cfg_reg(d->hwirq);
        u8 index = sunxi_irq_cfg_offset(d->hwirq);
+       u32 regval;
        u8 mode;
 
        switch (type) {
@@ -548,7 +549,9 @@ static int sunxi_pinctrl_irq_set_type(struct irq_data *d,
                return -EINVAL;
        }
 
-       writel((mode & IRQ_CFG_IRQ_MASK) << index, pctl->membase + reg);
+       regval = readl(pctl->membase + reg);
+       regval &= ~IRQ_CFG_IRQ_MASK;
+       writel(regval | (mode << index), pctl->membase + reg);
 
        return 0;
 }