static void p3_cable_check_status(struct battery_data *battery)
{
	enum charger_type status = 0;

	mutex_lock(&battery->work_lock);

	if (get_charger_status(battery)) {
		if (battery->info.batt_health != POWER_SUPPLY_HEALTH_GOOD) {
			pr_info("Unhealth battery state! ");
			status = CHARGER_DISCHARGE;
			p3_set_chg_en(battery, 0);
			goto __end__;
		}

		status = battery->current_cable_status;

		p3_set_chg_en(battery, 1);

		max17042_chip_data->info.low_batt_comp_flag = 0;
		reset_low_batt_comp_cnt();

	} else {
		status = CHARGER_BATTERY;
		p3_set_chg_en(battery, 0);
	}
__end__:
	p3_cable_status_update(battery, status);
	mutex_unlock(&battery->work_lock);
}
static int p3_cable_status_update(struct battery_data *battery, int status)
{
	int ret = 0;
	enum charger_type source = CHARGER_BATTERY;

	pr_debug("Update cable status ");

	if (!battery->p3_battery_initial)
		return -EPERM;

	switch (status) {
	case CHARGER_BATTERY:
		pr_info("cable NOT PRESENT ");
		battery->info.charging_source = CHARGER_BATTERY;
		break;
	case CHARGER_USB:
		pr_info("cable USB ");
		battery->info.charging_source = CHARGER_USB;
		break;
	case CHARGER_AC:
		pr_info("cable AC ");
		battery->info.charging_source = CHARGER_AC;
		break;
	case CHARGER_DISCHARGE:
		pr_info("Discharge");
		battery->info.charging_source = CHARGER_DISCHARGE;
		break;
	default:
		pr_info("Not supported status");
		ret = -EINVAL;
	}
	check_usb_status = source = battery->info.charging_source;

	if (source == CHARGER_USB) {
		wake_lock(&battery->vbus_wake_lock);
	} else {
		/* give userspace some time to see the uevent and update
		* LED state or whatnot...
		*/
		if (!get_charger_status(battery)) {
			if (battery->charging_mode_booting)
				wake_lock_timeout(&battery->vbus_wake_lock,
						5 * HZ);
			else
				wake_lock_timeout(&battery->vbus_wake_lock,
						HZ / 2);
		}
	}

	wake_lock(&battery->work_wake_lock);
	schedule_work(&battery->battery_work);

	pr_debug("call power_supply_changed ");

	return ret;
}
int _low_battery_alarm_(struct battery_data *battery)
{
	if (!get_charger_status(battery)) {
		pr_info("soc = 0! Power Off!! ");
		battery->info.level = 0;
		wake_lock_timeout(&battery->vbus_wake_lock, HZ);
		power_supply_changed(&battery->psy_battery);
	}

	return 0;
}
static void fullcharging_work_handler(struct work_struct *work)
{
	struct battery_data *battery =
		container_of(work, struct battery_data, fullcharging_work.work);
	pr_info("%s : nCHG rising intr!!", __func__);

	if (gpio_get_value(battery->pdata->charger.fullcharge_line) == 1
		&& get_charger_status(battery) != 0 && battery->info.level >= 70
		&& battery->current_cable_status != CHARGER_BATTERY)
		p3_cable_charging(battery);

}
static int p3_bat_suspend(struct device *dev)
{
	struct battery_data *battery = dev_get_drvdata(dev);
	pr_info("bat suspend");

	if (!get_charger_status(battery)) {
		p3_program_alarm(battery, SLOW_POLL);
		battery->slow_poll = 1;
	}

	return 0;
}
Ejemplo n.º 6
0
static void p3_set_chg_en(struct battery_data *battery, int enable)
{
	int chg_en_val = get_charger_status(battery);
	int charger_enable_line = battery->pdata->charger.enable_line;
	if (enable) {
		if (chg_en_val) {
			if (battery->current_cable_status == CHARGER_AC) {
				if (battery->pdata->check_dedicated_charger()
					== 1) {
					pr_info("%s: samsung charger!!\n",
						__func__);
					p3_set_charging(battery, 1);
				} else {
					pr_info("%s: improper charger!!\n",
						__func__);
					battery->info.batt_improper_ta = 1;
					p3_set_charging(battery, 2);
				}
				gpio_set_value(charger_enable_line, 0);
			} else if (battery->current_cable_status ==
				CHARGER_USB) {
				pr_info("USB charger!!");
				if (battery->info.force_usb_charging)
					p3_set_charging(battery, 1);
				else
					p3_set_charging(battery, 2);
				gpio_set_value(charger_enable_line, 0);
			} else {
				pr_info("else type charger!!");
				p3_set_charging(battery, 2);
				gpio_set_value(charger_enable_line, 0);
			}
			pr_info("%s: Enabling the external charger ", __func__);
			p3_set_time_for_charging(battery, 1);
		}
	} else {
		gpio_set_value(charger_enable_line, 1);
		if (battery->current_cable_status == CHARGER_BATTERY)  { // charging stopped by cable disconnected
			p3_set_charging(battery, 2);
		} else { // charging stopped with cable connected
			p3_set_charging(battery, 3);
		}
		udelay(10);
		pr_info("%s: Disabling the external charger ", __func__);
		p3_set_time_for_charging(battery, 0);
		battery->info.batt_is_recharging = 0;
	}

	battery->info.charging_enabled = enable;
}