Re: [PATCH v2 1/5] usb: typec: ucsi: add callback for connector status updates

From: Heikki Krogerus
Date: Mon Apr 15 2024 - 02:57:57 EST


On Thu, Apr 11, 2024 at 07:49:53AM +0300, Dmitry Baryshkov wrote:
> Allow UCSI glue driver to perform addtional work to update connector
> status. For example, it might check the cable orientation. This call is
> performed after reading new connector statatus, so the platform driver
> can peek at new connection status bits.
>
> The callback is called both when registering the port and when the
> connector change event is being handled.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@xxxxxxxxxx>

Reviewed-by: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx>

> ---
> drivers/usb/typec/ucsi/ucsi.c | 6 ++++++
> drivers/usb/typec/ucsi/ucsi.h | 3 +++
> 2 files changed, 9 insertions(+)
>
> diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
> index 3106e69050cd..7ad544c968e4 100644
> --- a/drivers/usb/typec/ucsi/ucsi.c
> +++ b/drivers/usb/typec/ucsi/ucsi.c
> @@ -1199,6 +1199,9 @@ static void ucsi_handle_connector_change(struct work_struct *work)
>
> trace_ucsi_connector_change(con->num, &con->status);
>
> + if (ucsi->ops->connector_status)
> + ucsi->ops->connector_status(con);
> +
> role = !!(con->status.flags & UCSI_CONSTAT_PWR_DIR);
>
> if (con->status.change & UCSI_CONSTAT_POWER_DIR_CHANGE) {
> @@ -1588,6 +1591,9 @@ static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con)
> }
> ret = 0; /* ucsi_send_command() returns length on success */
>
> + if (ucsi->ops->connector_status)
> + ucsi->ops->connector_status(con);
> +
> switch (UCSI_CONSTAT_PARTNER_TYPE(con->status.flags)) {
> case UCSI_CONSTAT_PARTNER_TYPE_UFP:
> case UCSI_CONSTAT_PARTNER_TYPE_CABLE_AND_UFP:
> diff --git a/drivers/usb/typec/ucsi/ucsi.h b/drivers/usb/typec/ucsi/ucsi.h
> index 2caf2969668c..3e1241e38f3c 100644
> --- a/drivers/usb/typec/ucsi/ucsi.h
> +++ b/drivers/usb/typec/ucsi/ucsi.h
> @@ -16,6 +16,7 @@
>
> struct ucsi;
> struct ucsi_altmode;
> +struct ucsi_connector;
> struct dentry;
>
> /* UCSI offsets (Bytes) */
> @@ -59,6 +60,7 @@ struct dentry;
> * @sync_write: Blocking write operation
> * @async_write: Non-blocking write operation
> * @update_altmodes: Squashes duplicate DP altmodes
> + * @connector_status: Updates connector status, called holding connector lock
> *
> * Read and write routines for UCSI interface. @sync_write must wait for the
> * Command Completion Event from the PPM before returning, and @async_write must
> @@ -73,6 +75,7 @@ struct ucsi_operations {
> const void *val, size_t val_len);
> bool (*update_altmodes)(struct ucsi *ucsi, struct ucsi_altmode *orig,
> struct ucsi_altmode *updated);
> + void (*connector_status)(struct ucsi_connector *con);
> };
>
> struct ucsi *ucsi_create(struct device *dev, const struct ucsi_operations *ops);
>
> --
> 2.39.2

--
heikki