diff options
author | Denis Brockus <dbrockus@chromium.org> | 2019-12-19 09:34:33 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-01-08 19:59:52 +0000 |
commit | 7baf5d905737103c68fbad7d35913219a3e7cda5 (patch) | |
tree | 7469c5a17f296852d9f05c50da0df8ba0b8a5529 | |
parent | 069a813a70a45af5191b2ada0df6bfe6a4dace5c (diff) | |
download | chrome-ec-7baf5d905737103c68fbad7d35913219a3e7cda5.tar.gz |
TCPMv2: Add BC1.2 trigger events
The BC1.2 was holding the data lines so a USB SNK device
would not be allowed to talk on the bus
BUG=none
BRANCH=none
TEST=verify attached USB stick on BC1.2 enabled board
Change-Id: I501a3d491241d00917d921c041b0567ec4ec55a1
Signed-off-by: Denis Brockus <dbrockus@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1967934
Reviewed-by: Edward Hill <ecgh@chromium.org>
Reviewed-by: Jett Rink <jettrink@chromium.org>
-rw-r--r-- | common/usbc/usb_tc_drp_acc_trysrc_sm.c | 54 | ||||
-rw-r--r-- | include/usb_charge.h | 2 |
2 files changed, 54 insertions, 2 deletions
diff --git a/common/usbc/usb_tc_drp_acc_trysrc_sm.c b/common/usbc/usb_tc_drp_acc_trysrc_sm.c index 4a1345cbae..cd89ea51fd 100644 --- a/common/usbc/usb_tc_drp_acc_trysrc_sm.c +++ b/common/usbc/usb_tc_drp_acc_trysrc_sm.c @@ -715,6 +715,32 @@ void pd_prepare_sysjump(void) } #endif +static __maybe_unused void bc12_role_change_handler(int port) +{ + int event; + int task_id = USB_CHG_PORT_TO_TASK_ID(port); + + /* + * TODO(b/147290482) Cleanup pd_get_role to return enum + * pd_power_role type. + */ + /* Get the power of our device (not the port partner) */ + switch (pd_get_role(port)) { + case PD_ROLE_UFP: + event = USB_CHG_EVENT_DR_UFP; + break; + case PD_ROLE_DFP: + event = USB_CHG_EVENT_DR_DFP; + break; + case PD_ROLE_DISCONNECTED: + event = USB_CHG_EVENT_CC_OPEN; + break; + default: + return; + } + task_set_event(task_id, event, 0); +} + #ifdef CONFIG_USB_PE_SM static void tc_perform_src_hard_reset(int port) { @@ -975,6 +1001,14 @@ void tc_set_data_role(int port, enum pd_data_role role) */ pd_execute_data_swap(port, role); + /* + * For BC1.2 detection that is triggered on data role change events + * instead of VBUS changes, need to set an event to wake up the USB_CHG + * task and indicate the current data role. + */ + if (IS_ENABLED(CONFIG_BC12_DETECT_DATA_ROLE_TRIGGER)) + bc12_role_change_handler(port); + /* Notify TCPC of role update */ tcpm_set_msg_header(port, tc[port].power_role, tc[port].data_role); } @@ -1752,6 +1786,16 @@ static void tc_unattached_snk_entry(const int port) if (get_last_state_tc(port) != TC_UNATTACHED_SRC) print_current_state(port); + tc[port].data_role = PD_ROLE_DISCONNECTED; + + /* + * When data role set events are used to enable BC1.2, then CC + * detach events are used to notify BC1.2 that it can be powered + * down. + */ + if (IS_ENABLED(CONFIG_BC12_DETECT_DATA_ROLE_TRIGGER)) + bc12_role_change_handler(port); + /* VBus should be SafeV0, turn off auto discharge disconnect */ tcpm_enable_auto_discharge_disconnect(port, 0); @@ -2424,6 +2468,16 @@ static void tc_unattached_src_entry(const int port) if (get_last_state_tc(port) != TC_UNATTACHED_SNK) print_current_state(port); + tc[port].data_role = PD_ROLE_DISCONNECTED; + + /* + * When data role set events are used to enable BC1.2, then CC + * detach events are used to notify BC1.2 that it can be powered + * down. + */ + if (IS_ENABLED(CONFIG_BC12_DETECT_DATA_ROLE_TRIGGER)) + bc12_role_change_handler(port); + /* VBus should be SafeV0, turn off auto discharge disconnect */ tcpm_enable_auto_discharge_disconnect(port, 0); diff --git a/include/usb_charge.h b/include/usb_charge.h index a14c696daa..867a6e4ba6 100644 --- a/include/usb_charge.h +++ b/include/usb_charge.h @@ -27,7 +27,6 @@ int usb_charge_set_mode(int usb_port_id, enum usb_charge_mode mode, enum usb_suspend_charge inhibit_charge); -#ifdef HAS_TASK_USB_CHG_P0 #define USB_CHG_EVENT_BC12 TASK_EVENT_CUSTOM_BIT(0) #define USB_CHG_EVENT_VBUS TASK_EVENT_CUSTOM_BIT(1) #define USB_CHG_EVENT_INTR TASK_EVENT_CUSTOM_BIT(2) @@ -35,7 +34,6 @@ int usb_charge_set_mode(int usb_port_id, enum usb_charge_mode mode, #define USB_CHG_EVENT_DR_DFP TASK_EVENT_CUSTOM_BIT(4) #define USB_CHG_EVENT_CC_OPEN TASK_EVENT_CUSTOM_BIT(5) #define USB_CHG_EVENT_MUX TASK_EVENT_CUSTOM_BIT(6) -#endif /* * Define USB_CHG_PORT_TO_TASK_ID() and TASK_ID_TO_USB_CHG__PORT() macros to |