Skip to content

Commit

Permalink
platform/chrome: cros_ec_typec: Configure Retimer cable type
Browse files Browse the repository at this point in the history
Connector class driver only configure cable type active or passive.
Configure if the cable type is retimer or redriver with this change.
This detail will be provided as a part of cable discover mode VDO.

Signed-off-by: Utkarsh Patel <utkarsh.h.patel@intel.com>
Acked-by: Prashant Malani <pmalani@chromium.org>
Link: https://lore.kernel.org/r/20230718024703.1013367-2-utkarsh.h.patel@intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Utkarsh Patel authored and Greg Kroah-Hartman committed Aug 26, 2023
1 parent 78e0ea4 commit aad6ad1
Showing 1 changed file with 27 additions and 1 deletion.
28 changes: 27 additions & 1 deletion drivers/platform/chrome/cros_ec_typec.c
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,27 @@ static int cros_typec_usb_safe_state(struct cros_typec_port *port)
return ret;
}

/**
* cros_typec_get_cable_vdo() - Get Cable VDO of the connected cable
* @port: Type-C port data
* @svid: Standard or Vendor ID to match
*
* Returns the Cable VDO if match is found and returns 0 if match is not found.
*/
static int cros_typec_get_cable_vdo(struct cros_typec_port *port, u16 svid)
{
struct list_head *head = &port->plug_mode_list;
struct cros_typec_altmode_node *node;
u32 ret = 0;

list_for_each_entry(node, head, list) {
if (node->amode->svid == svid)
return node->amode->vdo;
}

return ret;
}

/*
* Spoof the VDOs that were likely communicated by the partner for TBT alt
* mode.
Expand All @@ -432,6 +453,9 @@ static int cros_typec_enable_tbt(struct cros_typec_data *typec,

/* Cable Discover Mode VDO */
data.cable_mode = TBT_MODE;

data.cable_mode |= cros_typec_get_cable_vdo(port, USB_TYPEC_TBT_SID);

data.cable_mode |= TBT_SET_CABLE_SPEED(pd_ctrl->cable_speed);

if (pd_ctrl->control_flags & USB_PD_CTRL_OPTICAL_CABLE)
Expand Down Expand Up @@ -522,8 +546,10 @@ static int cros_typec_enable_usb4(struct cros_typec_data *typec,
/* Cable Type */
if (pd_ctrl->control_flags & USB_PD_CTRL_OPTICAL_CABLE)
data.eudo |= EUDO_CABLE_TYPE_OPTICAL << EUDO_CABLE_TYPE_SHIFT;
else if (pd_ctrl->control_flags & USB_PD_CTRL_ACTIVE_CABLE)
else if (cros_typec_get_cable_vdo(port, USB_TYPEC_TBT_SID) & TBT_CABLE_RETIMER)
data.eudo |= EUDO_CABLE_TYPE_RE_TIMER << EUDO_CABLE_TYPE_SHIFT;
else if (pd_ctrl->control_flags & USB_PD_CTRL_ACTIVE_CABLE)
data.eudo |= EUDO_CABLE_TYPE_RE_DRIVER << EUDO_CABLE_TYPE_SHIFT;

data.active_link_training = !!(pd_ctrl->control_flags &
USB_PD_CTRL_ACTIVE_LINK_UNIDIR);
Expand Down

0 comments on commit aad6ad1

Please sign in to comment.