Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
	}
 }
Esempio n. 3
0
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;
}