From 219cb173114c9cfaf1dc7fed21281f2c43c88c9f Mon Sep 17 00:00:00 2001 From: Vincent Chen Date: Thu, 8 Jul 2021 09:08:21 +0800 Subject: [PATCH] board: sifive: unmatched: reset USB hub, PCIe-USB bridge, and ULPI device in SPL Ensure USB hub, PCIe-USB bridge, and ULPI device to be reset even if the rebooting is without power-cycling. Signed-off-by: Vincent Chen Reviewed-by: Leo Yu-Chi Liang --- board/sifive/unmatched/spl.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/board/sifive/unmatched/spl.c b/board/sifive/unmatched/spl.c index b598f9f..d566327 100644 --- a/board/sifive/unmatched/spl.c +++ b/board/sifive/unmatched/spl.c @@ -16,6 +16,9 @@ #include #include +#define UBRDG_RESET SIFIVE_GENERIC_GPIO_NR(0, 7) +#define ULPI_RESET SIFIVE_GENERIC_GPIO_NR(0, 9) +#define UHUB_RESET SIFIVE_GENERIC_GPIO_NR(0, 11) #define GEM_PHY_RESET SIFIVE_GENERIC_GPIO_NR(0, 12) #define MODE_SELECT_REG 0x1000 @@ -61,6 +64,21 @@ static inline int spl_gemgxl_init(void) return ret; } +static inline int spl_usb_pcie_bridge_init(void) +{ + return spl_reset_device_by_gpio("usb_pcie_bridge_reset", UBRDG_RESET, 3000); +} + +static inline int spl_usb_hub_init(void) +{ + return spl_reset_device_by_gpio("usb_hub_reset", UHUB_RESET, 100); +} + +static inline int spl_ulpi_init(void) +{ + return spl_reset_device_by_gpio("ulpi_reset", ULPI_RESET, 1); +} + int spl_board_init_f(void) { int ret; @@ -77,6 +95,24 @@ int spl_board_init_f(void) goto end; } + ret = spl_usb_pcie_bridge_init(); + if (ret) { + debug("USB Bridge (ASM1042A) init failed: %d\n", ret); + goto end; + } + + ret = spl_usb_hub_init(); + if (ret) { + debug("USB Hub (ASM1074) init failed: %d\n", ret); + goto end; + } + + ret = spl_ulpi_init(); + if (ret) { + debug("USB 2.0 PHY (USB3320C) init failed: %d\n", ret); + goto end; + } + end: return ret; } -- 2.7.4