gpio: pch: Refactor pch_irq_type() to avoid unnecessary locking
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Tue, 14 Apr 2020 17:48:59 +0000 (20:48 +0300)
committerAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Thu, 16 Apr 2020 17:40:14 +0000 (20:40 +0300)
When type is not supported there is no need to lock and check.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
drivers/gpio/gpio-pch.c

index 708272d..9c34230 100644 (file)
@@ -229,17 +229,15 @@ static int pch_irq_type(struct irq_data *d, unsigned int type)
        int ch, irq = d->irq;
 
        ch = irq - chip->irq_base;
-       if (irq <= chip->irq_base + 7) {
+       if (irq < chip->irq_base + 8) {
                im_reg = &chip->reg->im0;
-               im_pos = ch;
+               im_pos = ch - 0;
        } else {
                im_reg = &chip->reg->im1;
                im_pos = ch - 8;
        }
        dev_dbg(chip->dev, "irq=%d type=%d ch=%d pos=%d\n", irq, type, ch, im_pos);
 
-       spin_lock_irqsave(&chip->spinlock, flags);
-
        switch (type) {
        case IRQ_TYPE_EDGE_RISING:
                val = PCH_EDGE_RISING;
@@ -257,9 +255,11 @@ static int pch_irq_type(struct irq_data *d, unsigned int type)
                val = PCH_LEVEL_L;
                break;
        default:
-               goto unlock;
+               return 0;
        }
 
+       spin_lock_irqsave(&chip->spinlock, flags);
+
        /* Set interrupt mode */
        im = ioread32(im_reg) & ~(PCH_IM_MASK << (im_pos * 4));
        iowrite32(im | (val << (im_pos * 4)), im_reg);
@@ -270,7 +270,6 @@ static int pch_irq_type(struct irq_data *d, unsigned int type)
        else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
                irq_set_handler_locked(d, handle_edge_irq);
 
-unlock:
        spin_unlock_irqrestore(&chip->spinlock, flags);
        return 0;
 }