When of_syscon_register is called with check_clk=true, it will attempt to attach the clock. If that fails, the newly allocated syscon is freed, but a dangling pointer remained in the syscon_list. Fix this by only registering the syscon in the successful case. Fixes: b36b7b727192 ("mfd: syscon: clock peripheral if specified in device tree") Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- drivers/mfd/syscon.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c index 3e12123b572e..3c2e1241fdff 100644 --- a/drivers/mfd/syscon.c +++ b/drivers/mfd/syscon.c @@ -74,8 +74,6 @@ static struct syscon *of_syscon_register(struct device_node *np, bool check_clk) syscon_config.val_bits = reg_io_width * 8; syscon_config.max_register = resource_size(&res) - reg_io_width; - list_add_tail(&syscon->list, &syscon_list); - syscon->regmap = regmap_init_mmio_clk(NULL, NULL, syscon->base, &syscon_config); @@ -93,6 +91,8 @@ static struct syscon *of_syscon_register(struct device_node *np, bool check_clk) } } + list_add_tail(&syscon->list, &syscon_list); + return syscon; err_map: -- 2.39.2