From: Benson Leung <bleung@google.com>
To: Jameson Thies <jthies@google.com>
Cc: heikki.krogerus@linux.intel.com, linux-usb@vger.kernel.org,
pmalani@chromium.org, abhishekpandit@chromium.org,
andersson@kernel.org, dmitry.baryshkov@linaro.org,
fabrice.gasnier@foss.st.com, gregkh@linuxfoundation.org,
hdegoede@redhat.com, neil.armstrong@linaro.org,
rajaram.regupathy@intel.com, saranya.gopal@intel.com,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/4] usb: typec: ucsi: Register cables based on GET_CABLE_PROPERTY
Date: Fri, 23 Feb 2024 01:29:10 +0000 [thread overview]
Message-ID: <Zdf05szkJe7R9aq2@google.com> (raw)
In-Reply-To: <20240223010328.2826774-3-jthies@google.com>
[-- Attachment #1: Type: text/plain, Size: 5627 bytes --]
Hi Jameson,
On Fri, Feb 23, 2024 at 01:03:26AM +0000, Jameson Thies wrote:
> Register cables with the Type-C Connector Class in the UCSI driver based
> on the PPM response to GET_CABLE_PROPERTY. Registered cable properties
> include plug type, cable type and major revision.
>
> Signed-off-by: Jameson Thies <jthies@google.com>
Reviewed-by: Benson Leung <bleung@chromium.org>
> ---
> Tested on v6.6 kernel. Expected cable properties populate the USB Type-C
> connector class sysfs paths:
> redrix-rev3 /sys/class/typec # ls port2-cable
> device identity plug_type port2-plug0 power subsystem type uevent
> usb_power_delivery_revision
>
> drivers/usb/typec/ucsi/ucsi.c | 69 +++++++++++++++++++++++++++++++++++
> drivers/usb/typec/ucsi/ucsi.h | 5 +++
> 2 files changed, 74 insertions(+)
>
> diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
> index ae105383e69e..15e82f5fab37 100644
> --- a/drivers/usb/typec/ucsi/ucsi.c
> +++ b/drivers/usb/typec/ucsi/ucsi.c
> @@ -734,6 +734,50 @@ static void ucsi_unregister_partner_pdos(struct ucsi_connector *con)
> con->partner_pd = NULL;
> }
>
> +static int ucsi_register_cable(struct ucsi_connector *con)
> +{
> + struct typec_cable *cable;
> + struct typec_cable_desc desc = {};
> +
> + switch (UCSI_CABLE_PROP_FLAG_PLUG_TYPE(con->cable_prop.flags)) {
> + case UCSI_CABLE_PROPERTY_PLUG_TYPE_A:
> + desc.type = USB_PLUG_TYPE_A;
> + break;
> + case UCSI_CABLE_PROPERTY_PLUG_TYPE_B:
> + desc.type = USB_PLUG_TYPE_B;
> + break;
> + case UCSI_CABLE_PROPERTY_PLUG_TYPE_C:
> + desc.type = USB_PLUG_TYPE_C;
> + break;
> + default:
> + desc.type = USB_PLUG_NONE;
> + break;
> + }
> +
> + 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);
> +
> + cable = typec_register_cable(con->port, &desc);
> + if (IS_ERR(cable)) {
> + dev_err(con->ucsi->dev,
> + "con%d: failed to register cable (%ld)\n", con->num,
> + PTR_ERR(cable));
> + return PTR_ERR(cable);
> + }
> +
> + con->cable = cable;
> + return 0;
> +}
> +
> +static void ucsi_unregister_cable(struct ucsi_connector *con)
> +{
> + if (!con->cable)
> + return;
> +
> + typec_unregister_cable(con->cable);
> + con->cable = NULL;
> +}
> +
> static void ucsi_pwr_opmode_change(struct ucsi_connector *con)
> {
> switch (UCSI_CONSTAT_PWR_OPMODE(con->status.flags)) {
> @@ -807,6 +851,7 @@ static void ucsi_unregister_partner(struct ucsi_connector *con)
> typec_partner_set_usb_power_delivery(con->partner, NULL);
> ucsi_unregister_partner_pdos(con);
> ucsi_unregister_altmodes(con, UCSI_RECIPIENT_SOP);
> + ucsi_unregister_cable(con);
> typec_unregister_partner(con->partner);
> con->partner = NULL;
> }
> @@ -907,6 +952,28 @@ static int ucsi_check_connection(struct ucsi_connector *con)
> return 0;
> }
>
> +static int ucsi_check_cable(struct ucsi_connector *con)
> +{
> + u64 command;
> + int ret;
> +
> + 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;
> +
> + return 0;
> +}
> +
> static void ucsi_handle_connector_change(struct work_struct *work)
> {
> struct ucsi_connector *con = container_of(work, struct ucsi_connector,
> @@ -948,6 +1015,7 @@ static void ucsi_handle_connector_change(struct work_struct *work)
> ucsi_register_partner(con);
> ucsi_partner_task(con, ucsi_check_connection, 1, HZ);
> ucsi_partner_task(con, ucsi_check_connector_capability, 1, HZ);
> + ucsi_partner_task(con, ucsi_check_cable, 1, HZ);
>
> if (UCSI_CONSTAT_PWR_OPMODE(con->status.flags) ==
> UCSI_CONSTAT_PWR_OPMODE_PD)
> @@ -1346,6 +1414,7 @@ static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con)
> ucsi_register_partner(con);
> ucsi_pwr_opmode_change(con);
> ucsi_port_psy_changed(con);
> + ucsi_check_cable(con);
> }
>
> /* Only notify USB controller if partner supports USB data */
> diff --git a/drivers/usb/typec/ucsi/ucsi.h b/drivers/usb/typec/ucsi/ucsi.h
> index 469a2baf472e..f0aabef0b7c6 100644
> --- a/drivers/usb/typec/ucsi/ucsi.h
> +++ b/drivers/usb/typec/ucsi/ucsi.h
> @@ -265,6 +265,9 @@ struct ucsi_cable_property {
> #define UCSI_CABLE_PROPERTY_PLUG_TYPE_C 2
> #define UCSI_CABLE_PROPERTY_PLUG_OTHER 3
> #define UCSI_CABLE_PROP_FLAG_MODE_SUPPORT BIT(5)
> +#define UCSI_CABLE_PROP_FLAG_PD_MAJOR_REV(_f_) (((_f_) & GENMASK(7, 6)) >> 6)
> +#define UCSI_CABLE_PROP_FLAG_PD_MAJOR_REV_AS_BCD(_f_) \
> + UCSI_SPEC_REVISION_TO_BCD(UCSI_CABLE_PROP_FLAG_PD_MAJOR_REV(_f_))
> u8 latency;
> } __packed;
>
> @@ -400,6 +403,7 @@ struct ucsi_connector {
>
> struct typec_port *port;
> struct typec_partner *partner;
> + struct typec_cable *cable;
>
> struct typec_altmode *port_altmode[UCSI_MAX_ALTMODES];
> struct typec_altmode *partner_altmode[UCSI_MAX_ALTMODES];
> @@ -408,6 +412,7 @@ 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;
> --
> 2.44.0.rc0.258.g7320e95886-goog
>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
next prev parent reply other threads:[~2024-02-23 1:29 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-23 1:03 [PATCH 0/4] usb: typec: ucsi: Expand SOP/SOP' Discovery Jameson Thies
2024-02-23 1:03 ` [PATCH 1/4] usb: typec: ucsi: Clean up UCSI_CABLE_PROP macros Jameson Thies
2024-02-23 1:24 ` Benson Leung
2024-02-23 1:43 ` Prashant Malani
2024-02-23 5:37 ` Dmitry Baryshkov
2024-02-26 8:48 ` Heikki Krogerus
2024-02-27 0:29 ` Jameson Thies
2024-02-23 1:03 ` [PATCH 2/4] usb: typec: ucsi: Register cables based on GET_CABLE_PROPERTY Jameson Thies
2024-02-23 1:29 ` Benson Leung [this message]
2024-02-23 1:45 ` Prashant Malani
2024-02-23 5:42 ` Dmitry Baryshkov
2024-02-26 9:05 ` Heikki Krogerus
2024-02-23 1:03 ` [PATCH 3/4] usb: typec: ucsi: Register SOP/SOP' Discover Identity Responses Jameson Thies
2024-02-23 1:34 ` Benson Leung
2024-02-23 5:52 ` Dmitry Baryshkov
2024-02-26 9:06 ` Heikki Krogerus
2024-02-26 18:02 ` Prashant Malani
2024-02-27 0:38 ` Jameson Thies
2024-02-23 1:03 ` [PATCH 4/4] usb: typec: ucsi: Register SOP' alternate modes with cable plug Jameson Thies
2024-02-23 1:47 ` Benson Leung
2024-02-23 18:40 ` Prashant Malani
2024-02-26 9:07 ` Heikki Krogerus
2024-02-27 0:44 ` Jameson Thies
2024-02-23 5:34 ` [PATCH 0/4] usb: typec: ucsi: Expand SOP/SOP' Discovery Dmitry Baryshkov
2024-02-27 0:28 ` Jameson Thies
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Zdf05szkJe7R9aq2@google.com \
--to=bleung@google.com \
--cc=abhishekpandit@chromium.org \
--cc=andersson@kernel.org \
--cc=dmitry.baryshkov@linaro.org \
--cc=fabrice.gasnier@foss.st.com \
--cc=gregkh@linuxfoundation.org \
--cc=hdegoede@redhat.com \
--cc=heikki.krogerus@linux.intel.com \
--cc=jthies@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=neil.armstrong@linaro.org \
--cc=pmalani@chromium.org \
--cc=rajaram.regupathy@intel.com \
--cc=saranya.gopal@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.