diff options
author | Todd Broch <tbroch@chromium.org> | 2014-12-19 10:35:45 -0800 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2015-01-08 21:03:33 +0000 |
commit | d63c3b4f92a578212977bfe537f9d15f6f84be72 (patch) | |
tree | 65d80ecbe31f03e9aff1ad7ffc8e164048f6f82a | |
parent | fdb504e24a7f52528d0ca05549a7ed0be0fd5713 (diff) | |
download | chrome-ec-d63c3b4f92a578212977bfe537f9d15f6f84be72.tar.gz |
pd: Refactor exit mode.
Refactor pd_exit_mode to be only a DFP function. Additionally make
pe_init a public function and call it during hard reset.
Signed-off-by: Todd Broch <tbroch@chromium.org>
BRANCH=samus
BUG=chrome-os-partner:33946
TEST=manual, using pdsetmode from later patches see proper exit and
resetting of pe struct.
Change-Id: I45afe1f82926f1c32f4d84eb60c65f1f39b19d81
Reviewed-on: https://chromium-review.googlesource.com/236958
Reviewed-by: Alec Berg <alecaberg@chromium.org>
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Commit-Queue: Todd Broch <tbroch@chromium.org>
Tested-by: Todd Broch <tbroch@chromium.org>
-rw-r--r-- | common/usb_pd_policy.c | 34 | ||||
-rw-r--r-- | common/usb_pd_protocol.c | 9 | ||||
-rw-r--r-- | include/usb_pd.h | 14 |
3 files changed, 33 insertions, 24 deletions
diff --git a/common/usb_pd_policy.c b/common/usb_pd_policy.c index 81a8ab7c85..b9ac431d58 100644 --- a/common/usb_pd_policy.c +++ b/common/usb_pd_policy.c @@ -175,7 +175,7 @@ static struct pd_policy pe[PD_PORT_COUNT]; #define AMODE_VALID(port) (pe[port].amode.index != -1) -static void pe_init(int port) +void pd_dfp_pe_init(int port) { memset(&pe[port], 0, sizeof(struct pd_policy)); pe[port].amode.index = -1; @@ -184,7 +184,7 @@ static void pe_init(int port) static void dfp_consume_identity(int port, uint32_t *payload) { int ptype = PD_IDH_PTYPE(payload[VDO_I(IDH)]); - pe_init(port); + pd_dfp_pe_init(port); memcpy(&pe[port].identity, payload + 1, sizeof(pe[port].identity)); switch (ptype) { case IDH_PTYPE_AMA: @@ -318,7 +318,7 @@ static void dfp_consume_attention(int port, uint32_t *payload) pe[port].amode.fx->attention(port, payload); } -int pd_exit_mode(int port, uint32_t *payload) +uint32_t pd_dfp_exit_mode(int port) { struct svdm_amode_data *modep = &pe[port].amode; if (!modep->fx) @@ -326,11 +326,19 @@ int pd_exit_mode(int port, uint32_t *payload) modep->fx->exit(port); - if (payload) - payload[0] = VDO(modep->fx->svid, 1, - CMD_EXIT_MODE | VDO_OPOS(pd_alt_mode(port))); - modep->index = -1; - return 1; + /* + * TODO(crosbug.com/p/33946) : below needs revisited to allow multiple + * mode entry. Additionally it should honor OPOS == 7 as DFP's request + * to exit all modes. + */ + if (pd_is_connected(port)) { + modep->index = -1; + return VDO(modep->fx->svid, 1, + (CMD_EXIT_MODE | VDO_OPOS(pd_alt_mode(port)))); + } else { + pd_dfp_pe_init(port); + } + return 0; } #ifdef CONFIG_CMD_USB_PD_PE @@ -578,16 +586,6 @@ void pd_usb_billboard_deferred(void) } DECLARE_DEFERRED(pd_usb_billboard_deferred); -#ifndef CONFIG_USB_PD_ALT_MODE_DFP -int pd_exit_mode(int port, uint32_t *payload) -{ -#ifdef CONFIG_USB_PD_ALT_MODE - svdm_rsp.exit_mode(port, payload); -#endif - return 0; -} -#endif /* !CONFIG_USB_PD_ALT_MODE_DFP */ - #ifdef CONFIG_USB_PD_ALT_MODE_DFP static int hc_remote_pd_discovery(struct host_cmd_handler_args *args) { diff --git a/common/usb_pd_protocol.c b/common/usb_pd_protocol.c index fbf45b2993..586afdcebd 100644 --- a/common/usb_pd_protocol.c +++ b/common/usb_pd_protocol.c @@ -369,7 +369,9 @@ static inline void set_state(int port, enum pd_states next_state) #endif pd[port].dev_id = 0; pd[port].flags &= ~PD_FLAGS_RESET_ON_DISCONNECT_MASK; - pd_exit_mode(port, NULL); +#ifdef CONFIG_USB_PD_ALT_MODE_DFP + pd_dfp_exit_mode(port); +#endif #ifdef CONFIG_USBC_SS_MUX board_set_usb_mux(port, TYPEC_MUX_NONE, pd[port].polarity); @@ -784,7 +786,10 @@ static void execute_hard_reset(int port) CPRINTF("HARD RESET (RECV)!\n"); pd[port].msg_id = 0; - pd_exit_mode(port, NULL); +#ifdef CONFIG_USB_PD_ALT_MODE_DFP + pd_dfp_exit_mode(port); + pd_dfp_pe_init(port); +#endif #ifdef CONFIG_USB_PD_DUAL_ROLE if (pd[port].power_role == PD_ROLE_SINK) { diff --git a/include/usb_pd.h b/include/usb_pd.h index b43d78464c..8e7fac1c66 100644 --- a/include/usb_pd.h +++ b/include/usb_pd.h @@ -892,13 +892,19 @@ int pd_svdm(int port, int cnt, uint32_t *payload, uint32_t **rpayload); int pd_custom_flash_vdm(int port, int cnt, uint32_t *payload); /** - * Exit alternate mode + * Exit alternate mode on DFP + * + * @param port USB-C port number + * @return VDO to send to UFP or zero if none + */ +uint32_t pd_dfp_exit_mode(int port); + +/** + * Initialize policy engine for DFP * * @param port USB-C port number - * @param payload payload data. - * @return if >0, number of VDOs to send back. */ -int pd_exit_mode(int port, uint32_t *payload); +void pd_dfp_pe_init(int port); /** * Store Device ID & RW hash of device |