diff options
author | Rob Barnes <robbarnes@google.com> | 2022-01-05 10:42:52 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2022-01-13 18:03:17 +0000 |
commit | df45565d698e5addbdeb468b0615c4505c150b73 (patch) | |
tree | 4d8a043473d452eb54bf8737915082798aab5df4 | |
parent | f0accb6b9c809bb18ca7f9d0c69fdf8527408678 (diff) | |
download | chrome-ec-df45565d698e5addbdeb468b0615c4505c150b73.tar.gz |
guybrush: Use ioex gpio save and restore functions
Use common ioex_save_gpio_state and ioex_restore_gpio_state functions to
save and restore gpio state after ioexpander is reset.
BUG=b:211062040
BRANCH=None
TEST=gpio state restored on nipperkin. USBA0/1 works after hibernate and
wake from AC.
Change-Id: I548adb46b5d96b0712382e0fac68b6854ed0af0f
Signed-off-by: Rob Barnes <robbarnes@google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3368322
Reviewed-by: Diana Z <dzigterman@chromium.org>
-rw-r--r-- | baseboard/guybrush/baseboard.c | 45 |
1 files changed, 22 insertions, 23 deletions
diff --git a/baseboard/guybrush/baseboard.c b/baseboard/guybrush/baseboard.c index dd44c5feb5..5f4cb70ecc 100644 --- a/baseboard/guybrush/baseboard.c +++ b/baseboard/guybrush/baseboard.c @@ -591,21 +591,21 @@ void tcpc_alert_event(enum gpio_signal signal) static void reset_nct38xx_port(int port) { - enum gpio_signal reset_gpio_l; - int a_vbus, a_limit_sdp, a1_retimer_en; - - /* Save type-A GPIO values to restore after reset */ - if (port == USBC_PORT_C0) { - reset_gpio_l = GPIO_USB_C0_TCPC_RST_L; - ioex_get_level(IOEX_EN_PP5000_USB_A0_VBUS, &a_vbus); - ioex_get_level(IOEX_USB_A0_LIMIT_SDP, &a_limit_sdp); - } else if (port == USBC_PORT_C1) { - reset_gpio_l = GPIO_USB_C1_TCPC_RST_L; - ioex_get_level(IOEX_EN_PP5000_USB_A1_VBUS_DB, &a_vbus); - ioex_get_level(IOEX_USB_A1_LIMIT_SDP_DB, &a_limit_sdp); - ioex_get_level(IOEX_USB_A1_RETIMER_EN, &a1_retimer_en); - } else { - /* Invalid port: do nothing */ + int rv; + int saved_state[IOEX_COUNT] = {0}; + enum gpio_signal reset_gpio_l = (port == USBC_PORT_C0) ? + GPIO_USB_C0_TCPC_RST_L : + GPIO_USB_C1_TCPC_RST_L; + + if (port < 0 || port > USBC_PORT_COUNT) { + CPRINTSUSB("%s invalid port %d", __func__, port); + return; + } + + /* Save ioexpander GPIO state */ + rv = ioex_save_gpio_state(port, saved_state, ARRAY_SIZE(saved_state)); + if (rv) { + CPRINTSUSB("%s failed to save ioex state rv=%d", __func__, rv); return; } @@ -618,17 +618,16 @@ static void reset_nct38xx_port(int port) /* Re-init ioex after resetting the TCPC */ ioex_init(port); - if (port == USBC_PORT_C0) { - ioex_set_level(IOEX_EN_PP5000_USB_A0_VBUS, a_vbus); - ioex_set_level(IOEX_USB_A0_LIMIT_SDP, a_limit_sdp); - } else { - ioex_set_level(IOEX_EN_PP5000_USB_A1_VBUS_DB, a_vbus); - ioex_set_level(IOEX_USB_A1_LIMIT_SDP_DB, a_limit_sdp); - ioex_set_level(IOEX_USB_A1_RETIMER_EN, a1_retimer_en); + /* Restore ioexpander GPIO state */ + rv = ioex_restore_gpio_state(port, saved_state, + ARRAY_SIZE(saved_state)); + if (rv) { + CPRINTSUSB("%s failed to restore ioex state rv=%d", __func__, + rv); + return; } } - void board_reset_pd_mcu(void) { /* Reset TCPC0 */ |