From 4e5c20fb07aeefdd3705bfb69d7ed40838e744ab Mon Sep 17 00:00:00 2001 From: Vic Yang Date: Fri, 27 Feb 2015 14:11:09 -0800 Subject: plankton: always run as UFP when in USB hub mode When Plankton is in USB hub mode, running as DFP doesn't make sense. In this case, ask for a data swap. BRANCH=None BUG=chrome-os-partner:37079 TEST=With Ryu, check Plankton is always UFP no matter it's sink or source. Change-Id: I7752b8c1255234a5ea726138708fe52c5fcd47b2 Signed-off-by: Vic Yang Reviewed-on: https://chromium-review.googlesource.com/254713 Tested-by: Vic Yang Reviewed-by: Benson Leung Reviewed-by: Alec Berg Commit-Queue: Vic Yang --- board/plankton/board.c | 25 +++++++++++++++---------- board/plankton/board.h | 7 +++++++ board/plankton/usb_pd_policy.c | 3 +++ 3 files changed, 25 insertions(+), 10 deletions(-) (limited to 'board/plankton') diff --git a/board/plankton/board.c b/board/plankton/board.c index b081a0f479..b6c9c666ca 100644 --- a/board/plankton/board.c +++ b/board/plankton/board.c @@ -217,6 +217,20 @@ DECLARE_CONSOLE_COMMAND(usbc_action, cmd_usbc_action, "Set Plankton type-C port state", NULL); +int board_in_hub_mode(void) +{ + int ret; + int level; + + ret = pca9534_config_pin(I2C_PORT_MASTER, 0x40, 6, PCA9534_INPUT); + if (ret) + return -1; + ret = pca9534_get_level(I2C_PORT_MASTER, 0x40, 6, &level); + if (ret) + return -1; + return level; +} + static int board_usb_hub_reset(void) { int ret; @@ -233,16 +247,7 @@ static int board_usb_hub_reset(void) void board_maybe_reset_usb_hub(void) { - int ret; - int level; - - ret = pca9534_config_pin(I2C_PORT_MASTER, 0x40, 6, PCA9534_INPUT); - if (ret) - return; - ret = pca9534_get_level(I2C_PORT_MASTER, 0x40, 6, &level); - if (ret) - return; - if (level == 1) + if (board_in_hub_mode() == 1) board_usb_hub_reset(); } diff --git a/board/plankton/board.h b/board/plankton/board.h index a2accc8058..efb1bc7868 100644 --- a/board/plankton/board.h +++ b/board/plankton/board.h @@ -79,6 +79,13 @@ void board_update_fake_adc_value(int host_mode); /* Set pull-up/pull-down on CC lines */ void board_pd_set_host_mode(int enable); +/* + * Whether the board is in USB hub mode or not + * + * @return 1 when in hub mode, 0 when not, and -1 on error. + */ +int board_in_hub_mode(void); + #endif /* !__ASSEMBLER__ */ #endif /* __BOARD_H */ diff --git a/board/plankton/usb_pd_policy.c b/board/plankton/usb_pd_policy.c index 628e244500..f007cd4b91 100644 --- a/board/plankton/usb_pd_policy.c +++ b/board/plankton/usb_pd_policy.c @@ -149,6 +149,9 @@ void pd_check_pr_role(int port, int pr_role, int partner_pr_swap) void pd_check_dr_role(int port, int dr_role, int partner_dr_swap) { + /* If Plankton is in USB hub mode, always act as UFP */ + if (board_in_hub_mode() && dr_role == PD_ROLE_DFP && partner_dr_swap) + pd_request_data_swap(port); } int pd_custom_vdm(int port, int cnt, uint32_t *payload, uint32_t **rpayload) -- cgit v1.2.1