[PATCH v3 03/11] power: generic-adc-battery: fold psy_props[] to private data

From: MichaÅ MirosÅaw
Date: Fri Apr 03 2020 - 16:20:35 EST


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@xxxxxxxxxxxx>
Reported-by: kbuild test robot <lkp@xxxxxxxxx>
---
v3: new patch, required before constification of property lists
---
drivers/power/supply/generic-adc-battery.c | 30 ++++++++--------------
1 file changed, 10 insertions(+), 20 deletions(-)

diff --git a/drivers/power/supply/generic-adc-battery.c b/drivers/power/supply/generic-adc-battery.c
index bc462d1ec963..b3b567914dd7 100644
--- a/drivers/power/supply/generic-adc-battery.c
+++ b/drivers/power/supply/generic-adc-battery.c
@@ -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;
}
--
2.20.1