diff mbox series

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

Message ID f44b3baa6349f9e86c0d06a32b5cf63ced727f7c.1585944770.git.mirq-linux@rere.qmqm.pl (mailing list archive)
State Not Applicable, archived
Headers show
Series extensions and fixes | expand

Commit Message

Michał Mirosław April 3, 2020, 8:20 p.m. UTC
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(-)
diff mbox series

Patch

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;
 }