]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
usb: typec: ucsi: Add DATA_RESET option of Connector Reset command
authorVenkat Jayaraman <venkat.jayaraman@intel.com>
Tue, 13 Aug 2024 23:18:28 +0000 (16:18 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 22 Aug 2024 09:24:26 +0000 (17:24 +0800)
Modify CONNECTOR_RESET command implementation to accommodate
DATA_RESET reset type as defined in UCSI spec v2.0 and later.

Hard Reset bit field was defined with value 1 in UCSI spec version 1.0.
Starting with spec version 1.1, Hard Reset bit field was removed from the
CONNECTOR_RESET command, until spec 2.0 reintroduced it with value 0, so,
the value to pass in to the command for a Hard Reset is different depending
on the UCSI version supported by the LPM.

Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Signed-off-by: Venkat Jayaraman <venkat.jayaraman@intel.com>
Link: https://lore.kernel.org/r/20240813231828.1192338-1-pooja.katiyar@intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/typec/ucsi/ucsi.c
drivers/usb/typec/ucsi/ucsi.h

index 4039851551c1b7251b5ae5ec1402092b55575073..546352b53bc42bd08f0d521e1a308fa11299f200 100644 (file)
@@ -1340,12 +1340,26 @@ EXPORT_SYMBOL_GPL(ucsi_connector_change);
 
 /* -------------------------------------------------------------------------- */
 
+/*
+ * Hard Reset bit field was defined with value 1 in UCSI spec version 1.0.
+ * Starting with spec version 1.1, Hard Reset bit field was removed from the
+ * CONNECTOR_RESET command, until spec 2.0 reintroduced it with value 0, so, in effect,
+ * the value to pass in to the command for a Hard Reset is different depending
+ * on the supported UCSI version by the LPM.
+ *
+ * For performing a Data Reset on LPMs supporting version 2.0 and greater,
+ * this function needs to be called with the second argument set to 0.
+ */
 static int ucsi_reset_connector(struct ucsi_connector *con, bool hard)
 {
        u64 command;
 
        command = UCSI_CONNECTOR_RESET | UCSI_CONNECTOR_NUMBER(con->num);
-       command |= hard ? UCSI_CONNECTOR_RESET_HARD : 0;
+
+       if (con->ucsi->version < UCSI_VERSION_1_1)
+               command |= hard ? UCSI_CONNECTOR_RESET_HARD_VER_1_0 : 0;
+       else if (con->ucsi->version >= UCSI_VERSION_2_0)
+               command |= hard ? 0 : UCSI_CONNECTOR_RESET_DATA_VER_2_0;
 
        return ucsi_send_command(con->ucsi, command, NULL, 0);
 }
index 57129f3c0814289b412af0a9cf9504234ca5ec9d..06c642e2838f48610a5c23f7797b345fb89c9c84 100644 (file)
@@ -29,6 +29,7 @@ struct dentry;
 #define UCSIv2_MESSAGE_OUT             272
 
 /* UCSI versions */
+#define UCSI_VERSION_1_1       0x0110
 #define UCSI_VERSION_1_2       0x0120
 #define UCSI_VERSION_2_0       0x0200
 #define UCSI_VERSION_2_1       0x0210
@@ -122,7 +123,9 @@ void ucsi_connector_change(struct ucsi *ucsi, u8 num);
 #define UCSI_DEFAULT_GET_CONNECTOR_NUMBER(_cmd_)       (((_cmd_) >> 16) & GENMASK(6, 0))
 
 /* CONNECTOR_RESET command bits */
-#define UCSI_CONNECTOR_RESET_HARD              BIT(23) /* Deprecated in v1.1 */
+#define UCSI_CONNECTOR_RESET_HARD_VER_1_0      BIT(23) /* Deprecated in v1.1 */
+#define UCSI_CONNECTOR_RESET_DATA_VER_2_0      BIT(23) /* Redefined in v2.0 */
+
 
 /* ACK_CC_CI bits */
 #define UCSI_ACK_CONNECTOR_CHANGE              BIT(16)