[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <aG640KbIPP5hqSg2@google.com>
Date: Wed, 9 Jul 2025 18:45:36 +0000
From: Benson Leung <bleung@...gle.com>
To: Radu Vele <raduvele@...gle.com>
Cc: Benson Leung <bleung@...omium.org>,
Abhishek Pandit-Subedi <abhishekpandit@...omium.org>,
Jameson Thies <jthies@...gle.com>,
Andrei Kuchynski <akuchynski@...omium.org>,
Tzung-Bi Shih <tzungbi@...nel.org>, chrome-platform@...ts.linux.dev,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH v1 1/2] platform/chrome: cros_ec_typec: Add role swap ops
Hi Radu and Abhishek,
Thanks for this change!
On Wed, Jul 09, 2025 at 01:22:31PM +0000, Radu Vele wrote:
> From: Abhishek Pandit-Subedi <abhishekpandit@...omium.org>
>
> Add the pr_set and dr_set typec_operations to registered typec ports.
> This enables sysfs to control power and data role when the port is
> capable of doing so.
>
> Signed-off-by: Abhishek Pandit-Subedi <abhishekpandit@...omium.org>
> Co-developed-by: Radu Vele <raduvele@...gle.com>
> Signed-off-by: Radu Vele <raduvele@...gle.com>
Reviewed-by: Benson Leung <bleung@...omium.org>
> ---
> drivers/platform/chrome/cros_ec_typec.c | 77 ++++++++++++++++++++++++-
> 1 file changed, 76 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/platform/chrome/cros_ec_typec.c b/drivers/platform/chrome/cros_ec_typec.c
> index 7678e3d05fd3..289429ef959f 100644
> --- a/drivers/platform/chrome/cros_ec_typec.c
> +++ b/drivers/platform/chrome/cros_ec_typec.c
> @@ -58,8 +58,83 @@ static int cros_typec_enter_usb_mode(struct typec_port *tc_port, enum usb_mode m
> &req, sizeof(req), NULL, 0);
> }
>
> +static int cros_typec_perform_role_swap(struct typec_port *tc_port, int target_role, u8 swap_type)
> +{
> + struct cros_typec_port *port = typec_get_drvdata(tc_port);
> + struct cros_typec_data *data = port->typec_data;
> + struct ec_response_usb_pd_control_v2 resp;
> + struct ec_params_usb_pd_control req;
> + int role, ret;
> +
> + /* Must be at least v1 to support role swap. */
> + if (!data->pd_ctrl_ver)
> + return -EOPNOTSUPP;
> +
> + /* First query the state */
> + req.port = port->port_num;
> + req.role = USB_PD_CTRL_ROLE_NO_CHANGE;
> + req.mux = USB_PD_CTRL_MUX_NO_CHANGE;
> + req.swap = USB_PD_CTRL_SWAP_NONE;
> +
> + ret = cros_ec_cmd(data->ec, data->pd_ctrl_ver, EC_CMD_USB_PD_CONTROL,
> + &req, sizeof(req), &resp, sizeof(resp));
> + if (ret < 0)
> + return ret;
> +
> + switch (swap_type) {
> + case USB_PD_CTRL_SWAP_DATA:
> + role = (resp.role & PD_CTRL_RESP_ROLE_DATA) ? TYPEC_HOST :
> + TYPEC_DEVICE;
> + break;
> + case USB_PD_CTRL_SWAP_POWER:
> + role = (resp.role & PD_CTRL_RESP_ROLE_POWER) ? TYPEC_SOURCE :
> + TYPEC_SINK;
> + break;
> + default:
> + dev_warn(data->dev, "Unsupported role swap type %d", swap_type);
> + return -EOPNOTSUPP;
> + }
> +
> + if (role == target_role)
> + return 0;
> +
> + req.swap = swap_type;
> + ret = cros_ec_cmd(data->ec, data->pd_ctrl_ver, EC_CMD_USB_PD_CONTROL,
> + &req, sizeof(req), &resp, sizeof(resp));
> +
> + if (ret < 0)
> + return ret;
> +
> + switch (swap_type) {
> + case USB_PD_CTRL_SWAP_DATA:
> + typec_set_data_role(tc_port, resp.role & PD_CTRL_RESP_ROLE_DATA ?
> + TYPEC_HOST :
> + TYPEC_DEVICE);
> + break;
> + case USB_PD_CTRL_SWAP_POWER:
> + typec_set_pwr_role(tc_port, resp.role & PD_CTRL_RESP_ROLE_POWER ?
> + TYPEC_SOURCE :
> + TYPEC_SINK);
> + break;
> + }
> +
> + return 0;
> +}
> +
> +static int cros_typec_dr_swap(struct typec_port *port, enum typec_data_role role)
> +{
> + return cros_typec_perform_role_swap(port, role, USB_PD_CTRL_SWAP_DATA);
> +}
> +
> +static int cros_typec_pr_swap(struct typec_port *port, enum typec_role role)
> +{
> + return cros_typec_perform_role_swap(port, role, USB_PD_CTRL_SWAP_POWER);
> +}
> +
> static const struct typec_operations cros_typec_usb_mode_ops = {
> - .enter_usb_mode = cros_typec_enter_usb_mode
> + .enter_usb_mode = cros_typec_enter_usb_mode,
> + .dr_set = cros_typec_dr_swap,
> + .pr_set = cros_typec_pr_swap
> };
>
> static int cros_typec_parse_port_props(struct typec_capability *cap,
> --
> 2.50.0.727.gbf7dc18ff4-goog
>
Powered by blists - more mailing lists