| From a427503edaaed9b75ed9746a654cece7e93e60a8 Mon Sep 17 00:00:00 2001 |
| From: "H. Nikolaus Schaller" <hns@goldelico.com> |
| Date: Tue, 26 Jun 2018 15:28:30 +0200 |
| Subject: power: generic-adc-battery: check for duplicate properties copied from iio channels |
| |
| From: H. Nikolaus Schaller <hns@goldelico.com> |
| |
| commit a427503edaaed9b75ed9746a654cece7e93e60a8 upstream. |
| |
| If an iio channel defines a basic property, there are duplicate entries |
| in /sys/class/power/*/uevent. |
| |
| So add a check to avoid duplicates. Since all channels may be duplicates, |
| we have to modify the related error check. |
| |
| Signed-off-by: H. Nikolaus Schaller <hns@goldelico.com> |
| Cc: stable@vger.kernel.org |
| Fixes: e60fea794e6e ("power: battery: Generic battery driver using IIO") |
| Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/power/supply/generic-adc-battery.c | 15 +++++++++++++-- |
| 1 file changed, 13 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/power/supply/generic-adc-battery.c |
| +++ b/drivers/power/supply/generic-adc-battery.c |
| @@ -246,6 +246,7 @@ static int gab_probe(struct platform_dev |
| int ret = 0; |
| int chan; |
| int index = ARRAY_SIZE(gab_props); |
| + bool any = false; |
| |
| adc_bat = devm_kzalloc(&pdev->dev, sizeof(*adc_bat), GFP_KERNEL); |
| if (!adc_bat) { |
| @@ -292,12 +293,22 @@ static int gab_probe(struct platform_dev |
| adc_bat->channel[chan] = NULL; |
| } else { |
| /* copying properties for supported channels only */ |
| - psy_desc->properties[index++] = gab_dyn_props[chan]; |
| + int index2; |
| + |
| + for (index2 = 0; index2 < index; index2++) { |
| + if (psy_desc->properties[index2] == |
| + gab_dyn_props[chan]) |
| + break; /* already known */ |
| + } |
| + if (index2 == index) /* really new */ |
| + psy_desc->properties[index++] = |
| + gab_dyn_props[chan]; |
| + any = true; |
| } |
| } |
| |
| /* none of the channels are supported so let's bail out */ |
| - if (index == ARRAY_SIZE(gab_props)) { |
| + if (!any) { |
| ret = -ENODEV; |
| goto second_mem_fail; |
| } |