cpufreq: dt: Fix memory leak when cpu on/off

Fixes: e51ed31ccd0f ("cpufreq: dt: Add support to get static power")
Change-Id: I613a14a061490fb69e913b8c2cf6677757c73ced
Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
This commit is contained in:
Finley Xiao 2019-06-18 09:32:32 +08:00 committed by Tao Huang
commit f56e208d80
2 changed files with 22 additions and 14 deletions

View file

@ -4,6 +4,7 @@
*/
#include <linux/kernel.h>
#include <linux/of.h>
#include <linux/slab.h>
#include <linux/thermal.h>
#include <soc/rockchip/rockchip_ipa.h>
#include <soc/rockchip/rockchip_opp_select.h>
@ -11,17 +12,26 @@
#define FALLBACK_STATIC_TEMPERATURE 55000
int rockchip_ipa_power_model_init(struct device *dev, char *lkg_name,
struct ipa_power_model_data **data)
/**
* rockchip_ipa_power_model_init() - initialise ipa power model parameter
* @dev: device for which we do this operation
* @lkg_name: nvmem cell name from nvmem-cell-names property
*
* Return: a valid struct ipa_power_model_data pointer on success, and the onwer
* should use kfree to release the memory by itself. on failure, it returns a
* corresponding ERR_PTR().
*/
struct ipa_power_model_data *rockchip_ipa_power_model_init(struct device *dev,
char *lkg_name)
{
struct device_node *model_node;
struct ipa_power_model_data *model_data;
const char *tz_name;
int ret;
model_data = devm_kzalloc(dev, sizeof(*model_data), GFP_KERNEL);
model_data = kzalloc(sizeof(*model_data), GFP_KERNEL);
if (!model_data)
return -ENOMEM;
return ERR_PTR(-ENOMEM);
model_node = of_find_compatible_node(dev->of_node,
NULL, "simple-power-model");
@ -61,13 +71,12 @@ int rockchip_ipa_power_model_init(struct device *dev, char *lkg_name,
rockchip_of_get_leakage(dev, lkg_name, &model_data->leakage);
of_property_read_u32(model_node, "ref-leakage",
&model_data->ref_leakage);
*data = model_data;
return 0;
return model_data;
err:
devm_kfree(dev, model_data);
kfree(model_data);
return ret;
return ERR_PTR(ret);
}
EXPORT_SYMBOL(rockchip_ipa_power_model_init);

View file

@ -15,17 +15,16 @@ struct ipa_power_model_data {
};
#ifdef CONFIG_ROCKCHIP_IPA
int rockchip_ipa_power_model_init(struct device *dev, char *lkg_name,
struct ipa_power_model_data **data);
struct ipa_power_model_data *rockchip_ipa_power_model_init(struct device *dev,
char *lkg_name);
unsigned long
rockchip_ipa_get_static_power(struct ipa_power_model_data *model_data,
unsigned long voltage_mv);
#else
static inline int
rockchip_ipa_power_model_init(struct device *dev, char *lkg_name,
struct ipa_power_model_data **data)
static inline struct ipa_power_model_data *
rockchip_ipa_power_model_init(struct device *dev, char *lkg_name)
{
return -ENOTSUPP;
return ERR_PTR(-ENOTSUPP);
};
static inline unsigned long