static int mc13892_charger_update_status(struct mc13892_dev_info *di) { int ret; unsigned int value; int online; ret = pmic_read_reg(REG_INT_SENSE0, &value, BITFMASK(BIT_CHG_DETS)); if (ret == 0) { online = BITFEXT(value, BIT_CHG_DETS); if (online != di->charger_online) { di->charger_online = online; dev_info(di->charger.dev, "charger status: %s\n", online ? "online" : "offline"); power_supply_changed(&di->charger); cancel_delayed_work(&di->monitor_work); queue_delayed_work(di->monitor_wqueue, &di->monitor_work, HZ / 10); if (online) { pmic_start_coulomb_counter(); pmic_restart_charging(); queue_delayed_work(chg_wq, &chg_work, 100); chg_wa_timer = 1; } else { cancel_delayed_work(&chg_work); chg_wa_timer = 0; pmic_stop_coulomb_counter(); } } } return ret; }
static void chg_thread(struct work_struct *work) { //unsigned int value = 0; int charger=0; int ChargerMA=0; charger = get_charger_state(); switch(state) { case CHG_RESTART: pmic_restart_charging(); pmic_set_chg_current(0); if(charger){ if(get_battery_mV()>BATTARY_VOLTAGE_POWEROFF){ init_charger_timer(); pmic_set_charger_current_value(); state = CHG_CHARGING; }else{ pmic_set_charger_current_value(); msleep(50); if(get_battery_mA()>240){ /* if PMIC can provide 400mA */ init_charger_timer(); state = CHG_CHARGING; }else{ state = CHG_POWER_OFF; } } }else{ state = CHG_DISCHARGING; } queue_delayed_work(chg_wq, &chg_work, HZ*1); break; case CHG_POWER_OFF: pr_notice("Battery level < 3.0V!\n"); pr_notice("After power off, PMIC will charge up battery.\n"); //pmic_set_chg_current(PMIC_SET_REG_CHARGE); /* charge battery during power off */ pmic_set_charger_current_value();/* charge battery during power off */ orderly_poweroff(1); break; case CHG_CHARGING: reset_charger_timer(); ChargerMA = get_battery_mA(); if(charger_timeout() || (ChargerMA<50)){ pmic_set_chg_current(0); state = CHG_DISCHARGING_WITH_CHARGER; } if(!charger){ pmic_set_chg_current(0); state = CHG_DISCHARGING; bProcessSign = false; } if((charger) && (ChargerMA > 0) && (ChargerMA < 60) && (!bProcessSign) && bNeedReset){ pmic_close_charger_led(); bProcessSign = true; } queue_delayed_work(chg_wq, &chg_work, HZ*5); break; case CHG_DISCHARGING: bProcessSign = false; if(charger) state = CHG_RESTART; queue_delayed_work(chg_wq, &chg_work, HZ*10); break; case CHG_DISCHARGING_WITH_CHARGER: if(get_battery_mV() < PMIC_VOLTAGE_MAX_WORK)/*4000*/ state = CHG_RESTART; if(!charger) state = CHG_DISCHARGING; queue_delayed_work(chg_wq, &chg_work, HZ*2); break; } }
static int mc13892_charger_update_status(struct mc13892_dev_info *di) { int ret; #ifndef CONFIG_MACH_MX51_ERDOS unsigned int value; #endif /* CONFIG_MACH_MX51_ERDOS */ int online; #ifdef CONFIG_MACH_MX51_ERDOS ret = pmic_get_dcinput_voltage ((unsigned short *)0); if (ret == 0) { online = 1; } else if (ret == 1) { online = 0; } else { online = di->charger_online; /* keep previous */ } ret = 0; /* * Battery/DCinput update */ if (online == 1) { gpio_battery_enable ( 0 ); } else if (online == 0) { gpio_battery_enable ( 1 ); } if (online != di->charger_online) { di->charger_online = online; /* * check power_supply_register. */ if (di->charger.dev != 0) { dev_info(di->charger.dev, "charger status: %s\n", online ? "online" : "offline"); power_supply_changed(&di->charger); } else { printk ("mc13892_charger_update_status: charger status: %s\n", online ? "online" : "offline"); } } #else ret = pmic_read_reg(REG_INT_SENSE0, &value, BITFMASK(BIT_CHG_DETS)); if (ret == 0) { online = BITFEXT(value, BIT_CHG_DETS); if (online != di->charger_online) { di->charger_online = online; dev_info(di->charger.dev, "charger status: %s\n", online ? "online" : "offline"); power_supply_changed(&di->charger); cancel_delayed_work(&di->monitor_work); queue_delayed_work(di->monitor_wqueue, &di->monitor_work, HZ / 10); if (online) { pmic_start_coulomb_counter(); pmic_restart_charging(); } else pmic_stop_coulomb_counter(); } } #endif /* CONFIG_MACH_MX51_ERDOS */ return ret; }