Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1720759 > unrolled thread

[PATCH 06/11 v2] staging: typec: tcpm: Comply with TryWait.SNK State

Started byBadhri Jagan Sridharan <badhri@google.com>
First post2017-08-27 08:50 +0200
Last post2017-08-27 19:30 +0200
Articles 2 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH 06/11 v2] staging: typec: tcpm: Comply with TryWait.SNK State Badhri Jagan Sridharan <badhri@google.com> - 2017-08-27 08:50 +0200
    Re: [PATCH 06/11 v2] staging: typec: tcpm: Comply with TryWait.SNK  State Guenter Roeck <linux@roeck-us.net> - 2017-08-27 19:30 +0200

#1720759 — [PATCH 06/11 v2] staging: typec: tcpm: Comply with TryWait.SNK State

FromBadhri Jagan Sridharan <badhri@google.com>
Date2017-08-27 08:50 +0200
Subject[PATCH 06/11 v2] staging: typec: tcpm: Comply with TryWait.SNK State
Message-ID<uiZyp-40C-7@gated-at.bofh.it>
According to the spec:
"4.5.2.2.10.2 Exiting from TryWait.SNK State
The port shall transition to Attached.SNK after tCCDebounce if or when VBUS
is detected. Note the Source may initiate USB PD communications which will
cause brief periods of the SNK.Open state on both the CC1 and CC2 pins,
but this event will not exceed tPDDebounce. The port shall transition to
Unattached.SNK when the state of both of the CC1 and CC2 pins is SNK.Open
for at least tPDDebounce."

Signed-off-by: Badhri Jagan Sridharan <Badhri@google.com>
---
Changelog since v1:
- Corrected  tag

 drivers/staging/typec/tcpm.c | 58 +++++++++++++++++++++++---------------------
 1 file changed, 30 insertions(+), 28 deletions(-)

diff --git a/drivers/staging/typec/tcpm.c b/drivers/staging/typec/tcpm.c
index fc179bdea7e4..0ae33330a5c7 100644
--- a/drivers/staging/typec/tcpm.c
+++ b/drivers/staging/typec/tcpm.c
@@ -2403,26 +2403,24 @@ static void run_state_machine(struct tcpm_port *port)
 		break;
 	case SNK_TRYWAIT:
 		tcpm_set_cc(port, TYPEC_CC_RD);
-		tcpm_set_state(port, SNK_TRYWAIT_DEBOUNCE, PD_T_CC_DEBOUNCE);
+		tcpm_set_state(port, SNK_TRYWAIT_VBUS, PD_T_CC_DEBOUNCE);
 		break;
-	case SNK_TRYWAIT_DEBOUNCE:
-		if (port->vbus_present) {
+	case SNK_TRYWAIT_VBUS:
+		/*
+		 * TCPM stays in this state indefinitely until VBUS
+		 * is detected as long as Rp is not detected for
+		 * more than a time period of tPDDebounce.
+		 */
+		if (port->vbus_present && tcpm_port_is_sink(port)) {
 			tcpm_set_state(port, SNK_ATTACHED, 0);
 			break;
 		}
-		if (tcpm_port_is_disconnected(port)) {
-			tcpm_set_state(port, SNK_UNATTACHED,
-				       PD_T_PD_DEBOUNCE);
-			break;
-		}
-		if (tcpm_port_is_source(port))
-			tcpm_set_state(port, SRC_ATTACHED, 0);
-		/* XXX Are we supposed to stay in this state ? */
+		if (!tcpm_port_is_sink(port))
+			tcpm_set_state(port, SNK_TRYWAIT_DEBOUNCE, 0);
 		break;
-	case SNK_TRYWAIT_VBUS:
-		tcpm_set_state(port, SNK_ATTACHED, PD_T_CC_DEBOUNCE);
+	case SNK_TRYWAIT_DEBOUNCE:
+		tcpm_set_state(port, SNK_UNATTACHED, PD_T_PD_DEBOUNCE);
 		break;
-
 	case SNK_ATTACHED:
 		ret = tcpm_snk_attach(port);
 		if (ret < 0)
@@ -2960,19 +2958,16 @@ static void _tcpm_cc_change(struct tcpm_port *port, enum typec_cc_status cc1,
 		tcpm_set_state(port, SRC_TRY_WAIT, 0);
 		break;
 	case SNK_TRYWAIT_DEBOUNCE:
-		if (port->vbus_present) {
-			tcpm_set_state(port, SNK_ATTACHED, 0);
-			break;
-		}
-		if (tcpm_port_is_source(port)) {
-			tcpm_set_state(port, SRC_ATTACHED, 0);
-			break;
-		}
-		if (tcpm_port_is_disconnected(port) &&
-		    port->delayed_state != SNK_UNATTACHED)
+		if (tcpm_port_is_sink(port))
+			tcpm_set_state(port, SNK_TRYWAIT_VBUS, 0);
+		break;
+	case SNK_TRYWAIT_VBUS:
+		if (!tcpm_port_is_sink(port))
 			tcpm_set_state(port, SNK_TRYWAIT_DEBOUNCE, 0);
 		break;
-
+	case SNK_TRYWAIT:
+		/* Do nothing, waiting for tCCDebounce */
+		break;
 	case PR_SWAP_SNK_SRC_SINK_OFF:
 	case PR_SWAP_SRC_SNK_TRANSITION_OFF:
 	case PR_SWAP_SRC_SNK_SOURCE_OFF:
@@ -3030,7 +3025,14 @@ static void _tcpm_pd_vbus_on(struct tcpm_port *port)
 		/* Do nothing, waiting for PD_DEBOUNCE to do be done */
 		break;
 	case SNK_TRYWAIT:
-		tcpm_set_state(port, SNK_TRYWAIT_VBUS, 0);
+		/* Do nothing, waiting for tCCDebounce */
+		break;
+	case SNK_TRYWAIT_VBUS:
+		if (tcpm_port_is_sink(port))
+			tcpm_set_state(port, SNK_ATTACHED, 0);
+		break;
+	case SNK_TRYWAIT_DEBOUNCE:
+		/* Do nothing, waiting for Rp */
 		break;
 	case SRC_TRY_WAIT:
 	case SRC_TRY_DEBOUNCE:
@@ -3067,10 +3069,10 @@ static void _tcpm_pd_vbus_off(struct tcpm_port *port)
 	case SNK_TRY_WAIT_DEBOUNCE:
 		/* Do nothing, waiting for PD_DEBOUNCE to do be done */
 		break;
+	case SNK_TRYWAIT:
 	case SNK_TRYWAIT_VBUS:
-		tcpm_set_state(port, SNK_TRYWAIT, 0);
+	case SNK_TRYWAIT_DEBOUNCE:
 		break;
-
 	case SNK_ATTACH_WAIT:
 		tcpm_set_state(port, SNK_UNATTACHED, 0);
 		break;
-- 
2.14.1.342.g6490525c54-goog

[toc] | [next] | [standalone]


#1720893 — Re: [PATCH 06/11 v2] staging: typec: tcpm: Comply with TryWait.SNK State

FromGuenter Roeck <linux@roeck-us.net>
Date2017-08-27 19:30 +0200
SubjectRe: [PATCH 06/11 v2] staging: typec: tcpm: Comply with TryWait.SNK State
Message-ID<uj9xN-2j1-33@gated-at.bofh.it>
In reply to#1720759
On Sat, Aug 26, 2017 at 11:49:21PM -0700, Badhri Jagan Sridharan wrote:
> According to the spec:
> "4.5.2.2.10.2 Exiting from TryWait.SNK State
> The port shall transition to Attached.SNK after tCCDebounce if or when VBUS
> is detected. Note the Source may initiate USB PD communications which will
> cause brief periods of the SNK.Open state on both the CC1 and CC2 pins,
> but this event will not exceed tPDDebounce. The port shall transition to
> Unattached.SNK when the state of both of the CC1 and CC2 pins is SNK.Open
> for at least tPDDebounce."
> 
> Signed-off-by: Badhri Jagan Sridharan <Badhri@google.com>
> ---
> Changelog since v1:
> - Corrected  tag
> 
For v2 up to here:

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

>  drivers/staging/typec/tcpm.c | 58 +++++++++++++++++++++++---------------------
>  1 file changed, 30 insertions(+), 28 deletions(-)
> 
> diff --git a/drivers/staging/typec/tcpm.c b/drivers/staging/typec/tcpm.c
> index fc179bdea7e4..0ae33330a5c7 100644
> --- a/drivers/staging/typec/tcpm.c
> +++ b/drivers/staging/typec/tcpm.c
> @@ -2403,26 +2403,24 @@ static void run_state_machine(struct tcpm_port *port)
>  		break;
>  	case SNK_TRYWAIT:
>  		tcpm_set_cc(port, TYPEC_CC_RD);
> -		tcpm_set_state(port, SNK_TRYWAIT_DEBOUNCE, PD_T_CC_DEBOUNCE);
> +		tcpm_set_state(port, SNK_TRYWAIT_VBUS, PD_T_CC_DEBOUNCE);
>  		break;
> -	case SNK_TRYWAIT_DEBOUNCE:
> -		if (port->vbus_present) {
> +	case SNK_TRYWAIT_VBUS:
> +		/*
> +		 * TCPM stays in this state indefinitely until VBUS
> +		 * is detected as long as Rp is not detected for
> +		 * more than a time period of tPDDebounce.
> +		 */
> +		if (port->vbus_present && tcpm_port_is_sink(port)) {
>  			tcpm_set_state(port, SNK_ATTACHED, 0);
>  			break;
>  		}
> -		if (tcpm_port_is_disconnected(port)) {
> -			tcpm_set_state(port, SNK_UNATTACHED,
> -				       PD_T_PD_DEBOUNCE);
> -			break;
> -		}
> -		if (tcpm_port_is_source(port))
> -			tcpm_set_state(port, SRC_ATTACHED, 0);
> -		/* XXX Are we supposed to stay in this state ? */
> +		if (!tcpm_port_is_sink(port))
> +			tcpm_set_state(port, SNK_TRYWAIT_DEBOUNCE, 0);
>  		break;
> -	case SNK_TRYWAIT_VBUS:
> -		tcpm_set_state(port, SNK_ATTACHED, PD_T_CC_DEBOUNCE);
> +	case SNK_TRYWAIT_DEBOUNCE:
> +		tcpm_set_state(port, SNK_UNATTACHED, PD_T_PD_DEBOUNCE);
>  		break;
> -
>  	case SNK_ATTACHED:
>  		ret = tcpm_snk_attach(port);
>  		if (ret < 0)
> @@ -2960,19 +2958,16 @@ static void _tcpm_cc_change(struct tcpm_port *port, enum typec_cc_status cc1,
>  		tcpm_set_state(port, SRC_TRY_WAIT, 0);
>  		break;
>  	case SNK_TRYWAIT_DEBOUNCE:
> -		if (port->vbus_present) {
> -			tcpm_set_state(port, SNK_ATTACHED, 0);
> -			break;
> -		}
> -		if (tcpm_port_is_source(port)) {
> -			tcpm_set_state(port, SRC_ATTACHED, 0);
> -			break;
> -		}
> -		if (tcpm_port_is_disconnected(port) &&
> -		    port->delayed_state != SNK_UNATTACHED)
> +		if (tcpm_port_is_sink(port))
> +			tcpm_set_state(port, SNK_TRYWAIT_VBUS, 0);
> +		break;
> +	case SNK_TRYWAIT_VBUS:
> +		if (!tcpm_port_is_sink(port))
>  			tcpm_set_state(port, SNK_TRYWAIT_DEBOUNCE, 0);
>  		break;
> -
> +	case SNK_TRYWAIT:
> +		/* Do nothing, waiting for tCCDebounce */
> +		break;
>  	case PR_SWAP_SNK_SRC_SINK_OFF:
>  	case PR_SWAP_SRC_SNK_TRANSITION_OFF:
>  	case PR_SWAP_SRC_SNK_SOURCE_OFF:
> @@ -3030,7 +3025,14 @@ static void _tcpm_pd_vbus_on(struct tcpm_port *port)
>  		/* Do nothing, waiting for PD_DEBOUNCE to do be done */
>  		break;
>  	case SNK_TRYWAIT:
> -		tcpm_set_state(port, SNK_TRYWAIT_VBUS, 0);
> +		/* Do nothing, waiting for tCCDebounce */
> +		break;
> +	case SNK_TRYWAIT_VBUS:
> +		if (tcpm_port_is_sink(port))
> +			tcpm_set_state(port, SNK_ATTACHED, 0);
> +		break;
> +	case SNK_TRYWAIT_DEBOUNCE:
> +		/* Do nothing, waiting for Rp */
>  		break;
>  	case SRC_TRY_WAIT:
>  	case SRC_TRY_DEBOUNCE:
> @@ -3067,10 +3069,10 @@ static void _tcpm_pd_vbus_off(struct tcpm_port *port)
>  	case SNK_TRY_WAIT_DEBOUNCE:
>  		/* Do nothing, waiting for PD_DEBOUNCE to do be done */
>  		break;
> +	case SNK_TRYWAIT:
>  	case SNK_TRYWAIT_VBUS:
> -		tcpm_set_state(port, SNK_TRYWAIT, 0);
> +	case SNK_TRYWAIT_DEBOUNCE:
>  		break;
> -
>  	case SNK_ATTACH_WAIT:
>  		tcpm_set_state(port, SNK_UNATTACHED, 0);
>  		break;
> -- 
> 2.14.1.342.g6490525c54-goog
> 

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web