ret = cros_ec_cmd_xfer_status(info->ec, msg); if (ret >= 0 && insize)
memcpy(indata, msg->data, insize);
kfree(msg); return ret;
}
/** * cros_ec_usb_get_power_type() - Get power type info about PD device attached * to given port. * @info: pointer to struct cros_ec_extcon_info * * Return: power type on success, <0 on failure.
*/ staticint cros_ec_usb_get_power_type(struct cros_ec_extcon_info *info)
{ struct ec_params_usb_pd_power_info req; struct ec_response_usb_pd_power_info resp; int ret;
req.port = info->port_id;
ret = cros_ec_pd_command(info, EC_CMD_USB_PD_POWER_INFO, 0,
&req, sizeof(req), &resp, sizeof(resp)); if (ret < 0) return ret;
return resp.type;
}
/** * cros_ec_usb_get_pd_mux_state() - Get PD mux state for given port. * @info: pointer to struct cros_ec_extcon_info * * Return: PD mux state on success, <0 on failure.
*/ staticint cros_ec_usb_get_pd_mux_state(struct cros_ec_extcon_info *info)
{ struct ec_params_usb_pd_mux_info req; struct ec_response_usb_pd_mux_info resp; int ret;
req.port = info->port_id;
ret = cros_ec_pd_command(info, EC_CMD_USB_PD_MUX_INFO, 0,
&req, sizeof(req),
&resp, sizeof(resp)); if (ret < 0) return ret;
return resp.flags;
}
/** * cros_ec_usb_get_role() - Get role info about possible PD device attached to a * given port. * @info: pointer to struct cros_ec_extcon_info * @polarity: pointer to cable polarity (return value) * * Return: role info on success, -ENOTCONN if no cable is connected, <0 on * failure.
*/ staticint cros_ec_usb_get_role(struct cros_ec_extcon_info *info, bool *polarity)
{ struct ec_params_usb_pd_control pd_control; struct ec_response_usb_pd_control_v1 resp; int ret;
if (!(resp.enabled & PD_CTRL_RESP_ENABLED_CONNECTED)) return -ENOTCONN;
*polarity = resp.polarity;
return resp.role;
}
/** * cros_ec_pd_get_num_ports() - Get number of EC charge ports. * @info: pointer to struct cros_ec_extcon_info * * Return: number of ports on success, <0 on failure.
*/ staticint cros_ec_pd_get_num_ports(struct cros_ec_extcon_info *info)
{ struct ec_response_usb_pd_ports resp; int ret;
ret = cros_ec_pd_command(info, EC_CMD_USB_PD_PORTS,
0, NULL, 0, &resp, sizeof(resp)); if (ret < 0) return ret;
staticconstchar *cros_ec_usb_power_type_string(unsignedint type)
{ switch (type) { case USB_CHG_TYPE_NONE: return"USB_CHG_TYPE_NONE"; case USB_CHG_TYPE_PD: return"USB_CHG_TYPE_PD"; case USB_CHG_TYPE_PROPRIETARY: return"USB_CHG_TYPE_PROPRIETARY"; case USB_CHG_TYPE_C: return"USB_CHG_TYPE_C"; case USB_CHG_TYPE_BC12_DCP: return"USB_CHG_TYPE_BC12_DCP"; case USB_CHG_TYPE_BC12_CDP: return"USB_CHG_TYPE_BC12_CDP"; case USB_CHG_TYPE_BC12_SDP: return"USB_CHG_TYPE_BC12_SDP"; case USB_CHG_TYPE_OTHER: return"USB_CHG_TYPE_OTHER"; case USB_CHG_TYPE_VBUS: return"USB_CHG_TYPE_VBUS"; case USB_CHG_TYPE_UNKNOWN: return"USB_CHG_TYPE_UNKNOWN"; default: return"USB_CHG_TYPE_UNKNOWN";
}
}
staticbool cros_ec_usb_power_type_is_wall_wart(unsignedint type, unsignedint role)
{ switch (type) { /* FIXME : Guppy, Donnettes, and other chargers will be miscategorized * because they identify with USB_CHG_TYPE_C, but we can't return true * here from that code because that breaks Suzy-Q and other kinds of * USB Type-C cables and peripherals.
*/ case USB_CHG_TYPE_PROPRIETARY: case USB_CHG_TYPE_BC12_DCP: returntrue; case USB_CHG_TYPE_PD: case USB_CHG_TYPE_C: case USB_CHG_TYPE_BC12_CDP: case USB_CHG_TYPE_BC12_SDP: case USB_CHG_TYPE_OTHER: case USB_CHG_TYPE_VBUS: case USB_CHG_TYPE_UNKNOWN: case USB_CHG_TYPE_NONE: default: returnfalse;
}
}
dev_dbg(dev, "connected role 0x%x pwr type %d dr %d pr %d pol %d mux %d dp %d hpd %d\n",
role, power_type, dr, pr, polarity, mux, dp, hpd);
}
/* * When there is no USB host (e.g. USB PD charger), * we are not really a UFP for the AP.
*/ if (dr == DR_DEVICE &&
cros_ec_usb_power_type_is_wall_wart(power_type, role))
dr = DR_NONE;
/* Get PD events from the EC */
info->notifier.notifier_call = extcon_cros_ec_event;
ret = blocking_notifier_chain_register(&info->ec->event_notifier,
&info->notifier); if (ret < 0) {
dev_err(dev, "failed to register notifier\n"); return ret;
}
/* Perform initial detection */
ret = extcon_cros_ec_detect_cable(info, true); if (ret < 0) {
dev_err(dev, "failed to detect initial cable state\n"); goto unregister_notifier;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.