summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTing Shen <phoenixshen@google.com>2019-07-29 16:36:41 +0800
committerCommit Bot <commit-bot@chromium.org>2019-09-09 06:50:36 +0000
commit1524c164f52acc8cdab918b782c21e2120dcc5f6 (patch)
treeef702f80757cf97f6a1c12bc65d2f6a069b5739a
parent60c0372ba770590333f164c4066ee068c6a4f93d (diff)
downloadchrome-ec-1524c164f52acc8cdab918b782c21e2120dcc5f6.tar.gz
jacuzzi: enable DP
enable dp on jacuzzi, and add back the dp implementation before CL:1660524 for all new devices including jacuzzi. usb_pd_policy now supports two different configs: - kukui/krane, rev <= 4: no mux (CONFIG_USB_MUX_VIRTUAL defined) - all new devices: have a real mux BUG=b:135895590,b:135079572 TEST=attach a usb hub and moniter to the dut, verify that dp/dp+mux mode and both polarities can detected correctly BRANCH=master Change-Id: I3e4757c97d555a4afb48076fc4785305c96b0a7f Signed-off-by: Ting Shen <phoenixshen@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1723892 Reviewed-by: Ting Shen <phoenixshen@chromium.org> Commit-Queue: Ting Shen <phoenixshen@chromium.org> Tested-by: Ting Shen <phoenixshen@chromium.org>
-rw-r--r--baseboard/kukui/baseboard.h1
-rw-r--r--baseboard/kukui/usb_pd_policy.c28
-rw-r--r--board/jacuzzi/board.c14
-rw-r--r--board/kodama/board.c11
-rw-r--r--board/kukui/board.h1
-rw-r--r--include/usb_pd.h1
6 files changed, 38 insertions, 18 deletions
diff --git a/baseboard/kukui/baseboard.h b/baseboard/kukui/baseboard.h
index c1d99db39b..4b888fa5ac 100644
--- a/baseboard/kukui/baseboard.h
+++ b/baseboard/kukui/baseboard.h
@@ -130,7 +130,6 @@
#define CONFIG_CHARGER_DISCHARGE_ON_AC
#define CONFIG_CHARGER_DISCHARGE_ON_AC_CUSTOM
#define CONFIG_USB_CHARGER
-#define CONFIG_USB_MUX_VIRTUAL
/* Increase tx buffer size, as we'd like to stream EC log to AP. */
#undef CONFIG_UART_TX_BUF_SIZE
diff --git a/baseboard/kukui/usb_pd_policy.c b/baseboard/kukui/usb_pd_policy.c
index d6b5ddf764..5d5ca68e2d 100644
--- a/baseboard/kukui/usb_pd_policy.c
+++ b/baseboard/kukui/usb_pd_policy.c
@@ -250,10 +250,14 @@ static void svdm_safe_dp_mode(int port)
static int svdm_enter_dp_mode(int port, uint32_t mode_caps)
{
- /* Kukui doesn't support superspeed lanes. */
- const uint32_t support_pin_mode = MODE_DP_PIN_C | MODE_DP_PIN_E;
+ /* Kukui/Krane doesn't support superspeed lanes. */
+ const uint32_t support_pin_mode = IS_ENABLED(CONFIG_USB_MUX_VIRTUAL) ?
+ (MODE_DP_PIN_C | MODE_DP_PIN_E) : MODE_DP_PIN_ALL;
- /* Only enter mode if device is DFP_D and PIN_C, PIN_E capable */
+ /**
+ * Only enter mode if device is DFP_D (and PIN_C/E for Kukui/Krane)
+ * capable
+ */
if ((mode_caps & MODE_DP_SNK) &&
(mode_caps & (support_pin_mode << MODE_DP_DFP_PIN_SHIFT))) {
svdm_safe_dp_mode(port);
@@ -284,15 +288,25 @@ static int svdm_dp_status(int port, uint32_t *payload)
static int svdm_dp_config(int port, uint32_t *payload)
{
int opos = pd_alt_mode(port, USB_SID_DISPLAYPORT);
+ int status = dp_status[port];
+ int mf_pref = PD_VDO_DPSTS_MF_PREF(dp_status[port]);
+ int pin_mode;
+
/* Kukui doesn't support multi-function mode, mask it out. */
- int status = dp_status[port] & ~PD_VDO_DPSTS_MF_MASK;
- int pin_mode = pd_dfp_dp_get_pin_mode(port, status);
+ if (IS_ENABLED(CONFIG_USB_MUX_VIRTUAL))
+ status &= ~PD_VDO_DPSTS_MF_MASK;
+
+ pin_mode = pd_dfp_dp_get_pin_mode(port, status);
if (!pin_mode)
return 0;
- usb_mux_set(port, TYPEC_MUX_DP, USB_SWITCH_CONNECT,
- board_get_polarity(port));
+ if (IS_ENABLED(CONFIG_USB_MUX_VIRTUAL))
+ usb_mux_set(port, TYPEC_MUX_DP, USB_SWITCH_CONNECT,
+ board_get_polarity(port));
+ else
+ usb_mux_set(port, mf_pref ? TYPEC_MUX_DOCK : TYPEC_MUX_DP,
+ USB_SWITCH_CONNECT, board_get_polarity(port));
payload[0] = VDO(USB_SID_DISPLAYPORT, 1,
CMD_DP_CONFIG | VDO_OPOS(opos));
diff --git a/board/jacuzzi/board.c b/board/jacuzzi/board.c
index 6f2450b09d..3d23faea5f 100644
--- a/board/jacuzzi/board.c
+++ b/board/jacuzzi/board.c
@@ -107,15 +107,11 @@ const struct tcpc_config_t tcpc_config[CONFIG_USB_PD_PORT_COUNT] = {
static void board_hpd_status(int port, int hpd_lvl, int hpd_irq)
{
- /* Invert HPD level since GPIOs are active low. */
- hpd_lvl = !hpd_lvl;
-
- gpio_set_level(GPIO_USB_C0_HPD_OD, hpd_lvl);
- if (hpd_irq) {
- gpio_set_level(GPIO_USB_C0_HPD_OD, 1);
- msleep(1);
- gpio_set_level(GPIO_USB_C0_HPD_OD, hpd_lvl);
- }
+ /*
+ * svdm_dp_attention() did most of the work, we only need to notify
+ * host here.
+ */
+ host_set_single_event(EC_HOST_EVENT_USB_MUX);
}
struct usb_mux usb_muxes[CONFIG_USB_PD_PORT_COUNT] = {
diff --git a/board/kodama/board.c b/board/kodama/board.c
index 1e778410cb..88f9042d4c 100644
--- a/board/kodama/board.c
+++ b/board/kodama/board.c
@@ -91,11 +91,20 @@ const struct tcpc_config_t tcpc_config[CONFIG_USB_PD_PORT_COUNT] = {
},
};
+static void board_hpd_status(int port, int hpd_lvl, int hpd_irq)
+{
+ /*
+ * svdm_dp_attention() did most of the work, we only need to notify
+ * host here.
+ */
+ host_set_single_event(EC_HOST_EVENT_USB_MUX);
+}
+
struct usb_mux usb_muxes[CONFIG_USB_PD_PORT_COUNT] = {
{
.port_addr = IT5205_I2C_ADDR1_FLAGS,
.driver = &it5205_usb_mux_driver,
- .hpd_update = &virtual_hpd_update,
+ .hpd_update = &board_hpd_status,
},
};
diff --git a/board/kukui/board.h b/board/kukui/board.h
index c7d2da1ed9..b86b9d92bf 100644
--- a/board/kukui/board.h
+++ b/board/kukui/board.h
@@ -24,6 +24,7 @@
#include "baseboard.h"
#define CONFIG_USB_MUX_IT5205
+#define CONFIG_USB_MUX_VIRTUAL
#define CONFIG_VOLUME_BUTTONS
/* Battery */
diff --git a/include/usb_pd.h b/include/usb_pd.h
index a1a1c0ba0f..b0d52737f4 100644
--- a/include/usb_pd.h
+++ b/include/usb_pd.h
@@ -825,6 +825,7 @@ struct pd_cable {
#define MODE_DP_PIN_D 0x08
#define MODE_DP_PIN_E 0x10
#define MODE_DP_PIN_F 0x20
+#define MODE_DP_PIN_ALL 0x3f
#define MODE_DP_DFP_PIN_SHIFT 8
#define MODE_DP_UFP_PIN_SHIFT 16