Skip to content

Commit

Permalink
usb: typec: ucsi: Fix cable registration
Browse files Browse the repository at this point in the history
[ Upstream commit 87eb3cb ]

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: 38ca416 ("usb: typec: ucsi: Register cables based on GET_CABLE_PROPERTY")
Cc: [email protected]
Signed-off-by: Heikki Krogerus <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Greg Kroah-Hartman <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>
  • Loading branch information
Heikki Krogerus authored and gregkh committed Sep 18, 2024
1 parent a67fc92 commit 3e18407
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 16 deletions.
30 changes: 15 additions & 15 deletions drivers/usb/typec/ucsi/ucsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -915,10 +915,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;
Expand All @@ -934,10 +944,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)) {
Expand Down Expand Up @@ -1143,21 +1153,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;
Expand Down
1 change: 0 additions & 1 deletion drivers/usb/typec/ucsi/ucsi.h
Original file line number Diff line number Diff line change
Expand Up @@ -444,7 +444,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;
Expand Down

0 comments on commit 3e18407

Please sign in to comment.