gpio: pl061: refactor type setting
authorLinus Walleij <linus.walleij@linaro.org>
Tue, 26 Nov 2013 11:59:51 +0000 (12:59 +0100)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 3 Feb 2014 08:11:58 +0000 (09:11 +0100)
Refactor this function so that I can understand it, do one
big read/modify/write operation and have the bitmask in a
variable instead of recalculating it every time it's needed.

Cc: Haojian Zhuang <haojian.zhuang@linaro.org>
Cc: Deepak Sikri <deepak.sikri@st.com>
Acked-by: Baruch Siach <baruch@tkos.co.il>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpio-pl061.c

index 93b51e3..a934881 100644 (file)
@@ -150,6 +150,7 @@ static int pl061_irq_type(struct irq_data *d, unsigned trigger)
        int offset = irqd_to_hwirq(d);
        unsigned long flags;
        u8 gpiois, gpioibe, gpioiev;
+       u8 bit = BIT(offset);
 
        if (offset < 0 || offset >= PL061_GPIO_NR)
                return -EINVAL;
@@ -157,30 +158,31 @@ static int pl061_irq_type(struct irq_data *d, unsigned trigger)
        spin_lock_irqsave(&chip->lock, flags);
 
        gpioiev = readb(chip->base + GPIOIEV);
-
        gpiois = readb(chip->base + GPIOIS);
+       gpioibe = readb(chip->base + GPIOIBE);
+
        if (trigger & (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW)) {
-               gpiois |= 1 << offset;
+               gpiois |= bit;
                if (trigger & IRQ_TYPE_LEVEL_HIGH)
-                       gpioiev |= 1 << offset;
+                       gpioiev |= bit;
                else
-                       gpioiev &= ~(1 << offset);
+                       gpioiev &= ~bit;
        } else
-               gpiois &= ~(1 << offset);
-       writeb(gpiois, chip->base + GPIOIS);
+               gpiois &= ~bit;
 
-       gpioibe = readb(chip->base + GPIOIBE);
        if ((trigger & IRQ_TYPE_EDGE_BOTH) == IRQ_TYPE_EDGE_BOTH)
-               gpioibe |= 1 << offset;
+               /* Setting this makes GPIOEV be ignored */
+               gpioibe |= bit;
        else {
-               gpioibe &= ~(1 << offset);
+               gpioibe &= ~bit;
                if (trigger & IRQ_TYPE_EDGE_RISING)
-                       gpioiev |= 1 << offset;
+                       gpioiev |= bit;
                else if (trigger & IRQ_TYPE_EDGE_FALLING)
-                       gpioiev &= ~(1 << offset);
+                       gpioiev &= ~bit;
        }
-       writeb(gpioibe, chip->base + GPIOIBE);
 
+       writeb(gpiois, chip->base + GPIOIS);
+       writeb(gpioibe, chip->base + GPIOIBE);
        writeb(gpioiev, chip->base + GPIOIEV);
 
        spin_unlock_irqrestore(&chip->lock, flags);