RE: [PATCH 1/3] usb: typec: tcpm: Add start_srp_connection_detect callback

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 15 April 2019 11:38, Hans de Goede wrote:

> On 15-04-19 12:31, Adam Thomson wrote:
> > On 13 April 2019 21:40, 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.
> >>
> >> 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;
> >> +	}
> >> +
> >
> > Is it a little misleading when reading the state machine code that
> > we're calling
> > tcpm_start_drp_toggling() to actually start SRP detection? Maybe we
> > could rename this function and the associated state to cover both SRP
> > and DRP, or alternatively add a new state for SRP_DETECTION, just to
> > keep logging and code readability clear and then move the above code
> > to a different function just for SRP?
> 
> I'm not in fan of adding a separate state for this. Even though connection
> detection is not really toggling, I've considered changing tcpm_start_drp_toggling
> to tcpm_start_toggling and rename the state to match.
> I think that if we want to drop drp/DRP from the names, that using
> tcpm_start_toggling / TOGGLING is the best solution.
> 
> Also note that on the fusb302, which is the tcpc which needs SRP connection
> detection, this is done using the toggling engine. So just changing the names from
> drp-toggling to toggling seems best.

Yep, that's fine with me. Thanks for the efforts on this.

> 
> Regards,
> 
> Hans
> 
> 
> 
> >
> > Functionally though, the change makes sense to me.
> >
> >>   	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




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux