usb: typec: ucsi: Add support for the partner USB Modes

UCSI does not share the contents of the Enter_USB Message
that was used, so the active mode still has to be always
determined from the enumerated USB device. However, after
UCSI v2.0 it is possible to check separately is USB4 the
active mode.

So with USB2 and USB3 the mode is always determined from the
result of the USB enumeration, and when USB4 USB Mode is
active, UCSI driver can assign the mode directly.

Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Link: https://lore.kernel.org/r/20241016131834.898599-5-heikki.krogerus@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Heikki Krogerus 2024-10-16 16:18:34 +03:00 committed by Greg Kroah-Hartman
parent ae70c804a1
commit a79f16efcd
2 changed files with 11 additions and 0 deletions

View File

@ -1057,6 +1057,15 @@ static int ucsi_register_partner(struct ucsi_connector *con)
con->partner = partner;
if ((con->ucsi->version >= UCSI_VERSION_3_0) &&
(UCSI_CONSTAT_PARTNER_FLAGS(con->status.flags) &
UCSI_CONSTAT_PARTNER_FLAG_USB4_GEN4))
typec_partner_set_usb_mode(partner, USB_MODE_USB4);
else if ((con->ucsi->version >= UCSI_VERSION_2_0) &&
(UCSI_CONSTAT_PARTNER_FLAGS(con->status.flags) &
UCSI_CONSTAT_PARTNER_FLAG_USB4_GEN3))
typec_partner_set_usb_mode(partner, USB_MODE_USB4);
return 0;
}

View File

@ -347,6 +347,8 @@ struct ucsi_connector_status {
#define UCSI_CONSTAT_PARTNER_FLAGS(_f_) (((_f_) & GENMASK(12, 5)) >> 5)
#define UCSI_CONSTAT_PARTNER_FLAG_USB 1
#define UCSI_CONSTAT_PARTNER_FLAG_ALT_MODE 2
#define UCSI_CONSTAT_PARTNER_FLAG_USB4_GEN3 4
#define UCSI_CONSTAT_PARTNER_FLAG_USB4_GEN4 8
#define UCSI_CONSTAT_PARTNER_TYPE(_f_) (((_f_) & GENMASK(15, 13)) >> 13)
#define UCSI_CONSTAT_PARTNER_TYPE_DFP 1
#define UCSI_CONSTAT_PARTNER_TYPE_UFP 2