Commit 0e9894e6 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'regmap-fix-v5.17-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap

Pull regmap fix from Mark Brown:
 "A fix for interrupt controllers which require the explicit
  acknowledgement of interrupts using a different register to the one
  where interrupts are reported.

  Urgent for the few devices this affects"

* tag 'regmap-fix-v5.17-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap:
  regmap-irq: Update interrupt clear register for proper reset
parents e48cb5c2 d04ad245
...@@ -189,11 +189,9 @@ static void regmap_irq_sync_unlock(struct irq_data *data) ...@@ -189,11 +189,9 @@ static void regmap_irq_sync_unlock(struct irq_data *data)
ret = regmap_write(map, reg, d->mask_buf[i]); ret = regmap_write(map, reg, d->mask_buf[i]);
if (d->chip->clear_ack) { if (d->chip->clear_ack) {
if (d->chip->ack_invert && !ret) if (d->chip->ack_invert && !ret)
ret = regmap_write(map, reg, ret = regmap_write(map, reg, UINT_MAX);
d->mask_buf[i]);
else if (!ret) else if (!ret)
ret = regmap_write(map, reg, ret = regmap_write(map, reg, 0);
~d->mask_buf[i]);
} }
if (ret != 0) if (ret != 0)
dev_err(d->map->dev, "Failed to ack 0x%x: %d\n", dev_err(d->map->dev, "Failed to ack 0x%x: %d\n",
...@@ -556,11 +554,9 @@ static irqreturn_t regmap_irq_thread(int irq, void *d) ...@@ -556,11 +554,9 @@ static irqreturn_t regmap_irq_thread(int irq, void *d)
data->status_buf[i]); data->status_buf[i]);
if (chip->clear_ack) { if (chip->clear_ack) {
if (chip->ack_invert && !ret) if (chip->ack_invert && !ret)
ret = regmap_write(map, reg, ret = regmap_write(map, reg, UINT_MAX);
data->status_buf[i]);
else if (!ret) else if (!ret)
ret = regmap_write(map, reg, ret = regmap_write(map, reg, 0);
~data->status_buf[i]);
} }
if (ret != 0) if (ret != 0)
dev_err(map->dev, "Failed to ack 0x%x: %d\n", dev_err(map->dev, "Failed to ack 0x%x: %d\n",
...@@ -817,13 +813,9 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode, ...@@ -817,13 +813,9 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode,
d->status_buf[i] & d->mask_buf[i]); d->status_buf[i] & d->mask_buf[i]);
if (chip->clear_ack) { if (chip->clear_ack) {
if (chip->ack_invert && !ret) if (chip->ack_invert && !ret)
ret = regmap_write(map, reg, ret = regmap_write(map, reg, UINT_MAX);
(d->status_buf[i] &
d->mask_buf[i]));
else if (!ret) else if (!ret)
ret = regmap_write(map, reg, ret = regmap_write(map, reg, 0);
~(d->status_buf[i] &
d->mask_buf[i]));
} }
if (ret != 0) { if (ret != 0) {
dev_err(map->dev, "Failed to ack 0x%x: %d\n", dev_err(map->dev, "Failed to ack 0x%x: %d\n",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment