Commit 87eb3cb4 authored by Heikki Krogerus's avatar Heikki Krogerus Committed by Greg Kroah-Hartman

usb: typec: ucsi: Fix cable registration

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: 38ca4165 ("usb: typec: ucsi: Register cables based on GET_CABLE_PROPERTY")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarHeikki Krogerus <heikki.krogerus@linux.intel.com>
Link: https://lore.kernel.org/r/20240903130945.3395291-1-heikki.krogerus@linux.intel.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent de3d7969
...@@ -965,10 +965,20 @@ static void ucsi_unregister_plug(struct ucsi_connector *con) ...@@ -965,10 +965,20 @@ static void ucsi_unregister_plug(struct ucsi_connector *con)
static int ucsi_register_cable(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 *cable;
struct typec_cable_desc desc = {}; 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: case UCSI_CABLE_PROPERTY_PLUG_TYPE_A:
desc.type = USB_PLUG_TYPE_A; desc.type = USB_PLUG_TYPE_A;
break; break;
...@@ -984,10 +994,10 @@ static int ucsi_register_cable(struct ucsi_connector *con) ...@@ -984,10 +994,10 @@ static int ucsi_register_cable(struct ucsi_connector *con)
} }
desc.identity = &con->cable_identity; desc.identity = &con->cable_identity;
desc.active = !!(UCSI_CABLE_PROP_FLAG_ACTIVE_CABLE & desc.active = !!(UCSI_CABLE_PROP_FLAG_ACTIVE_CABLE & cable_prop.flags);
con->cable_prop.flags);
desc.pd_revision = UCSI_CABLE_PROP_FLAG_PD_MAJOR_REV_AS_BCD( if (con->ucsi->version >= UCSI_VERSION_2_1)
con->cable_prop.flags); desc.pd_revision = UCSI_CABLE_PROP_FLAG_PD_MAJOR_REV_AS_BCD(cable_prop.flags);
cable = typec_register_cable(con->port, &desc); cable = typec_register_cable(con->port, &desc);
if (IS_ERR(cable)) { if (IS_ERR(cable)) {
...@@ -1193,21 +1203,11 @@ static int ucsi_check_connection(struct ucsi_connector *con) ...@@ -1193,21 +1203,11 @@ static int ucsi_check_connection(struct ucsi_connector *con)
static int ucsi_check_cable(struct ucsi_connector *con) static int ucsi_check_cable(struct ucsi_connector *con)
{ {
u64 command;
int ret, num_plug_am; int ret, num_plug_am;
if (con->cable) if (con->cable)
return 0; 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); ret = ucsi_register_cable(con);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
...@@ -465,7 +465,6 @@ struct ucsi_connector { ...@@ -465,7 +465,6 @@ struct ucsi_connector {
struct ucsi_connector_status status; struct ucsi_connector_status status;
struct ucsi_connector_capability cap; struct ucsi_connector_capability cap;
struct ucsi_cable_property cable_prop;
struct power_supply *psy; struct power_supply *psy;
struct power_supply_desc psy_desc; struct power_supply_desc psy_desc;
u32 rdo; u32 rdo;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment