usb: typec: ucsi: Add support for the partner USB Modes
authorHeikki Krogerus <heikki.krogerus@linux.intel.com>
Wed, 16 Oct 2024 13:18:34 +0000 (16:18 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 17 Oct 2024 06:41:46 +0000 (08:41 +0200)
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>
drivers/usb/typec/ucsi/ucsi.c
drivers/usb/typec/ucsi/ucsi.h

index 13c739d334c4a680449304b7127537b159f0d593..d03f04556ab78cd54f15e52b97d5255cce2d947f 100644 (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;
 }
 
index ee7d8bf4c404e9a09cfc630ce19961bbeb8b6f14..b82dc4c16a0d62b86e9c47e279ce7c2fbf16461d 100644 (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