Message ID | 20220607155324.118102-2-aidanmacdonald.0x0@gmail.com |
---|---|
State | Superseded |
Headers | show |
Series | Add support for AXP192 PMIC | expand |
Guru Das Srinagesh <quic_gurus@quicinc.com> writes: > On Tue, Jun 07, 2022 at 04:53:08PM +0100, Aidan MacDonald wrote: >> Call sub_irq_reg() instead of calculating the offset of the register >> to avoid relying on the fact that sub_irq_reg() is a linear function. > > Seems like unmask_reg is the only register whose address is not calculated > using sub_irq_reg(). Switching to using sub_irq_reg() will bring it in line > with the other calculations. > > Could you please incorporate this info in your commit message as well? This > should be the rationale for this change; that it allows for the get_irq_reg() > patch should be secondary. I'll note that in v3, thanks. > > The change seems okay to me, but I'd ideally like someone to pick this up and > test it out just to make sure it doesn't break existing behaviour for them. > > Thank you. > > Guru Das.
diff --git a/drivers/base/regmap/regmap-irq.c b/drivers/base/regmap/regmap-irq.c index 400c7412a7dc..4a2e1f6aa94d 100644 --- a/drivers/base/regmap/regmap-irq.c +++ b/drivers/base/regmap/regmap-irq.c @@ -97,7 +97,6 @@ static void regmap_irq_sync_unlock(struct irq_data *data) struct regmap *map = d->map; int i, j, ret; u32 reg; - u32 unmask_offset; u32 val; if (d->chip->runtime_pm) { @@ -141,11 +140,11 @@ static void regmap_irq_sync_unlock(struct irq_data *data) dev_err(d->map->dev, "Failed to sync unmasks in %x\n", reg); - unmask_offset = d->chip->unmask_base - - d->chip->mask_base; + /* clear mask with unmask_base register */ + reg = sub_irq_reg(d, d->chip->unmask_base, i); ret = regmap_irq_update_bits(d, - reg + unmask_offset, + reg, d->mask_buf_def[i], d->mask_buf[i]); } else { @@ -632,7 +631,6 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode, int ret = -ENOMEM; int num_type_reg; u32 reg; - u32 unmask_offset; if (chip->num_regs <= 0) return -EINVAL; @@ -773,10 +771,9 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode, ret = regmap_irq_update_bits(d, reg, d->mask_buf[i], ~d->mask_buf[i]); else if (d->chip->unmask_base) { - unmask_offset = d->chip->unmask_base - - d->chip->mask_base; + reg = sub_irq_reg(d, d->chip->unmask_base, i); ret = regmap_irq_update_bits(d, - reg + unmask_offset, + reg, d->mask_buf[i], d->mask_buf[i]); } else
Call sub_irq_reg() instead of calculating the offset of the register to avoid relying on the fact that sub_irq_reg() is a linear function. This prepares for allowing drivers to override the default sub_irq_reg implementation if the default behavior is unsuitable. Signed-off-by: Aidan MacDonald <aidanmacdonald.0x0@gmail.com> --- drivers/base/regmap/regmap-irq.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-)