Merge tag 'gpio-v5.10-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
[linux-2.6-microblaze.git] / drivers / gpio / gpio-pca953x.c
index 4302bde..825b362 100644 (file)
@@ -819,12 +819,27 @@ static irqreturn_t pca953x_irq_handler(int irq, void *devid)
        int level;
        bool ret;
 
+       bitmap_zero(pending, MAX_LINE);
+
        mutex_lock(&chip->i2c_lock);
        ret = pca953x_irq_pending(chip, pending);
        mutex_unlock(&chip->i2c_lock);
 
-       for_each_set_bit(level, pending, gc->ngpio)
-               handle_nested_irq(irq_find_mapping(gc->irq.domain, level));
+       if (ret) {
+               ret = 0;
+
+               for_each_set_bit(level, pending, gc->ngpio) {
+                       int nested_irq = irq_find_mapping(gc->irq.domain, level);
+
+                       if (unlikely(nested_irq <= 0)) {
+                               dev_warn_ratelimited(gc->parent, "unmapped interrupt %d\n", level);
+                               continue;
+                       }
+
+                       handle_nested_irq(nested_irq);
+                       ret = 1;
+               }
+       }
 
        return IRQ_RETVAL(ret);
 }
@@ -941,6 +956,7 @@ out:
 static int device_pca957x_init(struct pca953x_chip *chip, u32 invert)
 {
        DECLARE_BITMAP(val, MAX_LINE);
+       unsigned int i;
        int ret;
 
        ret = device_pca95xx_init(chip, invert);
@@ -948,7 +964,9 @@ static int device_pca957x_init(struct pca953x_chip *chip, u32 invert)
                goto out;
 
        /* To enable register 6, 7 to control pull up and pull down */
-       memset(val, 0x02, NBANK(chip));
+       for (i = 0; i < NBANK(chip); i++)
+               bitmap_set_value8(val, 0x02, i * BANK_SZ);
+
        ret = pca953x_write_regs(chip, PCA957X_BKEN, val);
        if (ret)
                goto out;