Skip to content

Commit 0e9894e

Browse files
committed
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
2 parents e48cb5c + d04ad24 commit 0e9894e

1 file changed

Lines changed: 6 additions & 14 deletions

File tree

drivers/base/regmap/regmap-irq.c

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -189,11 +189,9 @@ static void regmap_irq_sync_unlock(struct irq_data *data)
189189
ret = regmap_write(map, reg, d->mask_buf[i]);
190190
if (d->chip->clear_ack) {
191191
if (d->chip->ack_invert && !ret)
192-
ret = regmap_write(map, reg,
193-
d->mask_buf[i]);
192+
ret = regmap_write(map, reg, UINT_MAX);
194193
else if (!ret)
195-
ret = regmap_write(map, reg,
196-
~d->mask_buf[i]);
194+
ret = regmap_write(map, reg, 0);
197195
}
198196
if (ret != 0)
199197
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)
556554
data->status_buf[i]);
557555
if (chip->clear_ack) {
558556
if (chip->ack_invert && !ret)
559-
ret = regmap_write(map, reg,
560-
data->status_buf[i]);
557+
ret = regmap_write(map, reg, UINT_MAX);
561558
else if (!ret)
562-
ret = regmap_write(map, reg,
563-
~data->status_buf[i]);
559+
ret = regmap_write(map, reg, 0);
564560
}
565561
if (ret != 0)
566562
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,
817813
d->status_buf[i] & d->mask_buf[i]);
818814
if (chip->clear_ack) {
819815
if (chip->ack_invert && !ret)
820-
ret = regmap_write(map, reg,
821-
(d->status_buf[i] &
822-
d->mask_buf[i]));
816+
ret = regmap_write(map, reg, UINT_MAX);
823817
else if (!ret)
824-
ret = regmap_write(map, reg,
825-
~(d->status_buf[i] &
826-
d->mask_buf[i]));
818+
ret = regmap_write(map, reg, 0);
827819
}
828820
if (ret != 0) {
829821
dev_err(map->dev, "Failed to ack 0x%x: %d\n",

0 commit comments

Comments
 (0)