SEC_BATTERY_ATTR(test_charge_current),
SEC_BATTERY_ATTR(set_stability_test),
#endif
+ SEC_BATTERY_ATTR(disable_charge),
};
static enum power_supply_property sec_battery_props[] = {
struct timespec ts;
ktime_t current_time;
+ if (battery->disable_charge && enable) {
+ dev_warn(battery->dev, "charging is disabled explicitly.\n");
+ return 0;
+ }
+
val.intval = battery->status;
psy_do_property(battery->pdata->charger_name, set,
POWER_SUPPLY_PROP_STATUS, val);
if (battery->health == POWER_SUPPLY_HEALTH_UNSPEC_FAILURE) {
battery->health = POWER_SUPPLY_HEALTH_GOOD;
- if (battery->status == POWER_SUPPLY_STATUS_NOT_CHARGING) {
+ if (battery->disable_charge) {
+ ;
+ } else if (battery->status == POWER_SUPPLY_STATUS_NOT_CHARGING) {
battery->status = POWER_SUPPLY_STATUS_CHARGING;
-
sec_bat_set_charge(battery, true);
}
}
case POWER_SUPPLY_HEALTH_GOOD:
dev_info(battery->dev, "%s: Safe voltage\n", __func__);
dev_info(battery->dev, "%s: is_recharging : %d\n", __func__, battery->is_recharging);
- if (battery->is_recharging)
- battery->status =
- POWER_SUPPLY_STATUS_FULL;
- else /* Normal Charging */
- battery->status =
- POWER_SUPPLY_STATUS_CHARGING;
+ if (battery->disable_charge) {
+ ;
+ } else {
+ if (battery->is_recharging)
+ battery->status =
+ POWER_SUPPLY_STATUS_FULL;
+ else /* Normal Charging */
+ battery->status =
+ POWER_SUPPLY_STATUS_CHARGING;
+ }
break;
case POWER_SUPPLY_HEALTH_OVERVOLTAGE:
case POWER_SUPPLY_HEALTH_UNDERVOLTAGE:
dev_info(battery->dev,
"%s: Safe Temperature\n", __func__);
/* if recovered from not charging */
- if ((battery->health == POWER_SUPPLY_HEALTH_GOOD) &&
- (battery->status ==
- POWER_SUPPLY_STATUS_NOT_CHARGING)) {
+ if (battery->disable_charge) {
+ ;
+ } else if ((battery->health == POWER_SUPPLY_HEALTH_GOOD) &&
+ (battery->status == POWER_SUPPLY_STATUS_NOT_CHARGING)) {
if (battery->is_recharging)
battery->status =
POWER_SUPPLY_STATUS_FULL;
goto end_of_cable_work;
} else {
/* Do NOT display the charging icon when OTG is enabled */
- if (battery->cable_type == POWER_SUPPLY_TYPE_OTG) {
+ if (battery->disable_charge) {
+ ;
+ } else if (battery->cable_type == POWER_SUPPLY_TYPE_OTG) {
battery->charging_mode = SEC_BATTERY_CHARGING_NONE;
battery->status = POWER_SUPPLY_STATUS_DISCHARGING;
} else {
battery->stability_test);
break;
#endif
+ case BATT_DISABLE_CHARGE:
+ i += scnprintf(buf + i, PAGE_SIZE - i, "%d\n",
+ battery->disable_charge);
+ break;
default:
i = -EINVAL;
}
}
break;
#endif
+ case BATT_DISABLE_CHARGE:
+ sscanf(buf, "%d\n", &x);
+ if (!!x) {
+ /* force disabling battery charge */
+ battery->disable_charge = 1;
+ battery->status = POWER_SUPPLY_STATUS_DISCHARGING;
+ sec_bat_set_charge(battery, false);
+ power_supply_changed(&battery->psy_bat);
+ } else {
+ union power_supply_propval value;
+
+ battery->disable_charge = 0;
+ sec_bat_get_cable_type(battery,
+ battery->pdata->cable_source_type);
+
+ /* set charging on if the proper charger is connected */
+ if (battery->cable_type != POWER_SUPPLY_TYPE_BATTERY &&
+ battery->cable_type != POWER_SUPPLY_TYPE_OTG) {
+ sec_bat_set_charge(battery, true);
+ psy_do_property(battery->pdata->charger_name, get,
+ POWER_SUPPLY_PROP_STATUS, value);
+ battery->status = value.intval;
+ power_supply_changed(&battery->psy_bat);
+ }
+ }
+ ret = count;
+ break;
default:
ret = -EINVAL;
}