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