int max14526_muic_init(TYPE_RESET reset) { int ret; /* clear default switch position */ // COMP2 to H-Z /COMN1 to H-Z (0x03=0x24) ret= MUIC_Reg_Write(&s_hMuicHandle, SW_CTRL_REG, COMP2_TO_HZ|COMN1_TO_HZ); // Enable 200K, ADC (0x01=0x12) ret= MUIC_Reg_Write(&s_hMuicHandle, CTRL1_REG, ID_200_M|ADC_EN_M); // Enable Interrupts (0x02 = 0x40) ret= MUIC_Reg_Write(&s_hMuicHandle, CTRL2_REG, INT_EN_M); DP3T_Switch_ctrl(DP3T_NC); USIF_ctrl(USIF_IPC); //20100526, [email protected], Charging IC Reset [START] #if defined(CONFIG_STAR_BATTERY_CHARGER) if ( !reset ) { lprintk(D_MUIC, "%s: charging_ic_deactive call \n", __func__ ); charging_ic_deactive(); } #endif /* CONFIG_STAR_BATTERY_CHARGER */ //20100526, [email protected], Charging IC Reset [END] wake_unlock(&s_hMuicHandle.wlock); current_device = DEVICE_NONE; return ret; }
// TA connection, ISET mode void charging_ic_set_ta_mode(void) { if(charging_ic_status == POWER_SUPPLY_TYPE_MAINS) { printk("[charger_rt9536] :: it's already %s mode!! : \n", __func__); return; } if(charging_ic_status != POWER_SUPPLY_TYPE_BATTERY) { charging_ic_deactive(); } mutex_lock(&charging_lock); mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO); udelay(400); mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE); udelay(400); // about 400 us mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO); udelay(1500); charging_ic_status = POWER_SUPPLY_TYPE_MAINS; mutex_unlock(&charging_lock); printk("[charger_rt9536] :: %s : \n", __func__); }
static ssize_t fuel_cal_show(struct device *dev, struct device_attribute *attr, char *buf) { #if 0 int val, gauge_diff; static int gauge_cal_check = 1; TYPE_MUIC_MODE muic_mode = MUIC_NONE; muic_mode = get_muic_mode(); gauge_diff = refer_di->battery_capacity -(refer_di->voltage_uV-3300) *100 /900; if (((gauge_diff > 30) || (gauge_diff < -40)) && (muic_mode != MUIC_NONE)) { printk("[BATTERY] error in gauge IC value, difference value is %d \n",gauge_diff); gauge_cal_check = 0; } printk("[BATTERY] success to access fuel_cal_show \n"); if (gauge_cal_check == 0) { val = 1; printk("[BATTERY] Gauge Calibration started in fuel_cal_show\n"); if (refer_di->battery_present == 1) charging_ic_deactive(); //refer_di->gauge_error = 1; gauge_cal_check = 1; } else { //refer_di->gauge_error = 0; val = 0; } #endif return sprintf(buf, "0\n"); }
// USB500 mode charging void charging_ic_active_default(void) { u32 wait; if(charging_ic_status == POWER_SUPPLY_TYPE_USB) { battery_log(BAT_LOG_CRTI, "[charger_rt9536] :: it's already %s mode!!\n", __func__); return; } if(charging_ic_status != POWER_SUPPLY_TYPE_BATTERY) { charging_ic_deactive(); } mutex_lock(&charging_lock); // USB500 mode #if (1) charging_ic_set_chargingmode(CHR_USB_500_MODE); #else mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO); udelay(1500); #endif /* 1 */ charging_ic_status = POWER_SUPPLY_TYPE_USB; mutex_unlock(&charging_lock); battery_log(BAT_LOG_CRTI, "[charger_rt9536] :: %s :\n", __func__); }
// USB500 mode charging void charging_ic_active_default(void) { if(charging_ic_status == POWER_SUPPLY_TYPE_USB) { printk("[charger_rt9536] :: it's already %s mode!!\n", __func__); return; } if(charging_ic_status != POWER_SUPPLY_TYPE_BATTERY) { charging_ic_deactive(); } mutex_lock(&charging_lock); // USB500 mode mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO); udelay(1500); charging_ic_status = POWER_SUPPLY_TYPE_USB; mutex_unlock(&charging_lock); printk("[charger_rt9536] :: %s : \n", __func__); }
static int check_battery_changed(struct twl4030_bci_device_info *di) { static int battery_calibration_enabled = 0; int need_recalibration = 0; int upper_limit, lower_limit; if(battery_calibration_enabled) { // Voltage Calibration Complete start_monitor = 0; set_end_of_charge(0); set_charging_timer(0); di->charge_status = POWER_SUPPLY_STATUS_CHARGING; battery_calibration_enabled = 0; printk(KERN_INFO "[BATTERY] ReCalibration Done!\n"); return 2; } if(di->charge_rsoc == POWER_SUPPLY_TYPE_BATTERY) return 0; if(di->battery_present == 0) // Cannot do anything without battery return 0; if((di->temp_C < 0 || di->temp_C > 60) && di->temp_control != UNLIMITED_TEMP_VAL){ // 20120725, [email protected], Enable charging by fake mode. // Ignore when low or high temperature return 0; } // Set Voltage Limit // TODO : 300 and -250 is tuning value. must be verified. upper_limit = 300; lower_limit = -250; // Check battery changed while phone turned on if(di->battery_present == 1 && di->previous_battery_present == 0) { // Battery Inserted need_recalibration = 1; } else { int voltage_diff; voltage_diff = di->voltage_uV - di->previous_voltage_uV; if(voltage_diff > upper_limit) { // too much voltage increase if(di->previous_charge_rsoc != POWER_SUPPLY_TYPE_BATTERY) { need_recalibration = 1; } } else if(voltage_diff < lower_limit) { // too much voltage drop need_recalibration = 1; } } if(need_recalibration) { charging_ic_deactive(); battery_calibration_enabled = 1; di->charge_status = POWER_SUPPLY_STATUS_UNKNOWN; printk(KERN_INFO "[BATTERY] Need To Calibration!\n"); printk(KERN_INFO "[BATTERY] %dmV -> %dmV\n", di->previous_voltage_uV, di->voltage_uV); mdelay(50); // wait for voltage drop - charging ic deactived. max17043_do_calibrate(); // Fuel Gauge Recalibration takes 1~3 sec. } return need_recalibration; }
// TA connection, ISET mode void charging_ic_set_ta_mode() { u32 wait; if(charging_ic_status == POWER_SUPPLY_TYPE_MAINS) { xlog_printk(ANDROID_LOG_INFO, "Power/Charger", "[charger_rt9536] :: it's already %s mode!! : \n", __func__); return; } if(charging_ic_status != POWER_SUPPLY_TYPE_BATTERY) { charging_ic_deactive(); } /* */ #ifdef SINGLE_CHARGER_CONTOL_USING_GPT_TIMER mutex_lock(&charging_lock); wait = 0; while (wait < 10) { if (Set_Charging_Commmand(CHARGING_SET_TA_MODE_COMMAND) == KAL_TRUE) { break; } wait++; mdelay(10); } charging_ic_status = POWER_SUPPLY_TYPE_MAINS; mutex_unlock(&charging_lock); #else mutex_lock(&charging_lock); // #if defined(SINGLE_CHARGER_CONTROL_USING_SPIN_LOCK) charging_ic_set_chargingmode(CHR_ISET_MODE); #else mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO); udelay(400); mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE); udelay(400); // about 400 us mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO); udelay(1800); /* */ high_volt_setting(); /* */ #endif // charging_ic_status = POWER_SUPPLY_TYPE_MAINS; mutex_unlock(&charging_lock); #endif /* */ xlog_printk(ANDROID_LOG_INFO, "Power/Charger", "[charger_rt9536] :: %s : \n", __func__); }
static int charging_ic_remove(struct platform_device *dev) { charging_ic_deactive(); free_irq(CHG_STATUS_N_OMAP, NULL); gpio_free(CHG_EN_SET_N_OMAP); gpio_free(CHG_STATUS_N_OMAP); return 0; }
ssize_t charging_ic_store_status(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { if(buf[0] == '0') { charging_ic_deactive(); } else if(buf[0] == '1') { charging_ic_set_ta_mode(); } return count; }
void charging_ic_set_factory_mode(void) { u32 wait; #if 0 if(charging_ic_status == POWER_SUPPLY_TYPE_FACTORY) { battery_log(BAT_LOG_CRTI, "[charger_rt9536] :: it's already %s mode!! :\n", __func__); return; } #endif /* 0 */ battery_log(BAT_LOG_CRTI, "[charger_rt9536] :: charging_ic_set_factory_mode\n"); if(charging_ic_status != POWER_SUPPLY_TYPE_BATTERY) { charging_ic_deactive(); } mutex_lock(&charging_lock); #if (1) charging_ic_set_chargingmode(CHR_PTM_MODE); #else mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO); udelay(400); mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE); udelay(400); mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO); udelay(400); mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE); udelay(400); mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO); udelay(400); mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE); udelay(400); mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO); udelay(1500); #endif /* 0 */ #if 0 charging_ic_status = POWER_SUPPLY_TYPE_FACTORY; #endif /* 0 */ mutex_unlock(&charging_lock); battery_log(BAT_LOG_CRTI, "[charger_rt9536] :: %s :\n", __func__); }
void rt9536_charging_enable(unsigned int set_current, unsigned int enable) { if (enable) { if ( set_current == AC_CHARGER_CURRENT ) charging_ic_set_ta_mode(); else if ( set_current == USB_CHARGER_CURRENT ) charging_ic_set_usb_mode(); else charging_ic_active_default(); printk("[charger_rt9536] :: %s, current(%d), enable(%d)\n", __func__, set_current, enable); } else { charging_ic_deactive(); printk("[charger_rt9536] :: %s, enable(%d)\n", __func__, enable); } }
void charging_ic_set_factory_mode(void) { #if 0 if(charging_ic_status == POWER_SUPPLY_TYPE_FACTORY) { printk("Power/Charger", "[charger_rt9536] :: it's already %s mode!! : \n", __func__); return; } #endif /* 0 */ if(charging_ic_status != POWER_SUPPLY_TYPE_BATTERY) { charging_ic_deactive(); } mutex_lock(&charging_lock); mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO); udelay(400); mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE); udelay(400); mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO); udelay(400); mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE); udelay(400); mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO); udelay(400); mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE); udelay(400); mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO); udelay(1500); #if 0 charging_ic_status = POWER_SUPPLY_TYPE_FACTORY; #endif /* 0 */ mutex_unlock(&charging_lock); printk("[charger_rt9536] :: %s : \n", __func__); }
void muic_initialize_max(TYPE_RESET reset) { #if defined(CONFIG_MACH_STAR_REV_D) || defined(CONFIG_MACH_STAR_REV_E) || defined(CONFIG_MACH_STAR_REV_F) NvOdmGpioSetState(s_hMuicHandle.hGpio, s_hMuicHandle.h_USB_VBUS_EN, DISABLE); #endif // Enable 200K, ADC (0x01=0x12) Set_MAX14526_ADDR(CTRL1_REG, ID_200_M| ADC_EN_M); // Enable Interrupts (0x02 = 0x40) Set_MAX14526_ADDR(CTRL2_REG, INT_EN_M); //20100526, [email protected], Charging IC Reset [START] #if defined(CONFIG_STAR_BATTERY_CHARGER) if ( !reset ) { lprintk(D_MUIC, "%s: charging_ic_deactive call \n", __func__ ); charging_ic_deactive(); } #endif /* CONFIG_STAR_BATTERY_CHARGER */ //20100526, [email protected], Charging IC Reset [END] wake_unlock(&s_hMuicHandle.wlock); }
// TA connection, ISET mode void charging_ic_set_ta_mode(void) { u32 wait; battery_log(BAT_LOG_CRTI, "[charger_rt9536] :: charging_ic_set_ta_mode\n"); if(charging_ic_status == POWER_SUPPLY_TYPE_MAINS) { battery_log(BAT_LOG_CRTI, "[charger_rt9536] :: it's already %s mode!! :\n", __func__); return; } if(charging_ic_status != POWER_SUPPLY_TYPE_BATTERY) { charging_ic_deactive(); } mutex_lock(&charging_lock); #if (1) charging_ic_set_chargingmode(CHR_ISET_MODE); #else mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO); udelay(400); mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE); udelay(400); // about 400 us mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO); udelay(1500); #endif /* 1 */ charging_ic_status = POWER_SUPPLY_TYPE_MAINS; mutex_unlock(&charging_lock); battery_log(BAT_LOG_CRTI, "[charger_rt9536] :: %s :\n", __func__); }
s32 muic_device_detection(s32 upon_irq) { /* LGE_CHANGE_START 2011-03-16 [email protected] patch for Adb offline set and Mass Storage Driver detecting fail */ /* 20110113 [email protected] check muic driver init. state [START] */ if(!muic_init_done){ printk(KERN_WARNING "[MUIC] MUIC has not been initialized! Nothing will be done!!!.\n"); return 0; } /* 20110113 [email protected] check muic driver init. state [END] */ /* LGE_CHANGE_END 2011-03-16 [email protected] */ // Read INT_STAT_REG (0x04) muic_i2c_read_byte(INT_STAT, &int_stat_val); printk(KERN_INFO "[MUIC] INT_STAT = %x\n", int_stat_val); switch (muic_mode) { case MUIC_NONE: case MUIC_UNKNOWN: muic_device_none_detect(); break; // CP UART Mode case MUIC_CP_UART: case MUIC_AP_UART: if ((int_stat_val & MIDNO) == 0x0b) { muic_mode = MUIC_NONE; } else { muic_device_none_detect(); } break; // TA Mode case MUIC_NA_TA: case MUIC_LG_TA: case MUIC_HCHH: case MUIC_INVALID_CHG: if ((int_stat_val & MVBUS) == 0) { // Exit Charger Mode muic_mode = MUIC_NONE; } else { // Bug fix: charger detect interrupt 2 times set_wakelock(0); } break; // USB Mode case MUIC_AP_USB: case MUIC_CP_USB: if ((int_stat_val & MVBUS) == 0){ // Exit USB Mode muic_mode = MUIC_NONE; } else { muic_device_none_detect(); } break; default: muic_mode = MUIC_NONE; break; } if (muic_mode == MUIC_NONE) { muic_initialize(DEFAULT); printk(KERN_INFO "[MUIC] muic none\n"); charging_ic_deactive(); printk(KERN_INFO "[MUIC] charging_ic_deactive()\n"); } charger_state_update_by_other(); return 0; }
/* LGE_UPDATE_S [[email protected]] 2010-12-01, modify detection scheme */ static void muic_device_none_detect(void) { u8 reg_value; u8 status_value; s32 ret; if ((key_col == 3) && (key_row == 0)) // Volume up key_was_pressed = 1; else if ((key_col == 3) && (key_row == 1)) // Volume down key_was_pressed = 2; printk(KERN_WARNING "[MUIC] Device_None_Detect int_stat_val = 0x%x\n",int_stat_val); /* LGE_CHANGE_S [[email protected]] 2010-12-14, CP retain mode */ #ifdef CP_RETAIN if (is_cp_retained) { //muic_CP_USB_set(); muic_set_mode(MUIC_CP_USB); } // IDNO=0100? 130Kohm :: CP UART MODE else if(((int_stat_val & MIDNO) == 0x04) || (hidden_menu_switching == 7)) { /* LGE_CHANGE_E [[email protected]] 2011-01-06, CP retain mode */ #elif defined(USB_RETAIN) /* 2012.05.15, [email protected], USB retain mode. */ ret = muic_i2c_read_byte_local(INT_STAT, &status_value); if(ret < 0) printk("[MUIC] [%s-%d] muic_i2c_read_byte_local Fail [ret = %d]\n", __func__, __LINE__, ret); else printk("[MUIC] [%s-%d] INT_STAT Value is 0x%x / MVBUS bit is %d\n", __func__, __LINE__, status_value, ((status_value & MVBUS) >> 4)); if (usb_retained == CP_RETAINED) { //muic_CP_USB_set(); if((status_value & MVBUS)) { printk("[MUIC] [%s-%d] muic_set_mode(MUIC_CP_USB)\n", __func__, __LINE__); muic_set_mode(MUIC_CP_USB); } } else if (usb_retained == AP_RETAINED) { //muic_AP_USB_set(); if((status_value & MVBUS)) { printk("[MUIC] [%s-%d] muic_set_mode(MUIC_AP_USB)\n", __func__, __LINE__); muic_set_mode(MUIC_AP_USB); } } // IDNO=0100? 130Kohm :: CP UART MODE else if(((int_stat_val & MIDNO) == 0x04) || (hidden_menu_switching == 7)) { #else if(((int_stat_val & MIDNO) == 0x04) || (hidden_menu_switching == 7)) { #endif //muic_CP_UART_set(); muic_set_mode(MUIC_CP_UART); // [email protected] } // IDNO=0010? 56Kohm :: CP USB MODE else if (((int_stat_val & MIDNO ) == 0x02) || (hidden_menu_switching == 9)){ if (key_was_pressed == 2) //muic_AP_UART_set(); muic_set_mode(MUIC_AP_UART); // [email protected] else //muic_CP_USB_set(); muic_set_mode(MUIC_CP_USB); // [email protected] } // LGE_UPDATE_S [[email protected]] 2010-12-12, for 910K factory download // IDNO=1010? 910Kohm :: CP USB MODE #ifdef CABLE_DETECT_910K else if ((int_stat_val & MIDNO ) == 0x0a) { //muic_CP_USB_set(); muic_set_mode(MUIC_CP_USB); // [email protected] } else if ((int_stat_val & MIDNO ) == 0x09) { //muic_CP_USB_set(); muic_set_mode(MUIC_CP_USB); // [email protected] } #endif #if 0 // CHGDET=1? :: HIGH CURRENT USB or TA? else if (int_stat_val & MCHGDET) { muic_distinguish_charger(); } #endif // VBUS=1? :: TA or AP USB? else if (int_stat_val & MVBUS) { if (muic_device == MAX14526) { // COMP2 to H-Z / COMN1 to C1COMP (0x03=0x23) muic_i2c_write_byte_local(SW_CONTROL, 0x23); msleep(3); // Read STATUS_REG (0x05) muic_i2c_read_byte_local(STATUS, ®_value); if (reg_value & 0x01 ) { // Dedicated Charger(TA) Detected // COMP2 to H-Z / COMN1 to H-Z (0x03=0x24) muic_i2c_write_byte_local(SW_CONTROL, DP_OPEN | DM_OPEN); charging_ic_set_ta_mode(); muic_mode = MUIC_NA_TA; muic_set_mode(MUIC_NA_TA); // [email protected] 20120502 MUIC re-work printk(KERN_WARNING "[MUIC] Charger detected\n"); } else if (reg_value & 0x80 ) { // Dedicated Charger(TA) Detected muic_i2c_write_byte_local(SW_CONTROL, DP_OPEN | DM_OPEN); charging_ic_set_ta_mode(); muic_mode = MUIC_NA_TA; muic_set_mode(MUIC_NA_TA); printk(KERN_WARNING "[MUIC] NA_TA Charger detected\n"); } else if (reg_value & 0x40 ) { // Dedicated Charger(TA) Detected muic_i2c_write_byte_local(SW_CONTROL, DP_OPEN | DM_OPEN); charging_ic_set_ta_mode(); muic_mode = MUIC_LG_TA; muic_set_mode(MUIC_LG_TA); printk(KERN_WARNING "[MUIC] LG_TA Charger detected\n"); } else { // USB Detected // LGE_UPDATE_S 20110521 [[email protected]] block CP usb for commercial version #if 0 if (key_was_pressed == 2) //muic_CP_USB_set(); muic_set_mode(MUIC_CP_USB); // [email protected] else #endif /* #if 0 */ // LGE_UPDATE_S 20110521 [[email protected]] block CP usb for commercial version //muic_AP_USB_set(); muic_set_mode(MUIC_AP_USB); // [email protected] } } else { // USB Detected // LGE_UPDATE_S 20110521 [[email protected]] block CP usb for commercial version #if 0 if (key_was_pressed == 2) //muic_CP_USB_set(); muic_set_mode(MUIC_CP_USB); // [email protected] else #endif /* #if 0 */ // LGE_UPDATE_S 20110521 [[email protected]] block CP usb for commercial version //muic_AP_USB_set(); muic_set_mode(MUIC_AP_USB); // [email protected] } } else { // Accessory Not Supported muic_mode = MUIC_NONE; } key_was_pressed = 0; } s32 muic_device_detection(s32 upon_irq) { /* LGE_CHANGE_START 2011-03-16 [email protected] patch for Adb offline set and Mass Storage Driver detecting fail */ /* 20110113 [email protected] check muic driver init. state [START] */ if(!muic_init_done){ printk(KERN_WARNING "[MUIC] MUIC has not been initialized! Nothing will be done!!!.\n"); return 0; } /* 20110113 [email protected] check muic driver init. state [END] */ /* LGE_CHANGE_END 2011-03-16 [email protected] */ // Read INT_STAT_REG (0x04) muic_i2c_read_byte_local(INT_STAT, &int_stat_val); printk(KERN_INFO "[MUIC] INT_STAT = %x\n", int_stat_val); switch (muic_mode) { case MUIC_NONE: case MUIC_UNKNOWN: muic_device_none_detect(); break; // CP UART Mode case MUIC_CP_UART: case MUIC_AP_UART: if ((int_stat_val & MIDNO) == 0x0b) { muic_mode = MUIC_NONE; } else { muic_device_none_detect(); } break; // TA Mode case MUIC_NA_TA: case MUIC_LG_TA: case MUIC_TA_1A: case MUIC_INVALID_CHG: if ((int_stat_val & MVBUS) == 0) { // Exit Charger Mode muic_mode = MUIC_NONE; } else { // Bug fix: charger detect interrupt 2 times set_wakelock(0); } break; // USB Mode case MUIC_AP_USB: android_USB_disconnect(); // for usb disconnect event case MUIC_CP_USB: if ((int_stat_val & MVBUS) == 0){ // Exit USB Mode muic_mode = MUIC_NONE; } else { muic_device_none_detect(); } break; default: muic_mode = MUIC_NONE; break; } if (muic_mode == MUIC_NONE) { muic_initialize(DEFAULT); printk(KERN_INFO "[MUIC] muic none\n"); charging_ic_deactive(); printk(KERN_INFO "[MUIC] charging_ic_deactive()\n"); muic_set_mode(MUIC_NONE); // [email protected] 20120502 MUIC re-work } charger_state_update_by_other(); return 0; } EXPORT_SYMBOL(muic_device_detection); /* LGE_UPDATE_E [[email protected]] 2010-12-01, modify detection scheme */ static void muic_wq_func(struct work_struct *muic_wq){ s32 ret = 0; printk(KERN_INFO "[MUIC] muic_wq_func()\n"); ret = muic_device_detection(UPON_IRQ); }
static int set_battery_charging(struct twl4030_bci_device_info *di) { int trickle_chg_max, trickle_chg_min, trickle_chg_timer_start; max8922_status chr_ic_status = get_charging_ic_status(); if(di->battery_present == 0 || // No Battery State di->charge_rsoc == POWER_SUPPLY_TYPE_BATTERY) { // No Charging Source start_monitor = 0; set_end_of_charge(0); set_charging_timer(0); return 0; } /* * Recharging algorithm * - High Temperature : up to 4.0V * - Normal : up to 4.2V */ // Set maximum charging voltage if((di->temp_C < TEMP_CRITICAL_LOWER || di->temp_C > TEMP_CRITICAL_UPPER) && // Critical Temperature! Must stop charging di->temp_control != UNLIMITED_TEMP_VAL){ // 20120725, [email protected], Enable charging by fake mode. start_monitor = 0; set_end_of_charge(0); set_charging_timer(0); if (di->battery_present == 1) charging_ic_deactive(); return 0; } else if(di->temp_C < TEMP_LIMIT_LOWER || di->temp_C > TEMP_LIMIT_UPPER) { // Charging Limit trickle_chg_max = 4000; trickle_chg_timer_start = 3950; trickle_chg_min = 3900; } else { // Normal Charging trickle_chg_max = 4220; // to unintentional charging stop trickle_chg_timer_start = 4197; trickle_chg_min = 4140; if((di->previous_temp_C < TEMP_LIMIT_LOWER || di->previous_temp_C > TEMP_LIMIT_UPPER) && di->temp_control != UNLIMITED_TEMP_VAL) { // 20120725, [email protected], Enable charging by fake mode. start_monitor = 0; set_end_of_charge(0); set_charging_timer(0); } } // Deactive charger for protect overcharge & monitoring if(chr_ic_status != CHARGING_IC_DEACTIVE) { if(/*di->voltage_uV >= trickle_chg_max ||*/ charging_timeout() || end_of_charge) { // Battery Full Charged Once. Entering Trickle Charging Mode if(!charging_timeout()) // Do not stop charging when timeout occured charging_ic_deactive(); // It's not actually charged full. set_charging_timer(0); set_end_of_charge(0); if(start_monitor == 0) { printk(KERN_DEBUG "[Battery] Trickle Charging Start!\n"); start_monitor = 1; } } else if(di->voltage_uV >= trickle_chg_timer_start) { set_charging_timer(1); } } else if(di->voltage_uV < trickle_chg_min) { // active charger for recharging switch(di->charge_rsoc) { case POWER_SUPPLY_TYPE_MAINS: charging_ic_set_ta_mode(); break; case POWER_SUPPLY_TYPE_USB: charging_ic_set_usb_mode(); break; case POWER_SUPPLY_TYPE_UPS: charging_ic_set_factory_mode(); break; default: break; } } return 0; }
static int charging_ic_remove(struct platform_device *dev) { charging_ic_deactive(); return 0; }