diff options
author | Ruibin Chang <ruibin.chang@ite.com.tw> | 2021-02-22 14:40:53 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-02-26 03:53:14 +0000 |
commit | dc8438f3960c29a3a2f32dad05c3dcfea1c4cd9c (patch) | |
tree | e3cd676ba8ed1acd0cef2b251425265d23e6b343 | |
parent | 24f065a6b741805b7f97ce4095a7b871c0501854 (diff) | |
download | chrome-ec-dc8438f3960c29a3a2f32dad05c3dcfea1c4cd9c.tar.gz |
driver/it83xx, it8xxx2: turn on PD BMC PHY for TCPMv1
If explicit contract is set in bbram when EC boot up, then TCPMv1
set soft reset as first state instead of unattached.SNK, so we need
to enable BMC PHY for tx module.
And same as TCPMv2, we turn on/off BMC PHY and set low power mask
when hook_dis/connect is called.
BUG=none
BRANCH=none
TEST=on icarus, the explicit contract is set in bbram when EC boot up,
and we can tx soft reset (won't happen tx timeout).
Signed-off-by: Ruibin Chang <ruibin.chang@ite.com.tw>
Change-Id: I3c8d3db240d2290ced17b90aeb0420ac9f20598d
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2712213
Tested-by: Ruibin Chang <Ruibin.Chang@ite.com.tw>
Reviewed-by: Eric Yilun Lin <yllin@chromium.org>
Commit-Queue: Ruibin Chang <Ruibin.Chang@ite.com.tw>
-rw-r--r-- | driver/tcpm/it83xx.c | 26 | ||||
-rw-r--r-- | driver/tcpm/it8xxx2.c | 26 |
2 files changed, 42 insertions, 10 deletions
diff --git a/driver/tcpm/it83xx.c b/driver/tcpm/it83xx.c index 4b3e67ca1a..8c45b0e6b3 100644 --- a/driver/tcpm/it83xx.c +++ b/driver/tcpm/it83xx.c @@ -15,6 +15,7 @@ #include "tcpm/tcpci.h" #include "timer.h" #include "util.h" +#include "usb_common.h" #include "usb_pd.h" #include "usb_pd_tcpm.h" #include "hooks.h" @@ -410,6 +411,22 @@ static void it83xx_init(enum usbpd_port port, int role) ((CONFIG_PD_RETRY_COUNT + 1) << 4); /* Disable Rx decode */ it83xx_tcpm_set_rx_enable(port, 0); + if (IS_ENABLED(CONFIG_USB_PD_TCPMV1)) { + uint8_t flags = 0; + /* + * If explicit contract is set in bbram when EC boot up, then + * TCPMv1 set soft reset as first state instead of + * unattached.SNK, so we need to enable BMC PHY for tx module. + * + * NOTE: If the platform is without battery and connects to + * adapter, then cold reset EC, our Rd is always asserted on cc, + * so adapter keeps providing 5v and data in BBRAM are still + * alive. + */ + if ((pd_get_saved_port_flags(port, &flags) == EC_SUCCESS) && + (flags & PD_BBRMFLG_EXPLICIT_CONTRACT)) + USBPD_ENABLE_BMC_PHY(port); + } /* W/C status */ IT83XX_USBPD_ISR(port) = 0xff; /* enable cc, select cc1 and Rd. */ @@ -767,7 +784,7 @@ void set_pd_sleep_mask(int port) bool prevent_deep_sleep = false; /* - * Set SLEEP_MASK_USB_PD for deep sleep mode in TCPMv2: + * Set SLEEP_MASK_USB_PD for deep sleep mode: * 1.Enable deep sleep mode, when all ITE ports are in Unattach.SRC/SNK * state (HOOK_DISCONNECT called) and other ports aren't pd_capable(). * 2.Disable deep sleep mode, when one of ITE port is in Attach.SRC/SNK @@ -797,11 +814,11 @@ void set_pd_sleep_mask(int port) enable_sleep(SLEEP_MASK_USB_PD); } -#ifdef CONFIG_USB_PD_TCPMV2 static void it83xx_tcpm_hook_connect(void) { int port = TASK_ID_TO_PD_PORT(task_get_current()); +#ifdef CONFIG_USB_PD_TCPMV2 /* * There are five cases that hook_connect() be called by TCPMv2: * 1)AttachWait.SNK -> Attached.SNK: disable detect interrupt. @@ -817,17 +834,16 @@ static void it83xx_tcpm_hook_connect(void) * SRC_DISCONNECT and SNK_DISCONNECT in TCPMv1. Every time we go to * Try.SRC/TryWait.SNK state, the plug in interrupt will be enabled and * fire for 3), 4), 5) cases, then set correctly for the SRC detect plug - * out or the SNK disable detect, so TCPMv1 needn't hook connection. + * out or the SNK disable detect, so TCPMv1 needn't this. */ it83xx_tcpm_switch_plug_out_type(port); - +#endif /* Enable PD PHY Tx and Rx module since type-c has connected. */ USBPD_ENABLE_BMC_PHY(port); set_pd_sleep_mask(port); } DECLARE_HOOK(HOOK_USB_PD_CONNECT, it83xx_tcpm_hook_connect, HOOK_PRIO_DEFAULT); -#endif static void it83xx_tcpm_hook_disconnect(void) { diff --git a/driver/tcpm/it8xxx2.c b/driver/tcpm/it8xxx2.c index a8d98becd4..6b7466ae07 100644 --- a/driver/tcpm/it8xxx2.c +++ b/driver/tcpm/it8xxx2.c @@ -14,6 +14,7 @@ #include "task.h" #include "timer.h" #include "util.h" +#include "usb_common.h" #include "usb_pd.h" #include "usb_pd_tcpm.h" #include "hooks.h" @@ -759,6 +760,22 @@ static void it8xxx2_init(enum usbpd_port port, int role) (CONFIG_PD_RETRY_COUNT << 6); /* Disable Rx decode */ it8xxx2_tcpm_set_rx_enable(port, 0); + if (IS_ENABLED(CONFIG_USB_PD_TCPMV1)) { + uint8_t flags = 0; + /* + * If explicit contract is set in bbram when EC boot up, then + * TCPMv1 set soft reset as first state instead of + * unattached.SNK, so we need to enable BMC PHY for tx module. + * + * NOTE: If the platform is without battery and connects to + * adapter, then cold reset EC, our Rd is always asserted on cc, + * so adapter keeps providing 5v and data in BBRAM are still + * alive. + */ + if ((pd_get_saved_port_flags(port, &flags) == EC_SUCCESS) && + (flags & PD_BBRMFLG_EXPLICIT_CONTRACT)) + USBPD_ENABLE_BMC_PHY(port); + } /* Disable all interrupts */ IT83XX_USBPD_IMR(port) = 0xff; /* W/C status */ @@ -819,7 +836,7 @@ static void it8xxx2_set_pd_sleep_mask(int port) bool prevent_deep_sleep = false; /* - * Set SLEEP_MASK_USB_PD for deep sleep mode in TCPMv2: + * Set SLEEP_MASK_USB_PD for deep sleep mode: * 1.Enable deep sleep mode, when all ITE ports are in Unattach.SRC/SNK * state (HOOK_DISCONNECT called) and other ports aren't pd_capable(). * 2.Disable deep sleep mode, when one of ITE port is in Attach.SRC/SNK @@ -849,11 +866,11 @@ static void it8xxx2_set_pd_sleep_mask(int port) enable_sleep(SLEEP_MASK_USB_PD); } -#ifdef CONFIG_USB_PD_TCPMV2 static void it8xxx2_tcpm_hook_connect(void) { int port = TASK_ID_TO_PD_PORT(task_get_current()); +#ifdef CONFIG_USB_PD_TCPMV2 /* * There are five cases that hook_connect() be called by TCPMv2: * 1)AttachWait.SNK -> Attached.SNK: disable detect interrupt. @@ -869,17 +886,16 @@ static void it8xxx2_tcpm_hook_connect(void) * SRC_DISCONNECT and SNK_DISCONNECT in TCPMv1. Every time we go to * Try.SRC/TryWait.SNK state, the plug in interrupt will be enabled and * fire for 3), 4), 5) cases, then set correctly for the SRC detect plug - * out or the SNK disable detect, so TCPMv1 needn't hook connection. + * out or the SNK disable detect, so TCPMv1 needn't this. */ it8xxx2_tcpm_switch_plug_out_type(port); - +#endif /* Enable PD PHY Tx and Rx module since type-c has connected. */ USBPD_ENABLE_BMC_PHY(port); it8xxx2_set_pd_sleep_mask(port); } DECLARE_HOOK(HOOK_USB_PD_CONNECT, it8xxx2_tcpm_hook_connect, HOOK_PRIO_DEFAULT); -#endif static void it8xxx2_tcpm_hook_disconnect(void) { |