From 3a35a943a280eecfb19be4bb8b094280476a8fef Mon Sep 17 00:00:00 2001 From: Finley Xiao Date: Thu, 17 Apr 2025 19:54:45 +0800 Subject: [PATCH] soc: rockchip: opp_select: Fix memleak in rockchip_opp_set_config() Change-Id: I93224fd07ccf594a12a6365fa6c81519a8f24a1e Signed-off-by: Finley Xiao --- drivers/soc/rockchip/rockchip_opp_select.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/soc/rockchip/rockchip_opp_select.c b/drivers/soc/rockchip/rockchip_opp_select.c index 8be1980533fa..40898c39c85a 100644 --- a/drivers/soc/rockchip/rockchip_opp_select.c +++ b/drivers/soc/rockchip/rockchip_opp_select.c @@ -1541,6 +1541,7 @@ static int rockchip_opp_set_config(struct device *dev, struct rockchip_opp_info struct clk *clk = NULL; const char *reg_names[] = {NULL, NULL, NULL}; const char *clk_names[] = {NULL, NULL, NULL}; + int ret = 0; if (clk_name) { clk = clk_get(dev, clk_name); @@ -1592,7 +1593,8 @@ static int rockchip_opp_set_config(struct device *dev, struct rockchip_opp_info info->opp_token = dev_pm_opp_set_config(dev, &config); if (info->opp_token < 0) { dev_err(dev, "failed to set opp config\n"); - return info->opp_token; + ret = info->opp_token; + goto err; } /* @@ -1602,10 +1604,15 @@ static int rockchip_opp_set_config(struct device *dev, struct rockchip_opp_info */ if (rockchip_opp_set_regulator_helper(dev, info)) { dev_err(dev, "failed to set opp regulator helper\n"); - return -EINVAL; + dev_pm_opp_clear_config(info->opp_token); + info->opp_token = 0; + ret = -EINVAL; } - return 0; +err: + kfree(config.supported_hw); + + return ret; } void rockchip_opp_dvfs_lock(struct rockchip_opp_info *info) @@ -1778,6 +1785,7 @@ EXPORT_SYMBOL(rockchip_init_opp_info); void rockchip_uninit_opp_info(struct device *dev, struct rockchip_opp_info *info) { dev_pm_opp_clear_config(info->opp_token); + info->opp_token = 0; } EXPORT_SYMBOL(rockchip_uninit_opp_info);