@@ -52,6 +52,7 @@ struct gab {
int level;
int status;
bool cable_plugged;
+ enum power_supply_property psy_props[];
};
static struct gab *to_generic_bat(struct power_supply *psy)
@@ -246,7 +247,10 @@ static int gab_probe(struct platform_device *pdev)
int index = ARRAY_SIZE(gab_props);
bool any = false;
- adc_bat = devm_kzalloc(&pdev->dev, sizeof(*adc_bat), GFP_KERNEL);
+ adc_bat = devm_kzalloc(&pdev->dev,
+ struct_size(adc_bat, psy_props,
+ ARRAY_SIZE(gab_props) + ARRAY_SIZE(gab_chan_name)),
+ GFP_KERNEL);
if (!adc_bat) {
dev_err(&pdev->dev, "failed to allocate memory\n");
return -ENOMEM;
@@ -264,20 +268,8 @@ static int gab_probe(struct platform_device *pdev)
psy_desc->external_power_changed = gab_ext_power_changed;
adc_bat->pdata = pdata;
- /*
- * copying the static properties and allocating extra memory for holding
- * the extra configurable properties received from platform data.
- */
- psy_desc->properties = kcalloc(ARRAY_SIZE(gab_props) +
- ARRAY_SIZE(gab_chan_name),
- sizeof(*psy_desc->properties),
- GFP_KERNEL);
- if (!psy_desc->properties) {
- ret = -ENOMEM;
- goto first_mem_fail;
- }
-
- memcpy(psy_desc->properties, gab_props, sizeof(gab_props));
+ /* copy static properties */
+ memcpy(adc_bat->psy_props, gab_props, sizeof(gab_props));
/*
* getting channel from iio and copying the battery properties
@@ -294,12 +286,12 @@ static int gab_probe(struct platform_device *pdev)
int index2;
for (index2 = 0; index2 < index; index2++) {
- if (psy_desc->properties[index2] ==
+ if (adc_bat->psy_props[index2] ==
gab_dyn_props[chan])
break; /* already known */
}
if (index2 == index) /* really new */
- psy_desc->properties[index++] =
+ adc_bat->psy_props[index++] =
gab_dyn_props[chan];
any = true;
}
@@ -317,6 +309,7 @@ static int gab_probe(struct platform_device *pdev)
* as come channels may be not be supported by the device.So
* we need to take care of that.
*/
+ psy_desc->properties = adc_bat->psy_props;
psy_desc->num_properties = index;
adc_bat->psy = power_supply_register(&pdev->dev, psy_desc, &psy_cfg);
@@ -358,8 +351,6 @@ static int gab_probe(struct platform_device *pdev)
iio_channel_release(adc_bat->channel[chan]);
}
second_mem_fail:
- kfree(psy_desc->properties);
-first_mem_fail:
return ret;
}
@@ -381,7 +372,6 @@ static int gab_remove(struct platform_device *pdev)
iio_channel_release(adc_bat->channel[chan]);
}
- kfree(adc_bat->psy_desc.properties);
cancel_delayed_work(&adc_bat->bat_work);
return 0;
}
psy_desc->properties will become pointer to const, so we can't use it for filling the property set. Let's append the list to private data structure and avoid introducing another variable to temporarily hold the pointer. Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl> Reported-by: kbuild test robot <lkp@intel.com> --- v3: new patch, required before constification of property lists --- drivers/power/supply/generic-adc-battery.c | 30 ++++++++-------------- 1 file changed, 10 insertions(+), 20 deletions(-)