diff options
author | Caveh Jalali <caveh@chromium.org> | 2021-06-10 01:56:46 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-06-12 02:26:00 +0000 |
commit | 077bb92c4a41db95d1dd1f824c19f87ac0b1d715 (patch) | |
tree | 4d2c32cfdef977c991cc96ff15ce0e4d881e11c2 | |
parent | fd2276ad5b6403338df5dd096195cb5ceadaeae6 (diff) | |
download | chrome-ec-077bb92c4a41db95d1dd1f824c19f87ac0b1d715.tar.gz |
bb_retimer: Return status from bb_retimer_power_handle()
This allows the implementation of bb_retimer_power_handle() to return a
status value indicating whether the request was successful. The default
implementation simply controls a GPIO and is expected to succeed
unconditionally. More complex implementations may run into failure cases
that leave the BB unreachable. When this happens, device initialization
returns an error so the caller can take mitigating action.
USB MUX operations tend to be called from timing sensitive code paths in
the TCPM, so careful error handling helps avoid cascading problems like
PD negotiation failures.
BRANCH=none
BUG=b:181743576,b:188826559
TEST=buildall passes, PD still works on brya
Change-Id: If79078be26e47d758e2cd6cc385ff2b34fecff63
Signed-off-by: Caveh Jalali <caveh@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2954198
Reviewed-by: Keith Short <keithshort@chromium.org>
Reviewed-by: Boris Mittelberg <bmbm@google.com>
-rw-r--r-- | baseboard/intelrvp/adlrvp.c | 3 | ||||
-rw-r--r-- | board/brya/usbc_config.c | 5 | ||||
-rw-r--r-- | board/primus/usbc_config.c | 5 | ||||
-rw-r--r-- | board/tglrvpu_ite/board.c | 3 | ||||
-rw-r--r-- | driver/retimer/bb_retimer.c | 7 | ||||
-rw-r--r-- | include/driver/retimer/bb_retimer_public.h | 5 |
6 files changed, 18 insertions, 10 deletions
diff --git a/baseboard/intelrvp/adlrvp.c b/baseboard/intelrvp/adlrvp.c index fcb590b16e..d992154c49 100644 --- a/baseboard/intelrvp/adlrvp.c +++ b/baseboard/intelrvp/adlrvp.c @@ -247,7 +247,7 @@ void board_overcurrent_event(int port, int is_overcurrented) ioex_set_level(oc_signal, is_overcurrented ? 0 : 1); } -__override void bb_retimer_power_handle(const struct usb_mux *me, int on_off) +__override int bb_retimer_power_handle(const struct usb_mux *me, int on_off) { /* Handle retimer's power domain.*/ if (on_off) { @@ -273,6 +273,7 @@ __override void bb_retimer_power_handle(const struct usb_mux *me, int on_off) msleep(1); ioex_set_level(bb_controls[me->usb_port].usb_ls_en_gpio, 0); } + return EC_SUCCESS; } static void board_connect_c0_sbu_deferred(void) diff --git a/board/brya/usbc_config.c b/board/brya/usbc_config.c index 2436c5472c..34ae44f2fa 100644 --- a/board/brya/usbc_config.c +++ b/board/brya/usbc_config.c @@ -187,7 +187,7 @@ void config_usb_db_type(void) CPRINTS("Configured USB DB type number is %d", db_type); } -__override void bb_retimer_power_handle(const struct usb_mux *me, int on_off) +__override int bb_retimer_power_handle(const struct usb_mux *me, int on_off) { enum ioex_signal rst_signal; @@ -199,7 +199,7 @@ __override void bb_retimer_power_handle(const struct usb_mux *me, int on_off) } else if (me->usb_port == USBC_PORT_C2) { rst_signal = IOEX_USB_C2_RT_RST_ODL; } else { - return; + return EC_ERROR_INVAL; } /* @@ -224,6 +224,7 @@ __override void bb_retimer_power_handle(const struct usb_mux *me, int on_off) ioex_set_level(rst_signal, 0); msleep(1); } + return EC_SUCCESS; } void board_reset_pd_mcu(void) diff --git a/board/primus/usbc_config.c b/board/primus/usbc_config.c index 5fa69121db..f6770c8f27 100644 --- a/board/primus/usbc_config.c +++ b/board/primus/usbc_config.c @@ -187,7 +187,7 @@ void config_usb_db_type(void) CPRINTS("Configured USB DB type number is %d", db_type); } -__override void bb_retimer_power_handle(const struct usb_mux *me, int on_off) +__override int bb_retimer_power_handle(const struct usb_mux *me, int on_off) { enum ioex_signal rst_signal; @@ -199,7 +199,7 @@ __override void bb_retimer_power_handle(const struct usb_mux *me, int on_off) } else if (me->usb_port == USBC_PORT_C2) { rst_signal = IOEX_USB_C2_RT_RST_ODL; } else { - return; + return EC_ERROR_INVAL; } /* @@ -224,6 +224,7 @@ __override void bb_retimer_power_handle(const struct usb_mux *me, int on_off) ioex_set_level(rst_signal, 0); msleep(1); } + return EC_SUCCESS; } void board_reset_pd_mcu(void) diff --git a/board/tglrvpu_ite/board.c b/board/tglrvpu_ite/board.c index 88f74054f3..ba5ca0282d 100644 --- a/board/tglrvpu_ite/board.c +++ b/board/tglrvpu_ite/board.c @@ -223,7 +223,7 @@ int board_get_version(void) return board_id | (fab_id << 8); } -__override void bb_retimer_power_handle(const struct usb_mux *me, int on_off) +__override int bb_retimer_power_handle(const struct usb_mux *me, int on_off) { const struct bb_usb_control *control = &bb_controls[me->usb_port]; @@ -266,4 +266,5 @@ __override void bb_retimer_power_handle(const struct usb_mux *me, int on_off) msleep(1); gpio_set_level(control->usb_ls_en_gpio, 0); } + return EC_SUCCESS; } diff --git a/driver/retimer/bb_retimer.c b/driver/retimer/bb_retimer.c index 26369ca7f5..3aa1f001f8 100644 --- a/driver/retimer/bb_retimer.c +++ b/driver/retimer/bb_retimer.c @@ -123,7 +123,7 @@ static int bb_retimer_write(const struct usb_mux *me, return rv; } -__overridable void bb_retimer_power_handle(const struct usb_mux *me, int on_off) +__overridable int bb_retimer_power_handle(const struct usb_mux *me, int on_off) { const struct bb_usb_control *control = &bb_controls[me->usb_port]; @@ -149,6 +149,7 @@ __overridable void bb_retimer_power_handle(const struct usb_mux *me, int on_off) msleep(1); gpio_set_level(control->usb_ls_en_gpio, 0); } + return EC_SUCCESS; } static void retimer_set_state_dfp(int port, mux_state_t mux_state, @@ -490,7 +491,9 @@ static int retimer_init(const struct usb_mux *me) return EC_ERROR_NOT_POWERED; } - bb_retimer_power_handle(me, 1); + rv = bb_retimer_power_handle(me, 1); + if (rv != EC_SUCCESS) + return rv; rv = bb_retimer_read(me, BB_RETIMER_REG_VENDOR_ID, &data); if (rv) diff --git a/include/driver/retimer/bb_retimer_public.h b/include/driver/retimer/bb_retimer_public.h index c13ec67685..7d9832f4ea 100644 --- a/include/driver/retimer/bb_retimer_public.h +++ b/include/driver/retimer/bb_retimer_public.h @@ -36,8 +36,9 @@ extern struct bb_usb_control bb_controls[]; * @param me Pointer to USB mux * @param on_off BB retimer state to be changed * + * @return EC_SUCCESS, or non-zero on error. */ -__override_proto void bb_retimer_power_handle(const struct usb_mux *me, - int on_off); +__override_proto int bb_retimer_power_handle(const struct usb_mux *me, + int on_off); #endif /* __CROS_EC_DRIVER_RETIMER_BB_RETIMER_PUBLIC_H */ |