From 4fda01ca91f8e4c50ecddb904b4794df40e4d49f Mon Sep 17 00:00:00 2001 From: Vic Yang Date: Mon, 22 Sep 2014 17:19:42 +0800 Subject: [PATCH] Plankton: reset USB hub on POR On power-on reset, the USB hub might get stuck in a locked state due to a race condition in hardware. Let's reset the hub after 0.5 seconds to make sure this doesn't happen. BUG=chrome-os-partner:32163 TEST=Power on the board. Measure the reset signal. BRANCH=None Change-Id: I0f89883c5db7c5376f3612da1615ba4f86b5efa6 Signed-off-by: Vic Yang Reviewed-on: https://chromium-review.googlesource.com/219199 Reviewed-by: Alec Berg --- board/plankton/board.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/board/plankton/board.c b/board/plankton/board.c index cb60dcd353..b563fdaf74 100644 --- a/board/plankton/board.c +++ b/board/plankton/board.c @@ -13,6 +13,7 @@ #include "i2c.h" #include "ioexpander_pca9534.h" #include "registers.h" +#include "system.h" #include "task.h" #include "timer.h" #include "usb_pd.h" @@ -200,7 +201,7 @@ DECLARE_CONSOLE_COMMAND(usbc_action, cmd_usbc_action, "Set Plankton type-C port state", NULL); -static int cmd_usb_hub_reset(int argc, char *argv[]) +static int board_usb_hub_reset(void) { int ret; @@ -213,5 +214,23 @@ static int cmd_usb_hub_reset(int argc, char *argv[]) usleep(100 * MSEC); return pca9534_set_level(I2C_PORT_MASTER, 0x40, 7, 1); } + +static int cmd_usb_hub_reset(int argc, char *argv[]) +{ + return board_usb_hub_reset(); +} DECLARE_CONSOLE_COMMAND(hub_reset, cmd_usb_hub_reset, NULL, "Reset USB hub", NULL); + +static void board_usb_hub_reset_no_return(void) +{ + board_usb_hub_reset(); +} +DECLARE_DEFERRED(board_usb_hub_reset_no_return); + +static void board_init_usb_hub(void) +{ + if (system_get_reset_flags() & RESET_FLAG_POWER_ON) + hook_call_deferred(board_usb_hub_reset_no_return, 500 * MSEC); +} +DECLARE_HOOK(HOOK_INIT, board_init_usb_hub, HOOK_PRIO_DEFAULT);