static void melfas_touchkey_early_resume(struct early_suspend *h) { init_hw(); enable_irq(IRQ_TOUCH_INT); if ( set_tsp_for_usb_detect_value == 1 ) { set_tsp_for_usb_detect(1); set_tsp_for_usb_detect_value = 0; } else if ( set_tsp_for_usb_release_value == 1 ) { set_tsp_for_usb_detect(0); set_tsp_for_usb_release_value = 0; } else if ( set_tsp_for_ta_detect_value == 1 ) { set_tsp_for_ta_detect(1); set_tsp_for_ta_detect_value = 0; } else if ( set_tsp_for_ta_release_value == 1 ) { set_tsp_for_ta_detect(0); set_tsp_for_ta_release_value = 0; } }
static void twl6030charger_ctrl_work_handler(struct work_struct *work) { struct charger_device_info *di = container_of(work, struct charger_device_info, twl6030charger_ctrl_work.work); int ret; int n_usbic_state; int charger_fault = 0; long int events; u8 stat_toggle, stat_reset, stat_set = 0; u8 charge_state = 0; u8 present_charge_state = 0; u8 ac_or_vbus, no_ac_and_vbus = 0; u8 hw_state = 0, temp = 0; dev_dbg(di->dev, "[TA] %s start\n",__func__); clear_charge_start_time(); /* read charger controller_stat1 */ ret = twl_i2c_read_u8(TWL6030_MODULE_CHARGER, &present_charge_state, CONTROLLER_STAT1); if (ret) return 0; twl_i2c_read_u8(TWL6030_MODULE_ID0, &hw_state, STS_HW_CONDITIONS); charge_state = di->stat1; stat_toggle = charge_state ^ present_charge_state; stat_set = stat_toggle & present_charge_state; stat_reset = stat_toggle & charge_state; no_ac_and_vbus = !((present_charge_state) & (VBUS_DET | VAC_DET)); ac_or_vbus = charge_state & (VBUS_DET | VAC_DET); if (no_ac_and_vbus && ac_or_vbus) { dev_dbg(di->dev, "[TA] No Charging source\n"); /* disable charging when no source present */ } charge_state = present_charge_state; di->stat1 = present_charge_state; if (stat_reset & VBUS_DET) { /* On a USB detach, UNMASK VBUS OVP if masked*/ twl_i2c_read_u8(TWL6030_MODULE_CHARGER, &temp, CHARGERUSB_INT_MASK); if (temp & MASK_MCHARGERUSB_FAULT) twl_i2c_write_u8(TWL6030_MODULE_CHARGER, (temp & ~MASK_MCHARGERUSB_FAULT), CHARGERUSB_INT_MASK); dev_dbg(di->dev, "[TA] Charging source removed\n"); change_cable_status(POWER_SUPPLY_TYPE_BATTERY, di); #ifdef CONFIG_DYNAMIC_TSP_SETTINGS_FOR_CHARGER_STATE set_tsp_for_ta_detect(0); #endif } if (stat_set & VBUS_DET) { /* In HOST mode (ID GROUND) when a device is connected, Mask * VBUS OVP interrupt and do no enable usb charging */ if (hw_state & STS_USB_ID) { twl_i2c_read_u8(TWL6030_MODULE_CHARGER, &temp, CHARGERUSB_INT_MASK); if (!(temp & MASK_MCHARGERUSB_FAULT)) twl_i2c_write_u8(TWL6030_MODULE_CHARGER, (temp | MASK_MCHARGERUSB_FAULT), CHARGERUSB_INT_MASK); } else { n_usbic_state = get_real_usbic_state(); dev_dbg(di->dev, "[TA] cable_detection_isr handler. usbic_state: %d\n", n_usbic_state); switch (n_usbic_state) { case MICROUSBIC_5W_CHARGER: case MICROUSBIC_TA_CHARGER: case MICROUSBIC_USB_CHARGER: case MICROUSBIC_PHONE_USB: case MICROUSBIC_USB_CABLE: case MICROUSBIC_MHL_CHARGER: case MICROUSBIC_JIG_USB_ON: if (sec_bci->charger.cable_status == POWER_SUPPLY_TYPE_USB || sec_bci->charger.cable_status == POWER_SUPPLY_TYPE_MAINS ){ dev_dbg(di->dev, "[TA] Already Plugged\n"); break; } /*Check VF */ sec_bci->battery.battery_vf_ok = check_battery_vf(); /*TA or USB or MHL is inserted */ if (n_usbic_state == MICROUSBIC_USB_CABLE) { //current : 395mA dev_dbg(di->dev,"[TA] USB CABLE PLUGGED\n"); change_cable_status(POWER_SUPPLY_TYPE_USB, di); #ifdef CONFIG_DYNAMIC_TSP_SETTINGS_FOR_CHARGER_STATE set_tsp_for_ta_detect(1); #endif } else if (n_usbic_state == MICROUSBIC_MHL_CHARGER) { //current : 395mA dev_dbg(di->dev,"[TA] MHL CABLE PLUGGED\n"); change_cable_status(POWER_SUPPLY_TYPE_USB, di); #ifdef CONFIG_DYNAMIC_TSP_SETTINGS_FOR_CHARGER_STATE set_tsp_for_ta_detect(1); #endif } else if (n_usbic_state == MICROUSBIC_JIG_USB_ON) { //current : 1000mA dev_dbg(di->dev,"[TA] JIG_USB_ON CABLE PLUGGED\n"); change_cable_status(POWER_SUPPLY_TYPE_MAINS, di); #ifdef CONFIG_DYNAMIC_TSP_SETTINGS_FOR_CHARGER_STATE set_tsp_for_ta_detect(1); #endif } else { //current : 1000mA dev_dbg(di->dev,"[TA] CHARGER CABLE PLUGGED\n"); change_cable_status(POWER_SUPPLY_TYPE_MAINS, di); #ifdef CONFIG_DYNAMIC_TSP_SETTINGS_FOR_CHARGER_STATE set_tsp_for_ta_detect(1); #endif } break; default: ; } } } if (sec_bci->charger.prev_cable_status == -1 && sec_bci->charger.cable_status == -1) { dev_dbg(di->dev,"[TA] Fisrt time after bootig.\n"); change_cable_status(POWER_SUPPLY_TYPE_BATTERY, di); #ifdef CONFIG_DYNAMIC_TSP_SETTINGS_FOR_CHARGER_STATE set_tsp_for_ta_detect(0); #endif } if (stat_set & CONTROLLER_STAT1_FAULT_WDG) { // charger_fault = 1; dev_dbg(di->dev, "Fault watchdog fired\n"); } if (stat_reset & CONTROLLER_STAT1_FAULT_WDG) dev_dbg(di->dev, "Fault watchdog recovered\n"); if (stat_set & CONTROLLER_STAT1_BAT_REMOVED) dev_dbg(di->dev, "Battery removed\n"); if (stat_reset & CONTROLLER_STAT1_BAT_REMOVED) dev_dbg(di->dev, "Battery inserted\n"); if (stat_set & CONTROLLER_STAT1_BAT_TEMP_OVRANGE) dev_dbg(di->dev, "Battery temperature overrange\n"); if (stat_reset & CONTROLLER_STAT1_BAT_TEMP_OVRANGE) dev_dbg(di->dev, "Battery temperature within range\n"); if (charger_fault) { change_charge_status(POWER_SUPPLY_STATUS_NOT_CHARGING); dev_err(di->dev, "Charger Fault stop charging\n"); } }
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; }