Skip to content

Commit

Permalink
platform/chrome: cros_ec_typec: Add support for setting USB mode via …
Browse files Browse the repository at this point in the history
…sysfs

This patch implements USB mode setting via a sysfs interface in
cros_ec_typec driver. User-space applications can now change the current
USB mode by writing to "usb_mode" sysfs entry, replacing the previous
ioctl-based method.
The embedded controller (EC) currently supports only entering USB4 mode
and exiting all modes (including altmodes). Both of these operations
trigger Data Reset Message, even if no USB Mode is active.
Additionally, the patch exposes the USB modes supported by the port via
"usb_capability" sysfs attribute.

Signed-off-by: Andrei Kuchynski <akuchynski@chromium.org>
Link: https://lore.kernel.org/r/20250210130419.4110130-1-akuchynski@chromium.org
Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>
  • Loading branch information
Andrei Kuchynski authored and Tzung-Bi Shih committed Feb 21, 2025
1 parent 435a3d7 commit 9fc8337
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 0 deletions.
28 changes: 28 additions & 0 deletions drivers/platform/chrome/cros_ec_typec.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,24 @@ static void cros_typec_role_switch_quirk(struct fwnode_handle *fwnode)
#endif
}

static int cros_typec_enter_usb_mode(struct typec_port *tc_port, enum usb_mode mode)
{
struct cros_typec_port *port = typec_get_drvdata(tc_port);
struct ec_params_typec_control req = {
.port = port->port_num,
.command = (mode == USB_MODE_USB4) ?
TYPEC_CONTROL_COMMAND_ENTER_MODE : TYPEC_CONTROL_COMMAND_EXIT_MODES,
.mode_to_enter = CROS_EC_ALTMODE_USB4
};

return cros_ec_cmd(port->typec_data->ec, 0, EC_CMD_TYPEC_CONTROL,
&req, sizeof(req), NULL, 0);
}

static const struct typec_operations cros_typec_usb_mode_ops = {
.enter_usb_mode = cros_typec_enter_usb_mode
};

static int cros_typec_parse_port_props(struct typec_capability *cap,
struct fwnode_handle *fwnode,
struct device *dev)
Expand Down Expand Up @@ -84,6 +102,13 @@ static int cros_typec_parse_port_props(struct typec_capability *cap,
cap->prefer_role = ret;
}

if (fwnode_property_present(fwnode, "usb2-port"))
cap->usb_capability |= USB_CAPABILITY_USB2;
if (fwnode_property_present(fwnode, "usb3-port"))
cap->usb_capability |= USB_CAPABILITY_USB3;
if (fwnode_property_present(fwnode, "usb4-port"))
cap->usb_capability |= USB_CAPABILITY_USB4;

cros_typec_role_switch_quirk(fwnode);

cap->fwnode = fwnode;
Expand Down Expand Up @@ -379,6 +404,9 @@ static int cros_typec_init_ports(struct cros_typec_data *typec)
if (ret < 0)
goto unregister_ports;

cap->driver_data = cros_port;
cap->ops = &cros_typec_usb_mode_ops;

cros_port->port = typec_register_port(dev, cap);
if (IS_ERR(cros_port->port)) {
ret = PTR_ERR(cros_port->port);
Expand Down
1 change: 1 addition & 0 deletions drivers/platform/chrome/cros_ec_typec.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
enum {
CROS_EC_ALTMODE_DP = 0,
CROS_EC_ALTMODE_TBT,
CROS_EC_ALTMODE_USB4,
CROS_EC_ALTMODE_MAX,
};

Expand Down

0 comments on commit 9fc8337

Please sign in to comment.