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 <victoryang@google.com>
Reviewed-on: https://chromium-review.googlesource.com/254713
Tested-by: Vic Yang <victoryang@chromium.org>
Reviewed-by: Benson Leung <bleung@chromium.org>
Reviewed-by: Alec Berg <alecaberg@chromium.org>
Commit-Queue: Vic Yang <victoryang@chromium.org>
This commit is contained in:
Vic Yang
2015-02-27 14:11:09 -08:00
committed by ChromeOS Commit Bot
parent 179fcb3f1d
commit 4e5c20fb07
3 changed files with 25 additions and 10 deletions

View File

@@ -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();
}

View File

@@ -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 */

View File

@@ -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)