Some tcpc device-drivers need to explicitly be told to watch for connection events, otherwise the tcpc will not generate any TCPM_CC_EVENTs and devices being plugged into the Type-C port will not be noticed. For dual-role ports tcpm_start_drp_toggling() is used to tell the tcpc to watch for connection events. But for single-role ports we've so far been falling back to just calling tcpm_set_cc(). For some tcpc-s such as the fusb302 this is not enough and no TCPM_CC_EVENT will be generated. This commit adds a new start_srp_connection_detect callback to tcpc_dev and when this is implemented calls this in place of start_drp_toggling for SRP devices. Fixes: ea3b4d5523bc("usb: typec: fusb302: Resolve fixed power role ...") Cc: Adam Thomson <Adam.Thomson.Opensource@xxxxxxxxxxx> Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> --- drivers/usb/typec/tcpm/tcpm.c | 8 ++++++++ include/linux/usb/tcpm.h | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index a2233d72ae7c..1af54af90b50 100644 --- a/drivers/usb/typec/tcpm/tcpm.c +++ b/drivers/usb/typec/tcpm/tcpm.c @@ -2553,6 +2553,14 @@ static bool tcpm_start_drp_toggling(struct tcpm_port *port, return true; } + if (port->tcpc->start_srp_connection_detect && + port->port_type != TYPEC_PORT_DRP) { + tcpm_log_force(port, "Start SRP connection detection"); + ret = port->tcpc->start_srp_connection_detect(port->tcpc, cc); + if (!ret) + return true; + } + return false; } diff --git a/include/linux/usb/tcpm.h b/include/linux/usb/tcpm.h index 0c532ca3f079..bf2bbbf2e2b2 100644 --- a/include/linux/usb/tcpm.h +++ b/include/linux/usb/tcpm.h @@ -125,6 +125,10 @@ struct tcpc_config { * Optional; if supported by hardware, called to start DRP * toggling. DRP toggling is stopped automatically if * a connection is established. + * @start_srp_connection_detect: + * Optional; if supported by hardware, called to start connection + * detection for single role ports. Connection detection is stopped + * automatically if a connection is established. * @try_role: Optional; called to set a preferred role * @pd_transmit:Called to transmit PD message * @mux: Pointer to multiplexer data @@ -149,6 +153,8 @@ struct tcpc_dev { enum typec_role role, enum typec_data_role data); int (*start_drp_toggling)(struct tcpc_dev *dev, enum typec_cc_status cc); + int (*start_srp_connection_detect)(struct tcpc_dev *dev, + enum typec_cc_status cc); int (*try_role)(struct tcpc_dev *dev, int role); int (*pd_transmit)(struct tcpc_dev *dev, enum tcpm_transmit_type type, const struct pd_message *msg); -- 2.21.0