mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-30 22:26:55 +00:00
regulator: raa215300: Fix resource leak in case of error
The clk_register_clkdev() allocates memory by calling vclkdev_alloc() and
this memory is not freed in the error path. Similarly, resources allocated
by clk_register_fixed_rate() are not freed in the error path.
Fix these issues by using devm_clk_hw_register_fixed_rate() and
devm_clk_hw_register_clkdev().
After this, the static variable clk is not needed. Replace it with
local variable hw in probe() and drop calling clk_unregister_fixed_rate()
from raa215300_rtc_unregister_device().
Fixes: 7bce166308
("regulator: Add Renesas PMIC RAA215300 driver")
Cc: stable@kernel.org
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://lore.kernel.org/r/20230816135550.146657-2-biju.das.jz@bp.renesas.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
9e6b398675
commit
e21ac64e66
1 changed files with 8 additions and 8 deletions
|
@ -38,8 +38,6 @@
|
||||||
#define RAA215300_REG_BLOCK_EN_RTC_EN BIT(6)
|
#define RAA215300_REG_BLOCK_EN_RTC_EN BIT(6)
|
||||||
#define RAA215300_RTC_DEFAULT_ADDR 0x6f
|
#define RAA215300_RTC_DEFAULT_ADDR 0x6f
|
||||||
|
|
||||||
static struct clk *clk;
|
|
||||||
|
|
||||||
static const struct regmap_config raa215300_regmap_config = {
|
static const struct regmap_config raa215300_regmap_config = {
|
||||||
.reg_bits = 8,
|
.reg_bits = 8,
|
||||||
.val_bits = 8,
|
.val_bits = 8,
|
||||||
|
@ -49,10 +47,6 @@ static const struct regmap_config raa215300_regmap_config = {
|
||||||
static void raa215300_rtc_unregister_device(void *data)
|
static void raa215300_rtc_unregister_device(void *data)
|
||||||
{
|
{
|
||||||
i2c_unregister_device(data);
|
i2c_unregister_device(data);
|
||||||
if (!clk) {
|
|
||||||
clk_unregister_fixed_rate(clk);
|
|
||||||
clk = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int raa215300_clk_present(struct i2c_client *client, const char *name)
|
static int raa215300_clk_present(struct i2c_client *client, const char *name)
|
||||||
|
@ -130,10 +124,16 @@ static int raa215300_i2c_probe(struct i2c_client *client)
|
||||||
u32 addr = RAA215300_RTC_DEFAULT_ADDR;
|
u32 addr = RAA215300_RTC_DEFAULT_ADDR;
|
||||||
struct i2c_board_info info = {};
|
struct i2c_board_info info = {};
|
||||||
struct i2c_client *rtc_client;
|
struct i2c_client *rtc_client;
|
||||||
|
struct clk_hw *hw;
|
||||||
ssize_t size;
|
ssize_t size;
|
||||||
|
|
||||||
clk = clk_register_fixed_rate(NULL, clk_name, NULL, 0, 32000);
|
hw = devm_clk_hw_register_fixed_rate(dev, clk_name, NULL, 0, 32000);
|
||||||
clk_register_clkdev(clk, clk_name, NULL);
|
if (IS_ERR(hw))
|
||||||
|
return PTR_ERR(hw);
|
||||||
|
|
||||||
|
ret = devm_clk_hw_register_clkdev(dev, hw, clk_name, NULL);
|
||||||
|
if (ret)
|
||||||
|
return dev_err_probe(dev, ret, "Failed to initialize clkdev\n");
|
||||||
|
|
||||||
if (np) {
|
if (np) {
|
||||||
int i;
|
int i;
|
||||||
|
|
Loading…
Reference in a new issue