static void max8998_set_cable(struct max8998_charger_callbacks *ptr, enum cable_type_t status) { struct chg_data *chg = container_of(ptr, struct chg_data, callbacks); chg->cable_status = status; chg->lowbat_warning = false; if (chg->esafe == MAX8998_ESAFE_ALLOFF) chg->esafe = MAX8998_USB_VBUS_AP_ON; bat_info("%s : cable_status = %d\n", __func__, status); #ifdef __VZW_AUTH_CHECK__ /* debug info */ if ((status != CABLE_TYPE_NONE) && (chg->bat_info.batt_health == POWER_SUPPLY_HEALTH_UNSPEC_FAILURE)) { int i; printk("/BATT_ID/ rom code ="); for (i = 0; i < 8; i++) printk(" %d", vzw_rcode[i]); printk("\n"); printk("/BATT_ID/ rom code crc = %d\n", vzw_crc1); printk("/BATT_ID/ crc = %d", vzw_crc2); } #endif if (lpm_charging_mode && (max8998_check_vdcin(chg) != 1) && pm_power_off) pm_power_off(); power_supply_changed(&chg->psy_ac); power_supply_changed(&chg->psy_usb); wake_lock(&chg->work_wake_lock); queue_work(chg->monitor_wqueue, &chg->bat_work); }
static void check_lpm_charging_mode(struct chg_data *chg) { if (readl(S5P_INFORM5)) { lpm_charging_mode = 1; if (max8998_check_vdcin(chg) != 1) if (pm_power_off) pm_power_off(); } else lpm_charging_mode = 0; pr_info("%s : lpm_charging_mode(%d)\n", __func__, lpm_charging_mode); }
static int s3c_usb_get_property(struct power_supply *ps, enum power_supply_property psp, union power_supply_propval *val) { struct chg_data *chg = container_of(ps, struct chg_data, psy_usb); if (psp != POWER_SUPPLY_PROP_ONLINE) return -EINVAL; /* Set enable=1 only if the USB charger is connected */ val->intval = ((chg->cable_status == CABLE_TYPE_USB) && max8998_check_vdcin(chg)); return 0; }
static void max8998_set_cable(struct max8998_charger_callbacks *ptr, enum cable_type_t status) { struct chg_data *chg = container_of(ptr, struct chg_data, callbacks); chg->cable_status = status; if (lpm_charging_mode && (max8998_check_vdcin(chg) != 1) && pm_power_off) pm_power_off(); power_supply_changed(&chg->psy_ac); power_supply_changed(&chg->psy_usb); wake_lock(&chg->work_wake_lock); queue_work(chg->monitor_wqueue, &chg->bat_work); }
static void max8998_set_cable(struct max8998_charger_callbacks *ptr, enum cable_type_t status) { struct chg_data *chg = container_of(ptr, struct chg_data, callbacks); chg->cable_status = status; chg->lowbat_warning = false; if (chg->esafe == MAX8998_ESAFE_ALLOFF) chg->esafe = MAX8998_USB_VBUS_AP_ON; bat_info("%s : cable_status(%d) esafe(%d)\n", __func__, status, chg->esafe); if (lpm_charging_mode && (max8998_check_vdcin(chg) != 1) && pm_power_off) pm_power_off(); power_supply_changed(&chg->psy_ac); power_supply_changed(&chg->psy_usb); wake_lock(&chg->work_wake_lock); queue_work(chg->monitor_wqueue, &chg->bat_work); }
static int s3c_cable_status_update(struct chg_data *chg) { int ret; bool vdc_status; ktime_t ktime; struct timespec cur_time; /* if max8998 has detected vdcin */ if (max8998_check_vdcin(chg)) { vdc_status = 1; if (chg->bat_info.dis_reason) { pr_info("%s : battery status discharging : %d\n", __func__, chg->bat_info.dis_reason); /* have vdcin, but cannot charge */ chg->charging = false; ret = max8998_charging_control(chg); if (ret < 0) goto err; chg->bat_info.charging_status = chg->bat_info.batt_is_full ? POWER_SUPPLY_STATUS_FULL : POWER_SUPPLY_STATUS_NOT_CHARGING; chg->discharging_time = 0; chg->set_batt_full = 0; goto update; } else if (chg->discharging_time == 0) { ktime = alarm_get_elapsed_realtime(); cur_time = ktime_to_timespec(ktime); chg->discharging_time = chg->bat_info.batt_is_full || chg->set_charge_timeout ? cur_time.tv_sec + TOTAL_RECHARGING_TIME : cur_time.tv_sec + TOTAL_CHARGING_TIME; } /* able to charge */ chg->charging = true; ret = max8998_charging_control(chg); if (ret < 0) goto err; chg->bat_info.charging_status = chg->bat_info.batt_is_full ? POWER_SUPPLY_STATUS_FULL : POWER_SUPPLY_STATUS_CHARGING; } else { /* no vdc in, not able to charge */ vdc_status = 0; chg->charging = false; ret = max8998_charging_control(chg); if (ret < 0) goto err; chg->bat_info.charging_status = POWER_SUPPLY_STATUS_DISCHARGING; chg->bat_info.batt_is_full = false; chg->set_charge_timeout = false; chg->set_batt_full = 0; chg->bat_info.dis_reason = 0; chg->discharging_time = 0; if (lpm_charging_mode && pm_power_off) pm_power_off(); } update: if ((chg->cable_status == CABLE_TYPE_USB) && vdc_status) wake_lock(&chg->vbus_wake_lock); else wake_lock_timeout(&chg->vbus_wake_lock, HZ / 2); return 0; err: return ret; }
static int s3c_cable_status_update(struct chg_data *chg) { int ret; bool vdc_status; ktime_t ktime; struct timespec cur_time; static bool prev_vdc_status = 0; /* if max8998 has detected vdcin */ if (max8998_check_vdcin(chg) == 1) { vdc_status = 1; if (chg->bat_info.dis_reason) { /* have vdcin, but cannot charge */ chg->charging = 0; ret = max8998_charging_control(chg); if (ret < 0) goto err; if (chg->bat_info.dis_reason & (DISCONNECT_TEMP_OVERHEAT | DISCONNECT_TEMP_FREEZE)) chg->set_batt_full = false; chg->bat_info.charging_status = chg->set_batt_full ? POWER_SUPPLY_STATUS_FULL : POWER_SUPPLY_STATUS_NOT_CHARGING; chg->discharging_time = 0; chg->bat_info.batt_is_full = false; goto update; } else if (chg->discharging_time == 0) { ktime = alarm_get_elapsed_realtime(); cur_time = ktime_to_timespec(ktime); chg->discharging_time = (chg->set_batt_full || chg->set_charge_timeout) ? cur_time.tv_sec + TOTAL_RECHARGING_TIME : cur_time.tv_sec + TOTAL_CHARGING_TIME; } /* able to charge */ chg->charging = 1; ret = max8998_charging_control(chg); if (ret < 0) goto err; chg->bat_info.charging_status = chg->set_batt_full ? POWER_SUPPLY_STATUS_FULL : POWER_SUPPLY_STATUS_CHARGING; } else { vdc_status = 0; /* no vdc in, not able to charge */ chg->charging = 0; ret = max8998_charging_control(chg); if (ret < 0) goto err; chg->bat_info.charging_status = POWER_SUPPLY_STATUS_DISCHARGING; chg->bat_info.batt_is_full = false; chg->set_charge_timeout = false; chg->set_batt_full = false; chg->bat_info.dis_reason = 0; chg->discharging_time = 0; if (lpm_charging_mode && pm_power_off) pm_power_off(); } update: if (vdc_status) wake_lock(&chg->vbus_wake_lock); else wake_lock_timeout(&chg->vbus_wake_lock, HZ / 5); if (vdc_status != prev_vdc_status) { set_tsp_for_ta_detect(vdc_status); prev_vdc_status = vdc_status; } return 0; err: return ret; }
static bool max8998_get_vdcin(struct max8998_charger_callbacks *ptr) { struct chg_data *chg = container_of(ptr, struct chg_data, callbacks); return (max8998_check_vdcin(chg) == 1); }