Skip to content

Commit a240d23

Browse files
Aidan MacDonaldbroonie
authored andcommitted
regmap-irq: Minor adjustments to .handle_mask_sync()
If a .handle_mask_sync() callback is provided it supersedes all inbuilt handling of mask registers, and judging by the commit 69af4bc ("regmap-irq: Add handle_mask_sync() callback") it is intended to completely replace all default IRQ masking logic. The implementation has two minor inconsistencies, which can be fixed without breaking compatibility: (1) mask_base must be set to enable .handle_mask_sync(), even though mask_base is otherwise unused. This is easily fixed because mask_base is already optional. (2) Unmask registers aren't accounted for -- they are part of the default IRQ masking logic and are just a bit-inverted version of mask registers. It would be a bad idea to allow them to be used at the same time as .handle_mask_sync(), as the result would be confusing and unmaintainable, so make sure this can't happen. Signed-off-by: Aidan MacDonald <aidanmacdonald.0x0@gmail.com Link: https://lore.kernel.org/r/20230511091342.26604-4-aidanmacdonald.0x0@gmail.com Signed-off-by: Mark Brown <broonie@kernel.org
1 parent 72cc0f5 commit a240d23

1 file changed

Lines changed: 31 additions & 34 deletions

File tree

drivers/base/regmap/regmap-irq.c

Lines changed: 31 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -113,23 +113,21 @@ static void regmap_irq_sync_unlock(struct irq_data *data)
113113
* suppress pointless writes.
114114
*/
115115
for (i = 0; i < d->chip->num_regs; i++) {
116-
if (d->mask_base) {
117-
if (d->chip->handle_mask_sync)
118-
d->chip->handle_mask_sync(i, d->mask_buf_def[i],
119-
d->mask_buf[i],
120-
d->chip->irq_drv_data);
121-
else {
122-
reg = d->get_irq_reg(d, d->mask_base, i);
123-
ret = regmap_update_bits(d->map, reg,
124-
d->mask_buf_def[i],
125-
d->mask_buf[i]);
126-
if (ret)
127-
dev_err(d->map->dev, "Failed to sync masks in %x\n",
128-
reg);
129-
}
116+
if (d->chip->handle_mask_sync)
117+
d->chip->handle_mask_sync(i, d->mask_buf_def[i],
118+
d->mask_buf[i],
119+
d->chip->irq_drv_data);
120+
121+
if (d->mask_base && !d->chip->handle_mask_sync) {
122+
reg = d->get_irq_reg(d, d->mask_base, i);
123+
ret = regmap_update_bits(d->map, reg,
124+
d->mask_buf_def[i],
125+
d->mask_buf[i]);
126+
if (ret)
127+
dev_err(d->map->dev, "Failed to sync masks in %x\n", reg);
130128
}
131129

132-
if (d->unmask_base) {
130+
if (d->unmask_base && !d->chip->handle_mask_sync) {
133131
reg = d->get_irq_reg(d, d->unmask_base, i);
134132
ret = regmap_update_bits(d->map, reg,
135133
d->mask_buf_def[i], ~d->mask_buf[i]);
@@ -785,28 +783,27 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode,
785783
for (i = 0; i < chip->num_regs; i++) {
786784
d->mask_buf[i] = d->mask_buf_def[i];
787785

788-
if (d->mask_base) {
789-
if (chip->handle_mask_sync) {
790-
ret = chip->handle_mask_sync(i,
791-
d->mask_buf_def[i],
792-
d->mask_buf[i],
793-
chip->irq_drv_data);
794-
if (ret)
795-
goto err_alloc;
796-
} else {
797-
reg = d->get_irq_reg(d, d->mask_base, i);
798-
ret = regmap_update_bits(d->map, reg,
799-
d->mask_buf_def[i],
800-
d->mask_buf[i]);
801-
if (ret) {
802-
dev_err(map->dev, "Failed to set masks in 0x%x: %d\n",
803-
reg, ret);
804-
goto err_alloc;
805-
}
786+
if (chip->handle_mask_sync) {
787+
ret = chip->handle_mask_sync(i, d->mask_buf_def[i],
788+
d->mask_buf[i],
789+
chip->irq_drv_data);
790+
if (ret)
791+
goto err_alloc;
792+
}
793+
794+
if (d->mask_base && !chip->handle_mask_sync) {
795+
reg = d->get_irq_reg(d, d->mask_base, i);
796+
ret = regmap_update_bits(d->map, reg,
797+
d->mask_buf_def[i],
798+
d->mask_buf[i]);
799+
if (ret) {
800+
dev_err(map->dev, "Failed to set masks in 0x%x: %d\n",
801+
reg, ret);
802+
goto err_alloc;
806803
}
807804
}
808805

809-
if (d->unmask_base) {
806+
if (d->unmask_base && !chip->handle_mask_sync) {
810807
reg = d->get_irq_reg(d, d->unmask_base, i);
811808
ret = regmap_update_bits(d->map, reg,
812809
d->mask_buf_def[i], ~d->mask_buf[i]);

0 commit comments

Comments
 (0)