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);