diff options
| -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) | |||
| 105 | "Failed to sync wakes in %x: %d\n", | 105 | "Failed to sync wakes in %x: %d\n", |
| 106 | reg, ret); | 106 | reg, ret); |
| 107 | } | 107 | } |
| 108 | |||
| 109 | if (!d->chip->init_ack_masked) | ||
| 110 | continue; | ||
| 111 | /* | ||
| 112 | * Ack all the masked interrupts uncondictionly, | ||
| 113 | * OR if there is masked interrupt which hasn't been Acked, | ||
| 114 | * it'll be ignored in irq handler, then may introduce irq storm | ||
| 115 | */ | ||
| 116 | if (d->mask_buf[i] && d->chip->ack_base) { | ||
| 117 | reg = d->chip->ack_base + | ||
| 118 | (i * map->reg_stride * d->irq_reg_stride); | ||
| 119 | ret = regmap_write(map, reg, d->mask_buf[i]); | ||
| 120 | if (ret != 0) | ||
| 121 | dev_err(d->map->dev, "Failed to ack 0x%x: %d\n", | ||
| 122 | reg, ret); | ||
| 123 | } | ||
| 108 | } | 124 | } |
| 109 | 125 | ||
| 110 | if (d->chip->runtime_pm) | 126 | if (d->chip->runtime_pm) |
