diff options
author | Mark Brown | 2013-10-28 13:01:34 -0700 |
---|---|---|
committer | Mark Brown | 2013-10-28 13:01:34 -0700 |
commit | 6cf3d823230794a6e6b3f99541cdb91176614036 (patch) | |
tree | 51ccc28e05926f87f223044d8f765acb6cc9bb51 /drivers/base | |
parent | f2783f0e9cac215df5b7ee0a903adfeabde90b24 (diff) | |
parent | 4bd7145b194af7cd96fc56d2ebee583b3edf03d3 (diff) |
Merge remote-tracking branch 'regmap/topic/irq' into regmap-next
Diffstat (limited to 'drivers/base')
-rw-r--r-- | drivers/base/regmap/regmap-irq.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/base/regmap/regmap-irq.c b/drivers/base/regmap/regmap-irq.c index d10456ffd811..763c60d3d277 100644 --- a/drivers/base/regmap/regmap-irq.c +++ b/drivers/base/regmap/regmap-irq.c @@ -105,6 +105,22 @@ static void regmap_irq_sync_unlock(struct irq_data *data) "Failed to sync wakes in %x: %d\n", reg, ret); } + + if (!d->chip->init_ack_masked) + continue; + /* + * Ack all the masked interrupts uncondictionly, + * OR if there is masked interrupt which hasn't been Acked, + * it'll be ignored in irq handler, then may introduce irq storm + */ + if (d->mask_buf[i] && d->chip->ack_base) { + reg = d->chip->ack_base + + (i * map->reg_stride * d->irq_reg_stride); + ret = regmap_write(map, reg, d->mask_buf[i]); + if (ret != 0) + dev_err(d->map->dev, "Failed to ack 0x%x: %d\n", + reg, ret); + } } if (d->chip->runtime_pm) |