]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
usb: typec: ucsi: Fix cable registration
authorHeikki Krogerus <heikki.krogerus@linux.intel.com>
Tue, 3 Sep 2024 13:09:44 +0000 (16:09 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 3 Sep 2024 17:26:18 +0000 (19:26 +0200)
The Cable PD Revision field in GET_CABLE_PROPERTY was
introduced in UCSI v2.1, so adding check for that.

The cable properties are also not used anywhere after the
cable is registered, so removing the cable_prop member
from struct ucsi_connector while at it.

Fixes: 38ca416597b0 ("usb: typec: ucsi: Register cables based on GET_CABLE_PROPERTY")
Cc: stable@vger.kernel.org
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Link: https://lore.kernel.org/r/20240903130945.3395291-1-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 9a799637754c6d583c2c9dd5618711e2655a78b6..17155ed17fdf840ee9c863c8216371d4639d1b9b 100644 (file)
@@ -965,10 +965,20 @@ static void ucsi_unregister_plug(struct ucsi_connector *con)
 
 static int ucsi_register_cable(struct ucsi_connector *con)
 {
+       struct ucsi_cable_property cable_prop;
        struct typec_cable *cable;
        struct typec_cable_desc desc = {};
+       u64 command;
+       int ret;
+
+       command = UCSI_GET_CABLE_PROPERTY | UCSI_CONNECTOR_NUMBER(con->num);
+       ret = ucsi_send_command(con->ucsi, command, &cable_prop, sizeof(cable_prop));
+       if (ret < 0) {
+               dev_err(con->ucsi->dev, "GET_CABLE_PROPERTY failed (%d)\n", ret);
+               return ret;
+       }
 
-       switch (UCSI_CABLE_PROP_FLAG_PLUG_TYPE(con->cable_prop.flags)) {
+       switch (UCSI_CABLE_PROP_FLAG_PLUG_TYPE(cable_prop.flags)) {
        case UCSI_CABLE_PROPERTY_PLUG_TYPE_A:
                desc.type = USB_PLUG_TYPE_A;
                break;
@@ -984,10 +994,10 @@ static int ucsi_register_cable(struct ucsi_connector *con)
        }
 
        desc.identity = &con->cable_identity;
-       desc.active = !!(UCSI_CABLE_PROP_FLAG_ACTIVE_CABLE &
-                        con->cable_prop.flags);
-       desc.pd_revision = UCSI_CABLE_PROP_FLAG_PD_MAJOR_REV_AS_BCD(
-           con->cable_prop.flags);
+       desc.active = !!(UCSI_CABLE_PROP_FLAG_ACTIVE_CABLE & cable_prop.flags);
+
+       if (con->ucsi->version >= UCSI_VERSION_2_1)
+               desc.pd_revision = UCSI_CABLE_PROP_FLAG_PD_MAJOR_REV_AS_BCD(cable_prop.flags);
 
        cable = typec_register_cable(con->port, &desc);
        if (IS_ERR(cable)) {
@@ -1193,21 +1203,11 @@ static int ucsi_check_connection(struct ucsi_connector *con)
 
 static int ucsi_check_cable(struct ucsi_connector *con)
 {
-       u64 command;
        int ret, num_plug_am;
 
        if (con->cable)
                return 0;
 
-       command = UCSI_GET_CABLE_PROPERTY | UCSI_CONNECTOR_NUMBER(con->num);
-       ret = ucsi_send_command(con->ucsi, command, &con->cable_prop,
-                               sizeof(con->cable_prop));
-       if (ret < 0) {
-               dev_err(con->ucsi->dev, "GET_CABLE_PROPERTY failed (%d)\n",
-                       ret);
-               return ret;
-       }
-
        ret = ucsi_register_cable(con);
        if (ret < 0)
                return ret;
index 57129f3c0814289b412af0a9cf9504234ca5ec9d..5a3481d36d7abc8e5a81e9bb28b450facaca7c68 100644 (file)
@@ -465,7 +465,6 @@ struct ucsi_connector {
 
        struct ucsi_connector_status status;
        struct ucsi_connector_capability cap;
-       struct ucsi_cable_property cable_prop;
        struct power_supply *psy;
        struct power_supply_desc psy_desc;
        u32 rdo;