diff options
| -rw-r--r-- | drivers/power/charger-manager.c | 99 | ||||
| -rw-r--r-- | include/linux/power/charger-manager.h | 1 |
2 files changed, 71 insertions, 29 deletions
diff --git a/drivers/power/charger-manager.c b/drivers/power/charger-manager.c index 7a1177ea238d..7ae8cb70204a 100644 --- a/drivers/power/charger-manager.c +++ b/drivers/power/charger-manager.c | |||
| @@ -97,6 +97,7 @@ static struct charger_global_desc *g_desc; /* init with setup_charger_manager */ | |||
| 97 | static bool is_batt_present(struct charger_manager *cm) | 97 | static bool is_batt_present(struct charger_manager *cm) |
| 98 | { | 98 | { |
| 99 | union power_supply_propval val; | 99 | union power_supply_propval val; |
| 100 | struct power_supply *psy; | ||
| 100 | bool present = false; | 101 | bool present = false; |
| 101 | int i, ret; | 102 | int i, ret; |
| 102 | 103 | ||
| @@ -107,7 +108,11 @@ static bool is_batt_present(struct charger_manager *cm) | |||
| 107 | case CM_NO_BATTERY: | 108 | case CM_NO_BATTERY: |
| 108 | break; | 109 | break; |
| 109 | case CM_FUEL_GAUGE: | 110 | case CM_FUEL_GAUGE: |
| 110 | ret = cm->fuel_gauge->get_property(cm->fuel_gauge, | 111 | psy = power_supply_get_by_name(cm->desc->psy_fuel_gauge); |
| 112 | if (!psy) | ||
| 113 | break; | ||
| 114 | |||
| 115 | ret = psy->get_property(psy, | ||
| 111 | POWER_SUPPLY_PROP_PRESENT, &val); | 116 | POWER_SUPPLY_PROP_PRESENT, &val); |
| 112 | if (ret == 0 && val.intval) | 117 | if (ret == 0 && val.intval) |
| 113 | present = true; | 118 | present = true; |
| @@ -167,12 +172,14 @@ static bool is_ext_pwr_online(struct charger_manager *cm) | |||
| 167 | static int get_batt_uV(struct charger_manager *cm, int *uV) | 172 | static int get_batt_uV(struct charger_manager *cm, int *uV) |
| 168 | { | 173 | { |
| 169 | union power_supply_propval val; | 174 | union power_supply_propval val; |
| 175 | struct power_supply *fuel_gauge; | ||
| 170 | int ret; | 176 | int ret; |
| 171 | 177 | ||
| 172 | if (!cm->fuel_gauge) | 178 | fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); |
| 179 | if (!fuel_gauge) | ||
| 173 | return -ENODEV; | 180 | return -ENODEV; |
| 174 | 181 | ||
| 175 | ret = cm->fuel_gauge->get_property(cm->fuel_gauge, | 182 | ret = fuel_gauge->get_property(fuel_gauge, |
| 176 | POWER_SUPPLY_PROP_VOLTAGE_NOW, &val); | 183 | POWER_SUPPLY_PROP_VOLTAGE_NOW, &val); |
| 177 | if (ret) | 184 | if (ret) |
| 178 | return ret; | 185 | return ret; |
| @@ -248,6 +255,7 @@ static bool is_full_charged(struct charger_manager *cm) | |||
| 248 | { | 255 | { |
| 249 | struct charger_desc *desc = cm->desc; | 256 | struct charger_desc *desc = cm->desc; |
| 250 | union power_supply_propval val; | 257 | union power_supply_propval val; |
| 258 | struct power_supply *fuel_gauge; | ||
| 251 | int ret = 0; | 259 | int ret = 0; |
| 252 | int uV; | 260 | int uV; |
| 253 | 261 | ||
| @@ -255,11 +263,15 @@ static bool is_full_charged(struct charger_manager *cm) | |||
| 255 | if (!is_batt_present(cm)) | 263 | if (!is_batt_present(cm)) |
| 256 | return false; | 264 | return false; |
| 257 | 265 | ||
| 258 | if (cm->fuel_gauge && desc->fullbatt_full_capacity > 0) { | 266 | fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); |
| 267 | if (!fuel_gauge) | ||
| 268 | return false; | ||
| 269 | |||
| 270 | if (desc->fullbatt_full_capacity > 0) { | ||
| 259 | val.intval = 0; | 271 | val.intval = 0; |
| 260 | 272 | ||
| 261 | /* Not full if capacity of fuel gauge isn't full */ | 273 | /* Not full if capacity of fuel gauge isn't full */ |
| 262 | ret = cm->fuel_gauge->get_property(cm->fuel_gauge, | 274 | ret = fuel_gauge->get_property(fuel_gauge, |
| 263 | POWER_SUPPLY_PROP_CHARGE_FULL, &val); | 275 | POWER_SUPPLY_PROP_CHARGE_FULL, &val); |
| 264 | if (!ret && val.intval > desc->fullbatt_full_capacity) | 276 | if (!ret && val.intval > desc->fullbatt_full_capacity) |
| 265 | return true; | 277 | return true; |
| @@ -273,10 +285,10 @@ static bool is_full_charged(struct charger_manager *cm) | |||
| 273 | } | 285 | } |
| 274 | 286 | ||
| 275 | /* Full, if the capacity is more than fullbatt_soc */ | 287 | /* Full, if the capacity is more than fullbatt_soc */ |
| 276 | if (cm->fuel_gauge && desc->fullbatt_soc > 0) { | 288 | if (desc->fullbatt_soc > 0) { |
| 277 | val.intval = 0; | 289 | val.intval = 0; |
| 278 | 290 | ||
| 279 | ret = cm->fuel_gauge->get_property(cm->fuel_gauge, | 291 | ret = fuel_gauge->get_property(fuel_gauge, |
| 280 | POWER_SUPPLY_PROP_CAPACITY, &val); | 292 | POWER_SUPPLY_PROP_CAPACITY, &val); |
| 281 | if (!ret && val.intval >= desc->fullbatt_soc) | 293 | if (!ret && val.intval >= desc->fullbatt_soc) |
| 282 | return true; | 294 | return true; |
| @@ -551,6 +563,20 @@ static int check_charging_duration(struct charger_manager *cm) | |||
| 551 | return ret; | 563 | return ret; |
| 552 | } | 564 | } |
| 553 | 565 | ||
| 566 | static int cm_get_battery_temperature_by_psy(struct charger_manager *cm, | ||
| 567 | int *temp) | ||
| 568 | { | ||
| 569 | struct power_supply *fuel_gauge; | ||
| 570 | |||
| 571 | fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); | ||
| 572 | if (!fuel_gauge) | ||
| 573 | return -ENODEV; | ||
| 574 | |||
| 575 | return fuel_gauge->get_property(fuel_gauge, | ||
| 576 | POWER_SUPPLY_PROP_TEMP, | ||
| 577 | (union power_supply_propval *)temp); | ||
| 578 | } | ||
| 579 | |||
| 554 | static int cm_get_battery_temperature(struct charger_manager *cm, | 580 | static int cm_get_battery_temperature(struct charger_manager *cm, |
| 555 | int *temp) | 581 | int *temp) |
| 556 | { | 582 | { |
| @@ -560,15 +586,18 @@ static int cm_get_battery_temperature(struct charger_manager *cm, | |||
| 560 | return -ENODEV; | 586 | return -ENODEV; |
| 561 | 587 | ||
| 562 | #ifdef CONFIG_THERMAL | 588 | #ifdef CONFIG_THERMAL |
| 563 | ret = thermal_zone_get_temp(cm->tzd_batt, (unsigned long *)temp); | 589 | if (cm->tzd_batt) { |
| 564 | if (!ret) | 590 | ret = thermal_zone_get_temp(cm->tzd_batt, (unsigned long *)temp); |
| 565 | /* Calibrate temperature unit */ | 591 | if (!ret) |
| 566 | *temp /= 100; | 592 | /* Calibrate temperature unit */ |
| 567 | #else | 593 | *temp /= 100; |
| 568 | ret = cm->fuel_gauge->get_property(cm->fuel_gauge, | 594 | } else |
| 569 | POWER_SUPPLY_PROP_TEMP, | ||
| 570 | (union power_supply_propval *)temp); | ||
| 571 | #endif | 595 | #endif |
| 596 | { | ||
| 597 | /* if-else continued from CONFIG_THERMAL */ | ||
| 598 | ret = cm_get_battery_temperature_by_psy(cm, temp); | ||
| 599 | } | ||
| 600 | |||
| 572 | return ret; | 601 | return ret; |
| 573 | } | 602 | } |
| 574 | 603 | ||
| @@ -827,6 +856,7 @@ static int charger_get_property(struct power_supply *psy, | |||
| 827 | struct charger_manager *cm = container_of(psy, | 856 | struct charger_manager *cm = container_of(psy, |
| 828 | struct charger_manager, charger_psy); | 857 | struct charger_manager, charger_psy); |
| 829 | struct charger_desc *desc = cm->desc; | 858 | struct charger_desc *desc = cm->desc; |
| 859 | struct power_supply *fuel_gauge; | ||
| 830 | int ret = 0; | 860 | int ret = 0; |
| 831 | int uV; | 861 | int uV; |
| 832 | 862 | ||
| @@ -857,14 +887,20 @@ static int charger_get_property(struct power_supply *psy, | |||
| 857 | ret = get_batt_uV(cm, &val->intval); | 887 | ret = get_batt_uV(cm, &val->intval); |
| 858 | break; | 888 | break; |
| 859 | case POWER_SUPPLY_PROP_CURRENT_NOW: | 889 | case POWER_SUPPLY_PROP_CURRENT_NOW: |
| 860 | ret = cm->fuel_gauge->get_property(cm->fuel_gauge, | 890 | fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); |
| 891 | if (!fuel_gauge) { | ||
| 892 | ret = -ENODEV; | ||
| 893 | break; | ||
| 894 | } | ||
| 895 | ret = fuel_gauge->get_property(fuel_gauge, | ||
| 861 | POWER_SUPPLY_PROP_CURRENT_NOW, val); | 896 | POWER_SUPPLY_PROP_CURRENT_NOW, val); |
| 862 | break; | 897 | break; |
| 863 | case POWER_SUPPLY_PROP_TEMP: | 898 | case POWER_SUPPLY_PROP_TEMP: |
| 864 | case POWER_SUPPLY_PROP_TEMP_AMBIENT: | 899 | case POWER_SUPPLY_PROP_TEMP_AMBIENT: |
| 865 | return cm_get_battery_temperature(cm, &val->intval); | 900 | return cm_get_battery_temperature(cm, &val->intval); |
| 866 | case POWER_SUPPLY_PROP_CAPACITY: | 901 | case POWER_SUPPLY_PROP_CAPACITY: |
| 867 | if (!cm->fuel_gauge) { | 902 | fuel_gauge = power_supply_get_by_name(cm->desc->psy_fuel_gauge); |
| 903 | if (!fuel_gauge) { | ||
| 868 | ret = -ENODEV; | 904 | ret = -ENODEV; |
| 869 | break; | 905 | break; |
| 870 | } | 906 | } |
| @@ -875,7 +911,7 @@ static int charger_get_property(struct power_supply *psy, | |||
| 875 | break; | 911 | break; |
| 876 | } | 912 | } |
| 877 | 913 | ||
| 878 | |||
