summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Brockus <dbrockus@chromium.org>2019-12-19 09:34:33 -0700
committerCommit Bot <commit-bot@chromium.org>2020-01-08 18:45:53 +0000
commitd2756b04a64b151e03207207ee923969168f0956 (patch)
treec52e7659d35ecf9031888aa4cb9c60995604424b
parent83d2bc5c815eafccba3b506796418295c315a0a5 (diff)
downloadchrome-ec-d2756b04a64b151e03207207ee923969168f0956.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/+/1991852 Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org> Commit-Queue: Tim Wawrzynczak <twawrzynczak@chromium.org> Tested-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
-rw-r--r--common/usbc/usb_tc_drp_acc_trysrc_sm.c54
-rw-r--r--include/usb_charge.h2
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 cc4cebb037..10554a2db5 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);
}
@@ -1751,6 +1785,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);
@@ -2423,6 +2467,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