summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2013-10-28 21:01:34 +0100
committerMark Brown <broonie@linaro.org>2013-10-28 21:01:34 +0100
commit6cf3d823230794a6e6b3f99541cdb91176614036 (patch)
tree51ccc28e05926f87f223044d8f765acb6cc9bb51
parentMerge remote-tracking branch 'regmap/topic/field' into regmap-next (diff)
parentregmap: irq: clear status when disable irq (diff)
downloadlinux-6cf3d823230794a6e6b3f99541cdb91176614036.tar.xz
linux-6cf3d823230794a6e6b3f99541cdb91176614036.zip
Merge remote-tracking branch 'regmap/topic/irq' into regmap-next
-rw-r--r--drivers/base/regmap/regmap-irq.c16
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)