aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/power/charger-manager.c99
-rw-r--r--include/linux/power/charger-manager.h1
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 */
97static bool is_batt_present(struct charger_manager *cm) 97static 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)
167static int get_batt_uV(struct charger_manager *cm, int *uV) 172static 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
566static 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
554static int cm_get_battery_temperature(struct charger_manager *cm, 580static 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