When in single role port mode, we most start single-role toggling to get an interrupt when a device / cable gets plugged into the port. This commit implements the tcpc_dev start_srp_connection_detect callback for this. Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> --- drivers/usb/typec/tcpm/fusb302.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/drivers/usb/typec/tcpm/fusb302.c b/drivers/usb/typec/tcpm/fusb302.c index 6ea6199caafa..30413a45104f 100644 --- a/drivers/usb/typec/tcpm/fusb302.c +++ b/drivers/usb/typec/tcpm/fusb302.c @@ -876,6 +876,34 @@ static int tcpm_set_roles(struct tcpc_dev *dev, bool attached, return ret; } +static int tcpm_start_srp_connection_detect(struct tcpc_dev *dev, + enum typec_cc_status cc) +{ + struct fusb302_chip *chip = container_of(dev, struct fusb302_chip, + tcpc_dev); + int ret = 0; + + mutex_lock(&chip->lock); + ret = fusb302_set_src_current(chip, cc_src_current[cc]); + if (ret < 0) { + fusb302_log(chip, "unable to set src current %s, ret=%d", + typec_cc_status_name[cc], ret); + goto done; + } + ret = fusb302_set_toggling(chip, (cc == TYPEC_CC_RD) ? + TOGGLING_MODE_SNK : TOGGLING_MODE_SRC); + if (ret < 0) { + fusb302_log(chip, + "unable to start srp toggling, ret=%d", ret); + goto done; + } + fusb302_log(chip, "start srp toggling"); +done: + mutex_unlock(&chip->lock); + + return ret; +} + static int tcpm_start_drp_toggling(struct tcpc_dev *dev, enum typec_cc_status cc) { @@ -1095,6 +1123,8 @@ static void init_tcpc_dev(struct tcpc_dev *fusb302_tcpc_dev) fusb302_tcpc_dev->set_pd_rx = tcpm_set_pd_rx; fusb302_tcpc_dev->set_roles = tcpm_set_roles; fusb302_tcpc_dev->start_drp_toggling = tcpm_start_drp_toggling; + fusb302_tcpc_dev->start_srp_connection_detect = + tcpm_start_srp_connection_detect; fusb302_tcpc_dev->pd_transmit = tcpm_pd_transmit; } -- 2.21.0