static enum dwc_otg_state do_charger_detection(struct dwc_otg2 *otg)
{
	enum dwc_otg_state state = DWC_STATE_INVALID;
	enum power_supply_charger_cable_type charger =
			POWER_SUPPLY_CHARGER_TYPE_NONE;
	unsigned long flags, ma = 0;

	charger = get_charger_type(otg);
	switch (charger) {
	case POWER_SUPPLY_CHARGER_TYPE_ACA_A:
	case POWER_SUPPLY_CHARGER_TYPE_ACA_B:
	case POWER_SUPPLY_CHARGER_TYPE_ACA_C:
		otg_err(otg, "Ignore micro ACA charger.\n");
		charger = POWER_SUPPLY_CHARGER_TYPE_NONE;
		break;
	case POWER_SUPPLY_CHARGER_TYPE_USB_SDP:
	case POWER_SUPPLY_CHARGER_TYPE_USB_CDP:
		state = DWC_STATE_B_PERIPHERAL;
		break;
	case POWER_SUPPLY_CHARGER_TYPE_ACA_DOCK:
		state = DWC_STATE_A_HOST;
		break;
	case POWER_SUPPLY_CHARGER_TYPE_USB_DCP:
	case POWER_SUPPLY_CHARGER_TYPE_SE1:
		state = DWC_STATE_CHARGING;
		break;
	case POWER_SUPPLY_CHARGER_TYPE_NONE:
	default:
		if (is_self_powered_b_device(otg)) {
			state = DWC_STATE_A_HOST;
			charger = POWER_SUPPLY_CHARGER_TYPE_B_DEVICE;
			break;
		}
	};

	switch (charger) {
	case POWER_SUPPLY_CHARGER_TYPE_ACA_DOCK:
	case POWER_SUPPLY_CHARGER_TYPE_ACA_A:
	case POWER_SUPPLY_CHARGER_TYPE_ACA_B:
	case POWER_SUPPLY_CHARGER_TYPE_ACA_C:
	case POWER_SUPPLY_CHARGER_TYPE_USB_DCP:
	case POWER_SUPPLY_CHARGER_TYPE_USB_CDP:
	case POWER_SUPPLY_CHARGER_TYPE_SE1:
		ma = 1500;
		break;
	case POWER_SUPPLY_CHARGER_TYPE_USB_SDP:
		break;
	default:
		otg_err(otg, "Charger type is not valid to notify battery\n");
		return -EINVAL;
	}

	spin_lock_irqsave(&otg->lock, flags);
	otg->charging_cap.chrg_type = charger;
	otg->charging_cap.ma = ma;
	spin_unlock_irqrestore(&otg->lock, flags);

	switch (charger) {
	case POWER_SUPPLY_CHARGER_TYPE_ACA_DOCK:
	case POWER_SUPPLY_CHARGER_TYPE_USB_DCP:
	case POWER_SUPPLY_CHARGER_TYPE_USB_CDP:
	case POWER_SUPPLY_CHARGER_TYPE_SE1:
		if (dwc_otg_notify_charger_type(otg,
					POWER_SUPPLY_CHARGER_EVENT_CONNECT) < 0)
			otg_err(otg, "Notify battery type failed!\n");
		break;
	case POWER_SUPPLY_CHARGER_TYPE_USB_SDP:
	/* SDP is complicate, it will be handle in set_power */
	default:
		break;
	}

	return state;
}
示例#2
0
static ssize_t msm_batt_chgr_status_show(struct device* dev, struct device_attribute* attr, char* buf)
{
	int chg_type;
	chg_type = get_charger_type();
	return sprintf(buf,"%d\n", (chg_type == USB_CHG_TYPE__WALLCHARGER) ? 1 : (chg_type == USB_CHG_TYPE__SDP) ? 1 : 0);
}