summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Barnes <robbarnes@google.com>2022-01-05 10:42:52 -0700
committerCommit Bot <commit-bot@chromium.org>2022-01-13 18:03:17 +0000
commitdf45565d698e5addbdeb468b0615c4505c150b73 (patch)
tree4d8a043473d452eb54bf8737915082798aab5df4
parentf0accb6b9c809bb18ca7f9d0c69fdf8527408678 (diff)
downloadchrome-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.c45
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 */