Skip to content

Commit 84498d1

Browse files
Tooniisbroonie
authored andcommitted
regmap-irq: Use the new num_config_regs property in regmap_add_irq_chip_fwnode
Commit faa87ce ("regmap-irq: Introduce config registers for irq types") added the num_config_regs, then commit 9edd4f5 ("regmap-irq: Deprecate type registers and virtual registers") suggested to replace num_type_reg with it. However, regmap_add_irq_chip_fwnode wasn't modified to use the new property. Later on, commit 255a03b ("ASoC: wcd9335: Convert irq chip to config regs") removed the old num_type_reg property from the WCD9335 driver's struct regmap_irq_chip, causing a null pointer dereference in regmap_irq_set_type when it tried to index d->type_buf as it was never allocated in regmap_add_irq_chip_fwnode: [ 39.199374] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000 [ 39.200006] Call trace: [ 39.200014] regmap_irq_set_type+0x84/0x1c0 [ 39.200026] __irq_set_trigger+0x60/0x1c0 [ 39.200040] __setup_irq+0x2f4/0x78c [ 39.200051] request_threaded_irq+0xe8/0x1a0 Use num_config_regs in regmap_add_irq_chip_fwnode instead of num_type_reg, and fall back to it if num_config_regs isn't defined to maintain backward compatibility. Fixes: faa87ce ("regmap-irq: Introduce config registers for irq types") Signed-off-by: Yassine Oudjana <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent f0c4d9f commit 84498d1

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

drivers/base/regmap/regmap-irq.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -722,6 +722,7 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode,
722722
int i;
723723
int ret = -ENOMEM;
724724
int num_type_reg;
725+
int num_regs;
725726
u32 reg;
726727

727728
if (chip->num_regs <= 0)
@@ -796,14 +797,20 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode,
796797
goto err_alloc;
797798
}
798799

799-
num_type_reg = chip->type_in_mask ? chip->num_regs : chip->num_type_reg;
800-
if (num_type_reg) {
801-
d->type_buf_def = kcalloc(num_type_reg,
800+
/*
801+
* Use num_config_regs if defined, otherwise fall back to num_type_reg
802+
* to maintain backward compatibility.
803+
*/
804+
num_type_reg = chip->num_config_regs ? chip->num_config_regs
805+
: chip->num_type_reg;
806+
num_regs = chip->type_in_mask ? chip->num_regs : num_type_reg;
807+
if (num_regs) {
808+
d->type_buf_def = kcalloc(num_regs,
802809
sizeof(*d->type_buf_def), GFP_KERNEL);
803810
if (!d->type_buf_def)
804811
goto err_alloc;
805812

806-
d->type_buf = kcalloc(num_type_reg, sizeof(*d->type_buf),
813+
d->type_buf = kcalloc(num_regs, sizeof(*d->type_buf),
807814
GFP_KERNEL);
808815
if (!d->type_buf)
809816
goto err_alloc;

0 commit comments

Comments
 (0)