aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/power/charger-manager.c
diff options
context:
space:
mode:
authorKrzysztof Kozlowski <k.kozlowski@samsung.com>2015-03-12 03:44:14 -0400
committerSebastian Reichel <sre@kernel.org>2015-03-13 18:15:52 -0400
commitb43eb35abfdeb4a999f8214ae25f2556227eb030 (patch)
treefe26a6172865b367fe6c2bbda0cff1abb45f7f32 /drivers/power/charger-manager.c
parent03e81acce5568c7105dc5bef6984c8b0edfe8d45 (diff)
power_supply: charger-manager: Decrement the power supply's device reference counter
Use power_supply_put() to decrement the power supply's device reference counter. Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> Acked-by: Pavel Machek <pavel@ucw.cz> Reviewed-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> Reviewed-by: Sebastian Reichel <sre@kernel.org> Signed-off-by: Sebastian Reichel <sre@kernel.org>
Diffstat (limited to 'drivers/power/charger-manager.c')
-rw-r--r--drivers/power/charger-manager.c70
1 files changed, 47 insertions, 23 deletions
diff --git a/drivers/power/charger-manager.c b/drivers/power/charger-manager.c
index 5c47409c6889..e23b7ba2cbd2 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)
107 &val); 107 &val);
108 if (ret == 0 && val.intval) 108 if (ret == 0 && val.intval)
109 present = true; 109 present = true;
110 power_supply_put(psy);
110 break; 111 break;
111 case CM_CHARGER_STAT: 112 case CM_CHARGER_STAT:
112 for (i = 0; cm->desc->psy_charger_stat[i]; i++) { 113 for (i = 0; cm->desc->psy_charger_stat[i]; i++) {
@@ -120,6 +121,7 @@ static bool is_batt_present(struct charger_manager *cm)
120 121
121 ret = power_supply_get_property(psy, 122 ret = power_supply_get_property(psy,
122 POWER_SUPPLY_PROP_PRESENT, &val); 123 POWER_SUPPLY_PROP_PRESENT, &val);
124 power_supply_put(psy);
123 if (ret == 0 && val.intval) { 125 if (ret == 0 && val.intval) {
124 present = true; 126 present = true;
125 break; 127 break;
@@ -157,6 +159,7 @@ static bool is_ext_pwr_online(struct charger_manager *cm)
157 159
158 ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_ONLINE, 160 ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_ONLINE,
159 &val); 161 &val);
162 power_supply_put(psy);
160 if (ret == 0 && val.intval) { 163 if (ret == 0 && val.intval) {
161 online = true; 164 online = true;
162 break; 165 break;
@@ -186,6 +189,7 @@ static int get_batt_uV(struct charger_manager *cm, int *uV)
186 189
187 ret = power_supply_get_property(fuel_gauge, 190 ret = power_supply_get_property(fuel_gauge,
188 POWER_SUPPLY_PROP_VOLTAGE_NOW, &val); 191 POWER_SUPPLY_PROP_VOLTAGE_NOW, &val);
192 power_supply_put(fuel_gauge);
189 if (ret) 193 if (ret)
190 return ret; 194 return ret;
191 195
@@ -229,10 +233,13 @@ static bool is_charging(struct charger_manager *cm)
229 if (ret) { 233 if (ret) {
230 dev_warn(cm->dev, "Cannot read ONLINE value from %s\n", 234 dev_warn(cm->dev, "Cannot read ONLINE value from %s\n",
231 cm->desc->psy_charger_stat[i]); 235 cm->desc->psy_charger_stat[i]);
236 power_supply_put(psy);
232 continue; 237 continue;
233 } 238 }
234 if (val.intval == 0) 239 if (val.intval == 0) {
240 power_supply_put(psy);
235 continue; 241 continue;
242 }
236 243
237 /* 244 /*
238 * 3. The charger should not be FULL, DISCHARGING, 245 * 3. The charger should not be FULL, DISCHARGING,
@@ -240,6 +247,7 @@ static bool is_charging(struct charger_manager *cm)
240 */ 247 */
241 ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_STATUS, 248 ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_STATUS,
242 &val); 249 &val);
250 power_supply_put(psy);
243 if (ret) { 251 if (ret) {
244 dev_warn(cm->dev, "Cannot read STATUS value from %s\n", 252 dev_warn(cm->dev, "Cannot read STATUS value from %s\n",
245 cm->desc->psy_charger_stat[i]); 253 cm->desc->psy_charger_stat[i]);
@@ -267,6 +275,7 @@ static bool is_full_charged(struct charger_manager *cm)
267 struct charger_desc *desc = cm->desc; 275 struct charger_desc *desc = cm->desc;
268 union power_supply_propval val; 276 union power_supply_propval val;
269 struct power_supply *fuel_gauge; 277 struct power_supply *fuel_gauge;
278 bool is_full = false;
270 int ret = 0; 279 int ret = 0;
271 int uV; 280 int uV;
272 281
@@ -284,15 +293,19 @@ static bool is_full_charged(struct charger_manager *cm)
284 /* Not full if capacity of fuel gauge isn't full */ 293 /* Not full if capacity of fuel gauge isn't full */
285 ret = power_supply_get_property(fuel_gauge, 294 ret = power_supply_get_property(fuel_gauge,
286 POWER_SUPPLY_PROP_CHARGE_FULL, &val); 295 POWER_SUPPLY_PROP_CHARGE_FULL, &val);
287 if (!ret && val.intval > desc->fullbatt_full_capacity) 296 if (!ret && val.intval > desc->fullbatt_full_capacity) {
288 return true; 297 is_full = true;
298 goto out;
299 }
289 } 300 }
290 301
291 /* Full, if it's over the fullbatt voltage */ 302 /* Full, if it's over the fullbatt voltage */
292 if (desc->fullbatt_uV > 0) { 303 if (desc->fullbatt_uV > 0) {
293 ret = get_batt_uV(cm, &uV); 304 ret = get_batt_uV(cm, &uV);
294 if (!ret && uV >= desc->fullbatt_uV) 305 if (!ret && uV >= desc->fullbatt_uV) {
295 return true; 306 is_full = true;
307 goto out;
308 }
296 } 309 }
297 310
298 /* Full, if the capacity is more than fullbatt_soc */ 311 /* Full, if the capacity is more than fullbatt_soc */
@@ -301,11 +314,15 @@ static bool is_full_charged(struct charger_manager *cm)
301 314
302 ret = power_supply_get_property(fuel_gauge, 315 ret = power_supply_get_property(fuel_gauge,
303 POWER_SUPPLY_PROP_CAPACITY, &val); 316 POWER_SUPPLY_PROP_CAPACITY, &val);
304 if (!ret && val.intval >= desc->fullbatt_soc) 317 if (!ret && val.intval >= desc->fullbatt_soc) {
305 return true; 318 is_full = true;
319 goto out;
320 }
306 } 321 }
307 322
308 return false; 323out:
324 power_supply_put(fuel_gauge);
325 return is_full;
309} 326}
310 327
311/** 328/**
@@ -578,14 +595,18 @@ static int cm_get_battery_temperature_by_psy(struct charger_manager *cm,
578 int *temp) 595 int *temp)
579{ 596{
580 struct power_supply *fuel_gauge; 597 struct power_supply *fuel_gauge;
598 int ret;
581 599
582 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); 600 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
583 if (!fuel_gauge) 601 if (!fuel_gauge)
584 return -ENODEV; 602 return -ENODEV;
585 603
586 return power_supply_get_property(fuel_gauge, 604 ret = power_supply_get_property(fuel_gauge,
587 POWER_SUPPLY_PROP_TEMP, 605 POWER_SUPPLY_PROP_TEMP,
588 (union power_supply_propval *)temp); 606 (union power_supply_propval *)temp);
607 power_supply_put(fuel_gauge);
608
609 return ret;
589} 610}
590 611
591static int cm_get_battery_temperature(struct charger_manager *cm, 612static int cm_get_battery_temperature(struct charger_manager *cm,
@@ -866,7 +887,7 @@ static int charger_get_property(struct power_supply *psy,
866{ 887{
867 struct charger_manager *cm = power_supply_get_drvdata(psy); 888 struct charger_manager *cm = power_supply_get_drvdata(psy);
868 struct charger_desc *desc = cm->desc; 889 struct charger_desc *desc = cm->desc;
869 struct power_supply *fuel_gauge; 890 struct power_supply *fuel_gauge = NULL;
870 int ret = 0; 891 int ret = 0;
871 int uV; 892 int uV;
872 893
@@ -909,18 +930,18 @@ static int charger_get_property(struct power_supply *psy,
909 case POWER_SUPPLY_PROP_TEMP_AMBIENT: 930 case POWER_SUPPLY_PROP_TEMP_AMBIENT:
910 return cm_get_battery_temperature(cm, &val->intval); 931 return cm_get_battery_temperature(cm, &val->intval);
911 case POWER_SUPPLY_PROP_CAPACITY: 932 case POWER_SUPPLY_PROP_CAPACITY:
912 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
913 if (!fuel_gauge) {
914 ret = -ENODEV;
915 break;
916 }
917
918 if (!is_batt_present(cm)) { 933 if (!is_batt_present(cm)) {
919 /* There is no battery. Assume 100% */ 934 /* There is no battery. Assume 100% */
920 val->intval = 100; 935 val->intval = 100;
921 break; 936 break;
922 } 937 }
923 938
939 fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge);
940 if (!fuel_gauge) {
941 ret = -ENODEV;
942 break;
943 }
944
924 ret = power_supply_get_property(fuel_gauge, 945 ret = power_supply_get_property(fuel_gauge,
925 POWER_SUPPLY_PROP_CAPACITY, val); 946 POWER_SUPPLY_PROP_CAPACITY, val);
926 if (ret) 947 if (ret)
@@ -995,6 +1016,8 @@ static int charger_get_property(struct power_supply *psy,
995 default: 1016 default:
996 return -EINVAL; 1017 return -EINVAL;
997 } 1018 }
1019 if (fuel_gauge)
1020 power_supply_put(fuel_gauge);
998 return ret; 1021 return ret;
999} 1022}
1000 1023
@@ -1676,13 +1699,7 @@ static int charger_manager_probe(struct platform_device *pdev)
1676 desc->psy_charger_stat[i]); 1699 desc->psy_charger_stat[i]);
1677 return -ENODEV; 1700 return -ENODEV;
1678 } 1701 }
1679 } 1702 power_supply_put(psy);
1680
1681 fuel_gauge = power_supply_get_by_name(desc->psy_fuel_gauge);
1682 if (!fuel_gauge) {
1683 dev_err(&pdev->dev, "Cannot find power supply \"%s\"\n",
1684 desc->psy_fuel_gauge);
1685 return -ENODEV;
1686 } 1703 }
1687 1704
1688 if (desc->polling_interval_ms == 0 || 1705 if (desc->polling_interval_ms == 0 ||
@@ -1722,6 +1739,12 @@ static int charger_manager_probe(struct platform_device *pdev)
1722 cm->charger_psy_desc.num_properties = psy_default.num_properties; 1739 cm->charger_psy_desc.num_properties = psy_default.num_properties;
1723 1740
1724 /* Find which optional psy-properties are available */ 1741 /* Find which optional psy-properties are available */
1742 fuel_gauge = power_supply_get_by_name(desc->psy_fuel_gauge);
1743 if (!fuel_gauge) {
1744 dev_err(&pdev->dev, "Cannot find power supply \"%s\"\n",
1745 desc->psy_fuel_gauge);
1746 return -ENODEV;
1747 }
1725 if (!power_supply_get_property(fuel_gauge, 1748 if (!power_supply_get_property(fuel_gauge,
1726 POWER_SUPPLY_PROP_CHARGE_NOW, &val)) { 1749 POWER_SUPPLY_PROP_CHARGE_NOW, &val)) {
1727 cm->charger_psy_desc.properties[cm->charger_psy_desc.num_properties] = 1750 cm->charger_psy_desc.properties[cm->charger_psy_desc.num_properties] =
@@ -1741,6 +1764,7 @@ static int charger_manager_probe(struct platform_device *pdev)
1741 dev_err(&pdev->dev, "Failed to initialize thermal data\n"); 1764 dev_err(&pdev->dev, "Failed to initialize thermal data\n");
1742 cm->desc->measure_battery_temp = false; 1765 cm->desc->measure_battery_temp = false;
1743 } 1766 }
1767 power_supply_put(fuel_gauge);
1744 1768
1745 INIT_DELAYED_WORK(&cm->fullbatt_vchk_work, fullbatt_vchk); 1769 INIT_DELAYED_WORK(&cm->fullbatt_vchk_work, fullbatt_vchk);
1746 1770