summaryrefslogtreecommitdiff
path: root/driver/usb_mux
diff options
context:
space:
mode:
authorDenis Brockus <dbrockus@chromium.org>2019-11-05 14:51:56 -0700
committerCommit Bot <commit-bot@chromium.org>2019-11-14 00:12:44 +0000
commita4972e187c6ce582aa54dbfce6039fd2239e4bbd (patch)
tree2dfffcb6b3b457b8abdbc6f4a0acc267cb9209d2 /driver/usb_mux
parentf5633029509350cf7254ab14c440d14e8e73f729 (diff)
downloadchrome-ec-a4972e187c6ce582aa54dbfce6039fd2239e4bbd.tar.gz
usbc: retimer pi3dpx1207
BUG=b:139428185 BRANCH=none TEST=verify mode is set correctly when switching devices Change-Id: Ic9d460a94bb8007f17168ac5237a4dcbc24cfb2b Signed-off-by: Denis Brockus <dbrockus@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1900123 Reviewed-by: Edward Hill <ecgh@chromium.org>
Diffstat (limited to 'driver/usb_mux')
-rw-r--r--driver/usb_mux/usb_mux.c38
1 files changed, 31 insertions, 7 deletions
diff --git a/driver/usb_mux/usb_mux.c b/driver/usb_mux/usb_mux.c
index 122f71d773..be150c8741 100644
--- a/driver/usb_mux/usb_mux.c
+++ b/driver/usb_mux/usb_mux.c
@@ -68,6 +68,19 @@ void usb_mux_init(int port)
return;
}
+ if (IS_ENABLED(CONFIG_USBC_MUX_RETIMER)) {
+ const struct usb_retimer *retimer = &usb_retimers[port];
+
+ if (retimer->driver && retimer->driver->init) {
+ res = retimer->driver->init(port);
+ if (res) {
+ CPRINTS("Err: init retimer port(%d): %d",
+ port, res);
+ return;
+ }
+ }
+ }
+
/* Device is always out of LPM after initialization. */
flags[port] &= ~USB_MUX_FLAG_IN_LPM;
@@ -93,10 +106,9 @@ void usb_mux_set(int port, enum typec_mux mux_mode,
const int should_enter_low_power_mode =
mux_mode == TYPEC_MUX_NONE && usb_mode == USB_SWITCH_DISCONNECT;
-#ifdef CONFIG_USB_CHARGER
/* Configure USB2.0 */
- usb_charger_set_switches(port, usb_mode);
-#endif
+ if (IS_ENABLED(CONFIG_USB_CHARGER))
+ usb_charger_set_switches(port, usb_mode);
/*
* Don't wake device up just to put it back to sleep. Low power mode
@@ -116,6 +128,19 @@ void usb_mux_set(int port, enum typec_mux mux_mode,
return;
}
+ if (IS_ENABLED(CONFIG_USBC_MUX_RETIMER)) {
+ const struct usb_retimer *retimer = &usb_retimers[port];
+
+ if (retimer->driver && retimer->driver->set) {
+ res = retimer->driver->set(port, mux_state);
+ if (res) {
+ CPRINTS("Err: set retimer port(%d): %d",
+ port, res);
+ return;
+ }
+ }
+ }
+
if (enable_debug_prints)
CPRINTS(
"usb/dp mux: port(%d) typec_mux(%d) usb2(%d) polarity(%d)",
@@ -241,12 +266,11 @@ static enum ec_status hc_usb_pd_mux_info(struct host_cmd_handler_args *args)
if (mux->driver->get(port, &r->flags) != EC_SUCCESS)
return EC_RES_ERROR;
-#ifdef CONFIG_USB_MUX_VIRTUAL
/* Clear HPD IRQ event since we're about to inform host of it. */
- if ((r->flags & USB_PD_MUX_HPD_IRQ) &&
- mux->hpd_update == &virtual_hpd_update)
+ if (IS_ENABLED(CONFIG_USB_MUX_VIRTUAL) &&
+ (r->flags & USB_PD_MUX_HPD_IRQ) &&
+ (mux->hpd_update == &virtual_hpd_update))
mux->hpd_update(port, r->flags & USB_PD_MUX_HPD_LVL, 0);
-#endif
args->response_size = sizeof(*r);
return EC_RES_SUCCESS;