From patchwork Fri Jan 30 14:47:52 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Krzysztof Kozlowski X-Patchwork-Id: 5751211 Return-Path: X-Original-To: patchwork-linux-acpi@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 0E0129F302 for ; Fri, 30 Jan 2015 14:53:21 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id B57DB201CE for ; Fri, 30 Jan 2015 14:53:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7E0F92027D for ; Fri, 30 Jan 2015 14:53:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1422710AbbA3Osy (ORCPT ); Fri, 30 Jan 2015 09:48:54 -0500 Received: from mailout1.w1.samsung.com ([210.118.77.11]:56991 "EHLO mailout1.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1422649AbbA3Oso (ORCPT ); Fri, 30 Jan 2015 09:48:44 -0500 Received: from eucpsbgm1.samsung.com (unknown [203.254.199.244]) by mailout1.w1.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NIZ00LPKW00XW80@mailout1.w1.samsung.com>; Fri, 30 Jan 2015 14:52:49 +0000 (GMT) X-AuditID: cbfec7f4-b7f126d000001e9a-63-54cb99378903 Received: from eusync2.samsung.com ( [203.254.199.212]) by eucpsbgm1.samsung.com (EUCPMTA) with SMTP id FD.29.07834.7399BC45; Fri, 30 Jan 2015 14:46:15 +0000 (GMT) Received: from AMDC1943.digital.local ([106.116.151.171]) by eusync2.samsung.com (Oracle Communications Messaging Server 7u4-23.01(7.0.4.23.0) 64bit (built Aug 10 2011)) with ESMTPA id <0NIZ00EV0VSES470@eusync2.samsung.com>; Fri, 30 Jan 2015 14:48:40 +0000 (GMT) From: Krzysztof Kozlowski To: Sebastian Reichel , Dmitry Eremin-Solenikov , David Woodhouse , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, "Rafael J. Wysocki" , Len Brown , Jiri Kosina , David Herrmann , Cezary Jackiewicz , Darren Hart , Support Opensource , Milo Kim , Julian Andres Klode , Marc Dietrich , Greg Kroah-Hartman , linux-acpi@vger.kernel.org, linux-input@vger.kernel.org, platform-driver-x86@vger.kernel.org, patches@opensource.wolfsonmicro.com, ac100@lists.launchpad.net, linux-tegra@vger.kernel.org, devel@driverdev.osuosl.org, Linus Walleij , Samuel Ortiz , Lee Jones , linux-arm-kernel@lists.infradead.org, Ingo Molnar , "H. Peter Anvin" , x86@kernel.org, Daniel Mack , Haojian Zhuang , Robert Jarzmik , Russell King Cc: Thomas Gleixner , Pavel Machek , Kyungmin Park , Bartlomiej Zolnierkiewicz , Krzysztof Kozlowski Subject: [PATCH v3 14/20] power_supply: charger-manager: Decrement the power supply's device reference counter Date: Fri, 30 Jan 2015 15:47:52 +0100 Message-id: <1422629278-12202-15-git-send-email-k.kozlowski@samsung.com> X-Mailer: git-send-email 1.9.1 In-reply-to: <1422629278-12202-1-git-send-email-k.kozlowski@samsung.com> References: <1422629278-12202-1-git-send-email-k.kozlowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAAy2ReUiTcRjH/e099k4cvE2zF/8IEiRU1I0inyLFZNHbP5UkQRHp1KGGF5vT LCLT1LxtHpioKVrzwmuyMqeWx0qn5pUd8yAPFK+8C/HIaf99vt/n+zzfPx4KE3zErajAkHCp LEQSZE2a4vq9T8MOzi/1nsLZQoC03hUO1OXWEFD6ORmHmN15HJTTvzHQ9mxzoWTIEpKKhfCi PBOD2JIaEvqrnSGn7gS8WX1FQlN+CQ4LcyLojVnkwsRmJ4LGX0skZO2oOKBqSUdQPzVCwI+1 LQKG3ueTsJ7agSBxI48EwxAfEr8UI1BtV+Mw+KHoYGFpn4Sx7k4SKrVzGPToBwnIWzQHfTIB +qZwaI4bwEBdn43B39opwu00+yw2hWTL1pzY8ZZ2nE2vXifYxrwxLruyeo+dycjksuoyO3Z6 XkWw9RWJJDs6oiXZ5b4+LlvY5cG2FlQdBEqfsJ0po/gNqzumF/2kQYERUpmTq7dpQEvi+bDW cw+6c3awaDRjn4R4FEOfZb71VKMjtmT6x2vIJGRKCejXiNkYjv0v0jjMVnw8ZkyR9BlGrSo9 HFjQSzxGl6bFjQKjDYhp1JZzjClzOoxRNsUd3sVpG2awtpdrZD7NMh37C9hR30mmS5dJGJl3 4NfOTR6ygL7CpH/NJTMQvwiZVKDjUoVvmNzHP1jkKJcEyxUh/o6+ocH16OjtG+9Qie5CG6Ip ZG3G/y7RewoISYQ8KrgNMRRmbcHPUh5YfD9J1EOpLNRLpgiSytsQh+JZRSOfGa9UnfOATVXD 8hqKIPW3rlGxLgINb/Zu0cSpYY12cnSg1aMqOy3h0QJXcDv5bUCz932kUwojle0VgVOGVoNY 6CbOHSg+9qfu+VWz64rLjpUOj120e7bZHEPk7s0c8U9RwSVbuT/FearhpburxfYid9fNcL7J KN0g0nATrHF5gERkh8nkkn+cZCP01AIAAA== Sender: linux-acpi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Use power_supply_put() to decrement the power supply's device reference counter. Signed-off-by: Krzysztof Kozlowski Acked-by: Pavel Machek Reviewed-by: Bartlomiej Zolnierkiewicz Reviewed-by: Sebastian Reichel --- drivers/power/charger-manager.c | 70 +++++++++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 23 deletions(-) diff --git a/drivers/power/charger-manager.c b/drivers/power/charger-manager.c index 8aa780125dfa..c2aef7a5582b 100644 --- a/drivers/power/charger-manager.c +++ b/drivers/power/charger-manager.c @@ -107,6 +107,7 @@ static bool is_batt_present(struct charger_manager *cm) &val); if (ret == 0 && val.intval) present = true; + power_supply_put(psy); break; case CM_CHARGER_STAT: for (i = 0; cm->desc->psy_charger_stat[i]; i++) { @@ -120,6 +121,7 @@ static bool is_batt_present(struct charger_manager *cm) ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_PRESENT, &val); + power_supply_put(psy); if (ret == 0 && val.intval) { present = true; break; @@ -157,6 +159,7 @@ static bool is_ext_pwr_online(struct charger_manager *cm) ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_ONLINE, &val); + power_supply_put(psy); if (ret == 0 && val.intval) { online = true; break; @@ -186,6 +189,7 @@ static int get_batt_uV(struct charger_manager *cm, int *uV) ret = power_supply_get_property(fuel_gauge, POWER_SUPPLY_PROP_VOLTAGE_NOW, &val); + power_supply_put(fuel_gauge); if (ret) return ret; @@ -229,10 +233,13 @@ static bool is_charging(struct charger_manager *cm) if (ret) { dev_warn(cm->dev, "Cannot read ONLINE value from %s\n", cm->desc->psy_charger_stat[i]); + power_supply_put(psy); continue; } - if (val.intval == 0) + if (val.intval == 0) { + power_supply_put(psy); continue; + } /* * 3. The charger should not be FULL, DISCHARGING, @@ -240,6 +247,7 @@ static bool is_charging(struct charger_manager *cm) */ ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_STATUS, &val); + power_supply_put(psy); if (ret) { dev_warn(cm->dev, "Cannot read STATUS value from %s\n", cm->desc->psy_charger_stat[i]); @@ -267,6 +275,7 @@ static bool is_full_charged(struct charger_manager *cm) struct charger_desc *desc = cm->desc; union power_supply_propval val; struct power_supply *fuel_gauge; + bool is_full = false; int ret = 0; int uV; @@ -284,15 +293,19 @@ static bool is_full_charged(struct charger_manager *cm) /* Not full if capacity of fuel gauge isn't full */ ret = power_supply_get_property(fuel_gauge, POWER_SUPPLY_PROP_CHARGE_FULL, &val); - if (!ret && val.intval > desc->fullbatt_full_capacity) - return true; + if (!ret && val.intval > desc->fullbatt_full_capacity) { + is_full = true; + goto out; + } } /* Full, if it's over the fullbatt voltage */ if (desc->fullbatt_uV > 0) { ret = get_batt_uV(cm, &uV); - if (!ret && uV >= desc->fullbatt_uV) - return true; + if (!ret && uV >= desc->fullbatt_uV) { + is_full = true; + goto out; + } } /* Full, if the capacity is more than fullbatt_soc */ @@ -301,11 +314,15 @@ static bool is_full_charged(struct charger_manager *cm) ret = power_supply_get_property(fuel_gauge, POWER_SUPPLY_PROP_CAPACITY, &val); - if (!ret && val.intval >= desc->fullbatt_soc) - return true; + if (!ret && val.intval >= desc->fullbatt_soc) { + is_full = true; + goto out; + } } - return false; +out: + power_supply_put(fuel_gauge); + return is_full; } /** @@ -578,14 +595,18 @@ static int cm_get_battery_temperature_by_psy(struct charger_manager *cm, int *temp) { struct power_supply *fuel_gauge; + int ret; fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); if (!fuel_gauge) return -ENODEV; - return power_supply_get_property(fuel_gauge, + ret = power_supply_get_property(fuel_gauge, POWER_SUPPLY_PROP_TEMP, (union power_supply_propval *)temp); + power_supply_put(fuel_gauge); + + return ret; } static int cm_get_battery_temperature(struct charger_manager *cm, @@ -867,7 +888,7 @@ static int charger_get_property(struct power_supply *psy, { struct charger_manager *cm = power_supply_get_drvdata(psy); struct charger_desc *desc = cm->desc; - struct power_supply *fuel_gauge; + struct power_supply *fuel_gauge = NULL; int ret = 0; int uV; @@ -910,12 +931,6 @@ static int charger_get_property(struct power_supply *psy, case POWER_SUPPLY_PROP_TEMP_AMBIENT: return cm_get_battery_temperature(cm, &val->intval); case POWER_SUPPLY_PROP_CAPACITY: - fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); - if (!fuel_gauge) { - ret = -ENODEV; - break; - } - if (!is_batt_present(cm)) { /* There is no battery. Assume 100% */ val->intval = 100; @@ -926,6 +941,12 @@ static int charger_get_property(struct power_supply *psy, mdelay(2000); pr_err("End wait...\n"); + fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); + if (!fuel_gauge) { + ret = -ENODEV; + break; + } + ret = power_supply_get_property(fuel_gauge, POWER_SUPPLY_PROP_CAPACITY, val); if (ret) @@ -1000,6 +1021,8 @@ static int charger_get_property(struct power_supply *psy, default: return -EINVAL; } + if (fuel_gauge) + power_supply_put(fuel_gauge); return ret; } @@ -1681,13 +1704,7 @@ static int charger_manager_probe(struct platform_device *pdev) desc->psy_charger_stat[i]); return -ENODEV; } - } - - fuel_gauge = power_supply_get_by_name(desc->psy_fuel_gauge); - if (!fuel_gauge) { - dev_err(&pdev->dev, "Cannot find power supply \"%s\"\n", - desc->psy_fuel_gauge); - return -ENODEV; + power_supply_put(psy); } if (desc->polling_interval_ms == 0 || @@ -1727,6 +1744,12 @@ static int charger_manager_probe(struct platform_device *pdev) cm->charger_psy_desc.num_properties = psy_default.num_properties; /* Find which optional psy-properties are available */ + fuel_gauge = power_supply_get_by_name(desc->psy_fuel_gauge); + if (!fuel_gauge) { + dev_err(&pdev->dev, "Cannot find power supply \"%s\"\n", + desc->psy_fuel_gauge); + return -ENODEV; + } if (!power_supply_get_property(fuel_gauge, POWER_SUPPLY_PROP_CHARGE_NOW, &val)) { cm->charger_psy_desc.properties[cm->charger_psy_desc.num_properties] = @@ -1746,6 +1769,7 @@ static int charger_manager_probe(struct platform_device *pdev) dev_err(&pdev->dev, "Failed to initialize thermal data\n"); cm->desc->measure_battery_temp = false; } + power_supply_put(fuel_gauge); INIT_DELAYED_WORK(&cm->fullbatt_vchk_work, fullbatt_vchk);