regulator: max8907: Fix using wrong dev argument for calling of_regulator_match
Subsystems (2)
PATCH 1/3 regulator: max8907: Fix using wrong dev argument for calling of_regulator_match
The dev parameter is the device requesting the data.
In this case it should be &pdev->dev rather than pdev->dev.parent.
The dev parameter is used to call devm_kzalloc in of_get_regulator_init_data(), which means this fixes a memory leak because the memory is allocated every time probe() is called, thus it should be freed when this driver is unloaded.
--- drivers/regulator/max8907-regulator.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/regulator/max8907-regulator.c +1 -2
@@ -237,8 +237,7 @@ static int max8907_regulator_parse_dt(struct platform_device *pdev)return -EINVAL ; } - ret =of_regulator_match (pdev->dev.parent, regulators, - max8907_matches, + ret =of_regulator_match (&pdev->dev, regulators, max8907_matches,ARRAY_SIZE (max8907_matches));if (ret <0 ) { dev_err(&pdev->dev, "Error parsing regulator init data: %d\n",
Signature · 1 line
1.7.9.5
PATCH 2/3 regulator: max77686: Fix using wrong dev argument at various places
Use &pdev->dev rather than iodev->dev for dev_err(). Use &pdev->dev rather than iodev->dev for devm_kzalloc() and of_regulator_match(), this fixes memory leak.
--- drivers/regulator/max77686.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
drivers/regulator/max77686.c +8 -7
@@ -379,9 +379,10 @@ static struct regulator_desc regulators[] = { };#ifdef CONFIG_OF -static int max77686_pmic_dt_parse_pdata (struct max77686_dev *iodev, +static int max77686_pmic_dt_parse_pdata (struct platform_device *pdev,struct max77686_platform_data *pdata) { +struct max77686_dev *iodev =dev_get_drvdata (pdev->dev.parent);struct device_node *pmic_np, *regulators_np;struct max77686_regulator_data *rdata;struct of_regulator_match rmatch;
@@ -390,15 +391,15 @@ static int max77686_pmic_dt_parse_pdata(struct max77686_dev *iodev, pmic_np = iodev->dev->of_node; regulators_np =of_find_node_by_name (pmic_np,"voltage-regulators" );if (!regulators_np) { -dev_err (iodev->dev,"could not find regulators sub-node\n" ); +dev_err (&pdev->dev,"could not find regulators sub-node\n" );return -EINVAL ; } pdata->num_regulators =ARRAY_SIZE (regulators); - rdata =devm_kzalloc (iodev->dev,sizeof (*rdata) * + rdata =devm_kzalloc (&pdev->dev,sizeof (*rdata) * pdata->num_regulators,GFP_KERNEL );if (!rdata) { -dev_err (iodev->dev, +dev_err (&pdev->dev,"could not allocate memory for regulator data\n" );return -ENOMEM ; }
@@ -407,7 +408,7 @@ static int max77686_pmic_dt_parse_pdata(struct max77686_dev *iodev, rmatch.name = regulators[i].name; rmatch.init_data =NULL ; rmatch.of_node =NULL ; -of_regulator_match (iodev->dev, regulators_np, &rmatch,1 ); +of_regulator_match (&pdev->dev, regulators_np, &rmatch,1 ); rdata[i].initdata = rmatch.init_data; rdata[i].of_node = rmatch.of_node; }
@@ -417,7 +418,7 @@ static int max77686_pmic_dt_parse_pdata(struct max77686_dev *iodev, return 0; }#else -static int max77686_pmic_dt_parse_pdata (struct max77686_dev *iodev, +static int max77686_pmic_dt_parse_pdata (struct platform_device *pdev,struct max77686_platform_data *pdata) {return 0 ;
@@ -440,7 +441,7 @@ static int max77686_pmic_probe(struct platform_device *pdev) }if (iodev->dev->of_node) { - ret =max77686_pmic_dt_parse_pdata (iodev, pdata); + ret =max77686_pmic_dt_parse_pdata (pdev, pdata);if (ret)return ret; }
Signature · 1 line
1.7.9.5
PATCH 3/3 regulator: max8997: Fix using wrong dev argument at various places
In reply to Axel LinUse &pdev->dev rather than iodev->dev for dev_err(), dev_warn() and dev_info(). Use &pdev->dev rather than iodev->dev for devm_kzalloc() and of_get_regulator_init_data(), this fixes memory leak.
--- drivers/regulator/max8997.c | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-)
drivers/regulator/max8997.c +19 -20
@@ -891,7 +891,7 @@ static struct regulator_desc regulators[] = { };#ifdef CONFIG_OF -static int max8997_pmic_dt_parse_dvs_gpio (struct max8997_dev *iodev, +static int max8997_pmic_dt_parse_dvs_gpio (struct platform_device *pdev,struct max8997_platform_data *pdata,struct device_node *pmic_np) {
@@ -901,7 +901,7 @@ static int max8997_pmic_dt_parse_dvs_gpio(struct max8997_dev *iodev, gpio =of_get_named_gpio (pmic_np,"max8997,pmic-buck125-dvs-gpios" , i);if (!gpio_is_valid (gpio)) { -dev_err (iodev->dev,"invalid gpio[%d]: %d\n" , i, gpio); +dev_err (&pdev->dev,"invalid gpio[%d]: %d\n" , i, gpio);return -EINVAL ; } pdata->buck125_gpios[i] = gpio;
@@ -909,22 +909,23 @@ static int max8997_pmic_dt_parse_dvs_gpio(struct max8997_dev *iodev,return 0 ; } -static int max8997_pmic_dt_parse_pdata (struct max8997_dev *iodev, +static int max8997_pmic_dt_parse_pdata (struct platform_device *pdev,struct max8997_platform_data *pdata) { +struct max8997_dev *iodev =dev_get_drvdata (pdev->dev.parent);struct device_node *pmic_np, *regulators_np, *reg_np;struct max8997_regulator_data *rdata;unsigned int i, dvs_voltage_nr =1 , ret; pmic_np = iodev->dev->of_node;if (!pmic_np) { -dev_err (iodev->dev,"could not find pmic sub-node\n" ); +dev_err (&pdev->dev,"could not find pmic sub-node\n" );return -ENODEV ; } regulators_np =of_find_node_by_name (pmic_np,"regulators" );if (!regulators_np) { -dev_err (iodev->dev,"could not find regulators sub-node\n" ); +dev_err (&pdev->dev,"could not find regulators sub-node\n" );return -EINVAL ; }
@@ -933,11 +934,10 @@ static int max8997_pmic_dt_parse_pdata(struct max8997_dev *iodev,for_each_child_of_node (regulators_np, reg_np) pdata->num_regulators++; - rdata =devm_kzalloc (iodev->dev,sizeof (*rdata) * + rdata =devm_kzalloc (&pdev->dev,sizeof (*rdata) * pdata->num_regulators,GFP_KERNEL );if (!rdata) { -dev_err (iodev->dev,"could not allocate memory for " -"regulator data\n" ); +dev_err (&pdev->dev,"could not allocate memory for regulator data\n" );return -ENOMEM ; }
@@ -948,14 +948,14 @@ static int max8997_pmic_dt_parse_pdata(struct max8997_dev *iodev,break ;if (i ==ARRAY_SIZE (regulators)) { -dev_warn (iodev->dev,"don't know how to configure " -"regulator %s\n" , reg_np->name); +dev_warn (&pdev->dev,"don't know how to configure regulator %s\n" , + reg_np->name);continue ; } rdata->id = i; - rdata->initdata =of_get_regulator_init_data ( - iodev->dev, reg_np); + rdata->initdata =of_get_regulator_init_data (&pdev->dev, + reg_np); rdata->reg_node = reg_np; rdata++; }
@@ -971,7 +971,7 @@ static int max8997_pmic_dt_parse_pdata(struct max8997_dev *iodev,if (pdata->buck1_gpiodvs || pdata->buck2_gpiodvs || pdata->buck5_gpiodvs) { - ret =max8997_pmic_dt_parse_dvs_gpio (iodev, pdata, pmic_np); + ret =max8997_pmic_dt_parse_dvs_gpio (pdev, pdata, pmic_np);if (ret)return -EINVAL ;
@@ -982,8 +982,7 @@ static int max8997_pmic_dt_parse_pdata(struct max8997_dev *iodev, }else {if (pdata->buck125_default_idx >=8 ) { pdata->buck125_default_idx =0 ; -dev_info (iodev->dev,"invalid value for " -"default dvs index, using 0 instead\n" ); +dev_info (&pdev->dev,"invalid value for default dvs index, using 0 instead\n" ); } }
@@ -997,28 +996,28 @@ static int max8997_pmic_dt_parse_pdata(struct max8997_dev *iodev,if (of_property_read_u32_array (pmic_np,"max8997,pmic-buck1-dvs-voltage" , pdata->buck1_voltage, dvs_voltage_nr)) { -dev_err (iodev->dev,"buck1 voltages not specified\n" ); +dev_err (&pdev->dev,"buck1 voltages not specified\n" );return -EINVAL ; }if (of_property_read_u32_array (pmic_np,"max8997,pmic-buck2-dvs-voltage" , pdata->buck2_voltage, dvs_voltage_nr)) { -dev_err (iodev->dev,"buck2 voltages not specified\n" ); +dev_err (&pdev->dev,"buck2 voltages not specified\n" );return -EINVAL ; }if (of_property_read_u32_array (pmic_np,"max8997,pmic-buck5-dvs-voltage" , pdata->buck5_voltage, dvs_voltage_nr)) { -dev_err (iodev->dev,"buck5 voltages not specified\n" ); +dev_err (&pdev->dev,"buck5 voltages not specified\n" );return -EINVAL ; } return 0; }#else -static int max8997_pmic_dt_parse_pdata (struct max8997_dev *iodev, +static int max8997_pmic_dt_parse_pdata (struct platform_device *pdev,struct max8997_platform_data *pdata) {return 0 ;
@@ -1042,7 +1041,7 @@ static int max8997_pmic_probe(struct platform_device *pdev) }if (iodev->dev->of_node) { - ret =max8997_pmic_dt_parse_pdata (iodev, pdata); + ret =max8997_pmic_dt_parse_pdata (pdev, pdata);if (ret)return ret; }
Signature · 1 line
1.7.9.5
Quoted 6 lines · Axel Lin
The dev parameter is the device requesting the data.
In this case it should be&pdev->devrather thanpdev->dev.parent.The dev parameter is used to call
devm_kzallocinof_get_regulator_init_data(), which means this fixes a memory leak because the memory is allocated every timeprobe()is called, thus it should be freed when this driver is unloaded.
Mark Brown
AppliedQuoted 2 lines · Axel Lin
The dev parameter is the device requesting the data.
In this case it should be&pdev->devrather thanpdev->dev.parent.
Applied all, thanks.
Re: [PATCH 2/3] regulator: max77686: Fix using wrong dev argument at various places
In reply to Axel LinQuoted 6 lines · Axel Lin
Use
&pdev->devrather thaniodev->devfordev_err(). Use&pdev->devrather thaniodev->devfordevm_kzalloc()andof_regulator_match(), this fixes memory leak.Signed-off-by Axel Lin <[email protected]>---
Thanks.