unsigned int irq_reg_stride;
        unsigned int type_reg_stride;
+
+       bool clear_status:1;
 };
 
 static inline const
        int i, ret;
        u32 reg;
        u32 unmask_offset;
+       u32 val;
 
        if (d->chip->runtime_pm) {
                ret = pm_runtime_get_sync(map->dev);
                                ret);
        }
 
+       if (d->clear_status) {
+               for (i = 0; i < d->chip->num_regs; i++) {
+                       reg = d->chip->status_base +
+                               (i * map->reg_stride * d->irq_reg_stride);
+
+                       ret = regmap_read(map, reg, &val);
+                       if (ret)
+                               dev_err(d->map->dev,
+                                       "Failed to clear the interrupt status bits\n");
+               }
+
+               d->clear_status = false;
+       }
+
        /*
         * If there's been a change in the mask write it back to the
         * hardware.  We rely on the use of the regmap core cache to
        else
                mask = irq_data->mask;
 
+       if (d->chip->clear_on_unmask)
+               d->clear_status = true;
+
        d->mask_buf[irq_data->reg_offset / map->reg_stride] &= ~mask;
 }
 
        if (chip->num_regs <= 0)
                return -EINVAL;
 
+       if (chip->clear_on_unmask && (chip->ack_base || chip->use_ack))
+               return -EINVAL;
+
        for (i = 0; i < chip->num_irqs; i++) {
                if (chip->irqs[i].reg_offset % map->reg_stride)
                        return -EINVAL;
 
  * @type_in_mask: Use the mask registers for controlling irq type. For
  *                interrupts defining type_rising/falling_mask use mask_base
  *                for edge configuration and never update bits in type_base.
+ * @clear_on_unmask: For chips with interrupts cleared on read: read the status
+ *                   registers before unmasking interrupts to clear any bits
+ *                   set when they were masked.
  * @runtime_pm:  Hold a runtime PM lock on the device when accessing it.
  *
  * @num_regs:    Number of registers in each control bank.
        bool runtime_pm:1;
        bool type_invert:1;
        bool type_in_mask:1;
+       bool clear_on_unmask:1;
 
        int num_regs;