mbox series

[v1,0/6] Fixes for tcpm-source-psy- and pSnkStby

Message ID 20210406013643.3280369-1-badhri@google.com
Headers show
Series Fixes for tcpm-source-psy- and pSnkStby | expand

Message

Badhri Jagan Sridharan April 6, 2021, 1:36 a.m. UTC
Hi,

(1) and (2) in the series addresses the problem that Adam Thomson
had pointed out in:
https://lore.kernel.org/linux-usb/PR3PR10MB4142450638A8E07A33E475B080689@PR3PR10MB4142.EURPRD10.PROD.OUTLOOK.COM/

(3) updates the power_supply_changed based on changes
made through (1) and (2)

(4) (5) (6) makes TCPM comply pSnkStby requirement for both fast
and slow charging loops. This was also previously sent as part
of https://lore.kernel.org/patchwork/patch/1283928/

Since the patches were dependent on each other sending them this
way.

Badhri Jagan Sridharan (6):
  usb: typec: tcpm: Address incorrect values of tcpm psy for fixed
    supply
  usb: typec: tcpm: Address incorrect values of tcpm psy for pps supply
  usb: typec: tcpm: update power supply once partner accepts
  usb: typec: tcpm: Honour pSnkStdby requirement during negotiation
  usb: typec: tcpm: Allow slow charging loops to comply to pSnkStby
  Documentation: connector: Add slow-charger-loop definition

 .../bindings/connector/usb-connector.yaml     |   7 +
 drivers/usb/typec/tcpm/tcpm.c                 | 136 ++++++++++++------
 include/linux/usb/pd.h                        |   2 +
 3 files changed, 99 insertions(+), 46 deletions(-)

Comments

Guenter Roeck April 6, 2021, 1:56 a.m. UTC | #1
On 4/5/21 6:36 PM, Badhri Jagan Sridharan wrote:
> tcpm_pd_build_request overwrites current_limit and supply_voltage
> even before port partner accepts the requests. This leaves stale
> values in current_limit and supply_voltage that get exported by
> "tcpm-source-psy-". Solving this problem by caching the request
> values of current limit/supply voltage in req_current_limit
> and req_supply_voltage. current_limit/supply_voltage gets updated
> once the port partner accepts the request.
> 
> Fixes: f2a8aa053c176 ("typec: tcpm: Represent source supply through power_supply")
> Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>
> ---
>  drivers/usb/typec/tcpm/tcpm.c | 17 ++++++++++-------
>  1 file changed, 10 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
> index ca1fc77697fc..03eca5061132 100644
> --- a/drivers/usb/typec/tcpm/tcpm.c
> +++ b/drivers/usb/typec/tcpm/tcpm.c
> @@ -389,7 +389,10 @@ struct tcpm_port {
>  	unsigned int operating_snk_mw;
>  	bool update_sink_caps;
>  
> -	/* Requested current / voltage */
> +	/* Requested current / voltage to the port partner */
> +	u32 req_current_limit;
> +	u32 req_supply_voltage;
> +	/* Acutal current / voltage limit of the local port */

Actual

Otherwise makes sense.

Reviewed-by: Guenter Roeck <linux@roeck-us.net>

>  	u32 current_limit;
>  	u32 supply_voltage;
>  
> @@ -2435,8 +2438,8 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
>  		case SNK_TRANSITION_SINK:
>  			if (port->vbus_present) {
>  				tcpm_set_current_limit(port,
> -						       port->current_limit,
> -						       port->supply_voltage);
> +						       port->req_current_limit,
> +						       port->req_supply_voltage);
>  				port->explicit_contract = true;
>  				tcpm_set_auto_vbus_discharge_threshold(port,
>  								       TYPEC_PWR_MODE_PD,
> @@ -2545,8 +2548,8 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
>  			break;
>  		case SNK_NEGOTIATE_PPS_CAPABILITIES:
>  			port->pps_data.active = true;
> -			port->supply_voltage = port->pps_data.out_volt;
> -			port->current_limit = port->pps_data.op_curr;
> +			port->req_supply_voltage = port->pps_data.out_volt;
> +			port->req_current_limit = port->pps_data.op_curr;
>  			tcpm_set_state(port, SNK_TRANSITION_SINK, 0);
>  			break;
>  		case SOFT_RESET_SEND:
> @@ -3195,8 +3198,8 @@ static int tcpm_pd_build_request(struct tcpm_port *port, u32 *rdo)
>  			 flags & RDO_CAP_MISMATCH ? " [mismatch]" : "");
>  	}
>  
> -	port->current_limit = ma;
> -	port->supply_voltage = mv;
> +	port->req_current_limit = ma;
> +	port->req_supply_voltage = mv;
>  
>  	return 0;
>  }
>
Adam Thomson April 7, 2021, 4:04 p.m. UTC | #2
On 06 April 2021 02:37, Badhri Jagan Sridharan wrote:

> tcpm_pd_build_request overwrites current_limit and supply_voltage

> even before port partner accepts the requests. This leaves stale

> values in current_limit and supply_voltage that get exported by

> "tcpm-source-psy-". Solving this problem by caching the request

> values of current limit/supply voltage in req_current_limit

> and req_supply_voltage. current_limit/supply_voltage gets updated

> once the port partner accepts the request.

> 

> Fixes: f2a8aa053c176 ("typec: tcpm: Represent source supply through

> power_supply")

> Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>

> ---


Looks sensible, typo aside:

Reviewed-by: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>


>  drivers/usb/typec/tcpm/tcpm.c | 17 ++++++++++-------

>  1 file changed, 10 insertions(+), 7 deletions(-)

> 

> diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c

> index ca1fc77697fc..03eca5061132 100644

> --- a/drivers/usb/typec/tcpm/tcpm.c

> +++ b/drivers/usb/typec/tcpm/tcpm.c

> @@ -389,7 +389,10 @@ struct tcpm_port {

>  	unsigned int operating_snk_mw;

>  	bool update_sink_caps;

> 

> -	/* Requested current / voltage */

> +	/* Requested current / voltage to the port partner */

> +	u32 req_current_limit;

> +	u32 req_supply_voltage;

> +	/* Acutal current / voltage limit of the local port */

>  	u32 current_limit;

>  	u32 supply_voltage;

> 

> @@ -2435,8 +2438,8 @@ static void tcpm_pd_ctrl_request(struct tcpm_port

> *port,

>  		case SNK_TRANSITION_SINK:

>  			if (port->vbus_present) {

>  				tcpm_set_current_limit(port,

> -						       port->current_limit,

> -						       port->supply_voltage);

> +						       port->req_current_limit,

> +						       port->req_supply_voltage);

>  				port->explicit_contract = true;

>  				tcpm_set_auto_vbus_discharge_threshold(port,

> 

> TYPEC_PWR_MODE_PD,

> @@ -2545,8 +2548,8 @@ static void tcpm_pd_ctrl_request(struct tcpm_port

> *port,

>  			break;

>  		case SNK_NEGOTIATE_PPS_CAPABILITIES:

>  			port->pps_data.active = true;

> -			port->supply_voltage = port->pps_data.out_volt;

> -			port->current_limit = port->pps_data.op_curr;

> +			port->req_supply_voltage = port->pps_data.out_volt;

> +			port->req_current_limit = port->pps_data.op_curr;

>  			tcpm_set_state(port, SNK_TRANSITION_SINK, 0);

>  			break;

>  		case SOFT_RESET_SEND:

> @@ -3195,8 +3198,8 @@ static int tcpm_pd_build_request(struct tcpm_port

> *port, u32 *rdo)

>  			 flags & RDO_CAP_MISMATCH ? " [mismatch]" : "");

>  	}

> 

> -	port->current_limit = ma;

> -	port->supply_voltage = mv;

> +	port->req_current_limit = ma;

> +	port->req_supply_voltage = mv;

> 

>  	return 0;

>  }

> --

> 2.31.0.208.g409f899ff0-goog
Adam Thomson April 7, 2021, 4:08 p.m. UTC | #3
On 06 April 2021 02:37, Badhri Jagan Sridharan wrote:

> power_supply_changed needs to be called to notify clients

> after the partner accepts the requested values for the pps

> case.

> 

> Fixes: f2a8aa053c176 ("typec: tcpm: Represent source supply through

> power_supply")

> Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>

> ---


Missing commit information aside:

Reviewed-by: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>


>  drivers/usb/typec/tcpm/tcpm.c | 4 +---

>  1 file changed, 1 insertion(+), 3 deletions(-)

> 

> diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c

> index d43774cc2ccf..7708b01009cb 100644

> --- a/drivers/usb/typec/tcpm/tcpm.c

> +++ b/drivers/usb/typec/tcpm/tcpm.c

> @@ -2564,6 +2564,7 @@ static void tcpm_pd_ctrl_request(struct tcpm_port

> *port,

>  			port->pps_data.max_curr = port-

> >pps_data.req_max_curr;

>  			port->req_supply_voltage = port-

> >pps_data.req_out_volt;

>  			port->req_current_limit = port->pps_data.req_op_curr;

> +			power_supply_changed(port->psy);

>  			tcpm_set_state(port, SNK_TRANSITION_SINK, 0);

>  			break;

>  		case SOFT_RESET_SEND:

> @@ -3132,7 +3133,6 @@ static unsigned int tcpm_pd_select_pps_apdo(struct

> tcpm_port *port)

>  						      port-

> >pps_data.req_out_volt));

>  		port->pps_data.req_op_curr = min(port->pps_data.max_curr,

>  						 port->pps_data.req_op_curr);

> -		power_supply_changed(port->psy);

>  	}

> 

>  	return src_pdo;

> @@ -3557,8 +3557,6 @@ static void tcpm_reset_port(struct tcpm_port *port)

>  	port->sink_cap_done = false;

>  	if (port->tcpc->enable_frs)

>  		port->tcpc->enable_frs(port->tcpc, false);

> -

> -	power_supply_changed(port->psy);

>  }

> 

>  static void tcpm_detach(struct tcpm_port *port)

> --

> 2.31.0.208.g409f899ff0-goog
Badhri Jagan Sridharan April 7, 2021, 8:11 p.m. UTC | #4
>> The reason for this change is missing in the patch description,
>> or am I missing something ?

Ah yes forgot to state this in the commit description which I have
updated in V2.
Removed a redundant power_supply_changed as one was already made a
couple of lines before this one.

Thanks,
Badhri

On Wed, Apr 7, 2021 at 9:08 AM Adam Thomson
<Adam.Thomson.Opensource@diasemi.com> wrote:
>
> On 06 April 2021 02:37, Badhri Jagan Sridharan wrote:
>
> > power_supply_changed needs to be called to notify clients
> > after the partner accepts the requested values for the pps
> > case.
> >
> > Fixes: f2a8aa053c176 ("typec: tcpm: Represent source supply through
> > power_supply")
> > Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>
> > ---
>
> Missing commit information aside:
>
> Reviewed-by: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>
>
> >  drivers/usb/typec/tcpm/tcpm.c | 4 +---
> >  1 file changed, 1 insertion(+), 3 deletions(-)
> >
> > diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
> > index d43774cc2ccf..7708b01009cb 100644
> > --- a/drivers/usb/typec/tcpm/tcpm.c
> > +++ b/drivers/usb/typec/tcpm/tcpm.c
> > @@ -2564,6 +2564,7 @@ static void tcpm_pd_ctrl_request(struct tcpm_port
> > *port,
> >                       port->pps_data.max_curr = port-
> > >pps_data.req_max_curr;
> >                       port->req_supply_voltage = port-
> > >pps_data.req_out_volt;
> >                       port->req_current_limit = port->pps_data.req_op_curr;
> > +                     power_supply_changed(port->psy);
> >                       tcpm_set_state(port, SNK_TRANSITION_SINK, 0);
> >                       break;
> >               case SOFT_RESET_SEND:
> > @@ -3132,7 +3133,6 @@ static unsigned int tcpm_pd_select_pps_apdo(struct
> > tcpm_port *port)
> >                                                     port-
> > >pps_data.req_out_volt));
> >               port->pps_data.req_op_curr = min(port->pps_data.max_curr,
> >                                                port->pps_data.req_op_curr);
> > -             power_supply_changed(port->psy);
> >       }
> >
> >       return src_pdo;
> > @@ -3557,8 +3557,6 @@ static void tcpm_reset_port(struct tcpm_port *port)
> >       port->sink_cap_done = false;
> >       if (port->tcpc->enable_frs)
> >               port->tcpc->enable_frs(port->tcpc, false);
> > -
> > -     power_supply_changed(port->psy);
> >  }
> >
> >  static void tcpm_detach(struct tcpm_port *port)
> > --
> > 2.31.0.208.g409f899ff0-goog
>
Badhri Jagan Sridharan April 7, 2021, 8:13 p.m. UTC | #5
Hi Guenter and Adam,

Thanks for the reviews !
Fixed up the typo in V2.

Thanks,
Badhri

On Wed, Apr 7, 2021 at 9:04 AM Adam Thomson
<Adam.Thomson.Opensource@diasemi.com> wrote:
>

> On 06 April 2021 02:37, Badhri Jagan Sridharan wrote:

>

> > tcpm_pd_build_request overwrites current_limit and supply_voltage

> > even before port partner accepts the requests. This leaves stale

> > values in current_limit and supply_voltage that get exported by

> > "tcpm-source-psy-". Solving this problem by caching the request

> > values of current limit/supply voltage in req_current_limit

> > and req_supply_voltage. current_limit/supply_voltage gets updated

> > once the port partner accepts the request.

> >

> > Fixes: f2a8aa053c176 ("typec: tcpm: Represent source supply through

> > power_supply")

> > Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>

> > ---

>

> Looks sensible, typo aside:

>

> Reviewed-by: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>

>

> >  drivers/usb/typec/tcpm/tcpm.c | 17 ++++++++++-------

> >  1 file changed, 10 insertions(+), 7 deletions(-)

> >

> > diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c

> > index ca1fc77697fc..03eca5061132 100644

> > --- a/drivers/usb/typec/tcpm/tcpm.c

> > +++ b/drivers/usb/typec/tcpm/tcpm.c

> > @@ -389,7 +389,10 @@ struct tcpm_port {

> >       unsigned int operating_snk_mw;

> >       bool update_sink_caps;

> >

> > -     /* Requested current / voltage */

> > +     /* Requested current / voltage to the port partner */

> > +     u32 req_current_limit;

> > +     u32 req_supply_voltage;

> > +     /* Acutal current / voltage limit of the local port */

> >       u32 current_limit;

> >       u32 supply_voltage;

> >

> > @@ -2435,8 +2438,8 @@ static void tcpm_pd_ctrl_request(struct tcpm_port

> > *port,

> >               case SNK_TRANSITION_SINK:

> >                       if (port->vbus_present) {

> >                               tcpm_set_current_limit(port,

> > -                                                    port->current_limit,

> > -                                                    port->supply_voltage);

> > +                                                    port->req_current_limit,

> > +                                                    port->req_supply_voltage);

> >                               port->explicit_contract = true;

> >                               tcpm_set_auto_vbus_discharge_threshold(port,

> >

> > TYPEC_PWR_MODE_PD,

> > @@ -2545,8 +2548,8 @@ static void tcpm_pd_ctrl_request(struct tcpm_port

> > *port,

> >                       break;

> >               case SNK_NEGOTIATE_PPS_CAPABILITIES:

> >                       port->pps_data.active = true;

> > -                     port->supply_voltage = port->pps_data.out_volt;

> > -                     port->current_limit = port->pps_data.op_curr;

> > +                     port->req_supply_voltage = port->pps_data.out_volt;

> > +                     port->req_current_limit = port->pps_data.op_curr;

> >                       tcpm_set_state(port, SNK_TRANSITION_SINK, 0);

> >                       break;

> >               case SOFT_RESET_SEND:

> > @@ -3195,8 +3198,8 @@ static int tcpm_pd_build_request(struct tcpm_port

> > *port, u32 *rdo)

> >                        flags & RDO_CAP_MISMATCH ? " [mismatch]" : "");

> >       }

> >

> > -     port->current_limit = ma;

> > -     port->supply_voltage = mv;

> > +     port->req_current_limit = ma;

> > +     port->req_supply_voltage = mv;

> >

> >       return 0;

> >  }

> > --

> > 2.31.0.208.g409f899ff0-goog

>