On Mon, Apr 15, 2019 at 07:53:58PM +0200, Hans de Goede wrote: > Hi Guenter, > > On 15-04-19 17:51, Guenter Roeck wrote: > >On Sat, Apr 13, 2019 at 10:39:53PM +0200, Hans de Goede wrote: > >>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. > >> > > > >Do we indeed need an additional callback for this purpose, or would a single > >"start_connection_detect" call to replace start_drp_toggling be sufficient ? > >If necessary, we could add the port type as argument (if the low level driver > >doesn't already know that). > > A single "start_connection_detect" call to replace start_drp_toggling will be > sufficient AFAICT. > > If you prefer that option, I can rework the patch-set accordingly. > Yes, I do. I find it quite pointless to have two callbacks if exactly one is ever called. Thanks, Guenter > Regards, > > Hans > > > > >>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 > >>