On Thu, Dec 14, 2023 at 11:08:47PM +0000, RD Babiera wrote: > Add cable_comm_capable to tcpci_data for tcpci drivers to indicate that > the port tcpc is capable of communicating to cables over SOP. A > corresponding tcpci callback tcpci_cable_comm_capable returns this value. > The tcpm will primarily use this in later patches to determine if the port > can transmit and receive SOP' messages. > > Maxim based tcpci drivers are capable of SOP' communication, so the > cable_comm_capable flag is set to true. > > Signed-off-by: RD Babiera <rdbabiera@xxxxxxxxxx> Reviewed-by: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx> > --- > Changes since v1: > * Moved tcpm_pd_receive changes to separate patch > --- > drivers/usb/typec/tcpm/tcpci.c | 8 ++++++++ > drivers/usb/typec/tcpm/tcpci_maxim_core.c | 1 + > include/linux/usb/tcpci.h | 3 +++ > include/linux/usb/tcpm.h | 4 ++++ > 4 files changed, 16 insertions(+) > > diff --git a/drivers/usb/typec/tcpm/tcpci.c b/drivers/usb/typec/tcpm/tcpci.c > index 0ee3e6e29bb1..1ededbcecc09 100644 > --- a/drivers/usb/typec/tcpm/tcpci.c > +++ b/drivers/usb/typec/tcpm/tcpci.c > @@ -584,6 +584,13 @@ static int tcpci_pd_transmit(struct tcpc_dev *tcpc, enum tcpm_transmit_type type > return 0; > } > > +static bool tcpci_cable_comm_capable(struct tcpc_dev *tcpc) > +{ > + struct tcpci *tcpci = tcpc_to_tcpci(tcpc); > + > + return tcpci->data->cable_comm_capable; > +} > + > static int tcpci_init(struct tcpc_dev *tcpc) > { > struct tcpci *tcpci = tcpc_to_tcpci(tcpc); > @@ -793,6 +800,7 @@ struct tcpci *tcpci_register_port(struct device *dev, struct tcpci_data *data) > tcpci->tcpc.enable_frs = tcpci_enable_frs; > tcpci->tcpc.frs_sourcing_vbus = tcpci_frs_sourcing_vbus; > tcpci->tcpc.set_partner_usb_comm_capable = tcpci_set_partner_usb_comm_capable; > + tcpci->tcpc.cable_comm_capable = tcpci_cable_comm_capable; > > if (tcpci->data->check_contaminant) > tcpci->tcpc.check_contaminant = tcpci_check_contaminant; > diff --git a/drivers/usb/typec/tcpm/tcpci_maxim_core.c b/drivers/usb/typec/tcpm/tcpci_maxim_core.c > index 7fb966fd639b..7b2d4e6e52a2 100644 > --- a/drivers/usb/typec/tcpm/tcpci_maxim_core.c > +++ b/drivers/usb/typec/tcpm/tcpci_maxim_core.c > @@ -478,6 +478,7 @@ static int max_tcpci_probe(struct i2c_client *client) > chip->data.vbus_vsafe0v = true; > chip->data.set_partner_usb_comm_capable = max_tcpci_set_partner_usb_comm_capable; > chip->data.check_contaminant = max_tcpci_check_contaminant; > + chip->data.cable_comm_capable = true; > > max_tcpci_init_regs(chip); > chip->tcpci = tcpci_register_port(chip->dev, &chip->data); > diff --git a/include/linux/usb/tcpci.h b/include/linux/usb/tcpci.h > index 467e8045e9f8..1d0b849defd0 100644 > --- a/include/linux/usb/tcpci.h > +++ b/include/linux/usb/tcpci.h > @@ -198,12 +198,15 @@ struct tcpci; > * Chip level drivers are expected to check for contaminant and call > * tcpm_clean_port when the port is clean to put the port back into > * toggling state. > + * @cable_comm_capable > + * optional; Set when TCPC can communicate with cable plugs over SOP' > */ > struct tcpci_data { > struct regmap *regmap; > unsigned char TX_BUF_BYTE_x_hidden:1; > unsigned char auto_discharge_disconnect:1; > unsigned char vbus_vsafe0v:1; > + unsigned char cable_comm_capable:1; > > int (*init)(struct tcpci *tcpci, struct tcpci_data *data); > int (*set_vconn)(struct tcpci *tcpci, struct tcpci_data *data, > diff --git a/include/linux/usb/tcpm.h b/include/linux/usb/tcpm.h > index 65fac5e1f317..430fa3ec69bb 100644 > --- a/include/linux/usb/tcpm.h > +++ b/include/linux/usb/tcpm.h > @@ -119,6 +119,9 @@ enum tcpm_transmit_type { > * at the end of the deboumce period or when the port is still > * toggling. Chip level drivers are expected to check for contaminant > * and call tcpm_clean_port when the port is clean. > + * @cable_comm_capable > + * Optional; Returns whether cable communication over SOP' is supported > + * by the tcpc > */ > struct tcpc_dev { > struct fwnode_handle *fwnode; > @@ -154,6 +157,7 @@ struct tcpc_dev { > bool (*is_vbus_vsafe0v)(struct tcpc_dev *dev); > void (*set_partner_usb_comm_capable)(struct tcpc_dev *dev, bool enable); > void (*check_contaminant)(struct tcpc_dev *dev); > + bool (*cable_comm_capable)(struct tcpc_dev *dev); > }; > > struct tcpm_port; > -- > 2.43.0.472.g3155946c3a-goog -- heikki