diff options
author | Krzysztof Kozlowski <k.kozlowski@samsung.com> | 2015-03-12 03:44:14 -0400 |
---|---|---|
committer | Sebastian Reichel <sre@kernel.org> | 2015-03-13 18:15:52 -0400 |
commit | b43eb35abfdeb4a999f8214ae25f2556227eb030 (patch) | |
tree | fe26a6172865b367fe6c2bbda0cff1abb45f7f32 /drivers/power/charger-manager.c | |
parent | 03e81acce5568c7105dc5bef6984c8b0edfe8d45 (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.c | 70 |
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; | 323 | out: |
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 | ||
591 | static int cm_get_battery_temperature(struct charger_manager *cm, | 612 | static 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 | ||