usb: pd: Add delay before sending Source Capabilities

The PD specification defines tFirstSourceCap as the time before
a source must send its first Source_Capabilities message and
allows this to be up to 250ms. This is advantageous for cases
in which a sink partner is quickly detached (or possibly even
attempting Try.SRC) just after VBUS is turned on and the
unnecessary PD messaging causes the HW to fail to detect the
detach condition right away. Add a delay of 200ms during the
transition from PE_SRC_STARTUP to PE_SRC_SEND_CAPABILITIES.

Change-Id: I13dd31d71b8b93adadb70b113cba28ce5aed6e4e
Signed-off-by: Jack Pham <jackp@codeaurora.org>
This commit is contained in:
Jack Pham 2017-07-06 00:12:15 -07:00
parent 0f6cf457b2
commit ca88ca45eb

View file

@ -182,7 +182,7 @@ static void *usbpd_ipc_log;
#define PS_HARD_RESET_TIME 25
#define PS_SOURCE_ON 400
#define PS_SOURCE_OFF 750
#define SWAP_SOURCE_START_TIME 20
#define FIRST_SOURCE_CAP_TIME 200
#define VDM_BUSY_TIME 50
#define VCONN_ON_TIME 100
@ -790,17 +790,27 @@ static void usbpd_set_state(struct usbpd *pd, enum usbpd_state next_state)
pd->pd_phy_opened = true;
}
pd->current_state = PE_SRC_SEND_CAPABILITIES;
if (pd->in_pr_swap) {
kick_sm(pd, SWAP_SOURCE_START_TIME);
pd->in_pr_swap = false;
val.intval = 0;
power_supply_set_property(pd->usb_psy,
POWER_SUPPLY_PROP_PR_SWAP, &val);
break;
}
/* fall-through */
/*
* A sink might remove its terminations (during some Type-C
* compliance tests or a sink attempting to do Try.SRC)
* at this point just after we enabled VBUS. Sending PD
* messages now would delay detecting the detach beyond the
* required timing. Instead, delay sending out the first
* source capabilities to allow for the other side to
* completely settle CC debounce and allow HW to detect detach
* sooner in the meantime. PD spec allows up to
* tFirstSourceCap (250ms).
*/
pd->current_state = PE_SRC_SEND_CAPABILITIES;
kick_sm(pd, FIRST_SOURCE_CAP_TIME);
break;
case PE_SRC_SEND_CAPABILITIES:
kick_sm(pd, 0);