diff options
Diffstat (limited to 'driver/usb_mux')
-rw-r--r-- | driver/usb_mux/amd_fp5.c | 36 | ||||
-rw-r--r-- | driver/usb_mux/amd_fp5.h | 3 | ||||
-rw-r--r-- | driver/usb_mux/anx7440.c | 24 | ||||
-rw-r--r-- | driver/usb_mux/it5205.c | 28 | ||||
-rw-r--r-- | driver/usb_mux/pi3usb3x532.c | 30 | ||||
-rw-r--r-- | driver/usb_mux/ps874x.c | 35 | ||||
-rw-r--r-- | driver/usb_mux/usb_mux.c | 156 | ||||
-rw-r--r-- | driver/usb_mux/virtual.c | 14 |
8 files changed, 166 insertions, 160 deletions
diff --git a/driver/usb_mux/amd_fp5.c b/driver/usb_mux/amd_fp5.c index 3258552b49..1f61f7c765 100644 --- a/driver/usb_mux/amd_fp5.c +++ b/driver/usb_mux/amd_fp5.c @@ -11,7 +11,7 @@ #include "i2c.h" #include "usb_mux.h" -static inline int amd_fp5_mux_read(int port, uint8_t *val) +static inline int amd_fp5_mux_read(const struct usb_mux *me, uint8_t *val) { uint8_t buf[3] = { 0 }; int rv; @@ -21,23 +21,23 @@ static inline int amd_fp5_mux_read(int port, uint8_t *val) if (rv) return rv; - *val = buf[port + 1]; + *val = buf[me->usb_port + 1]; return EC_SUCCESS; } -static inline int amd_fp5_mux_write(int port, uint8_t val) +static inline int amd_fp5_mux_write(const struct usb_mux *me, uint8_t val) { return i2c_write8(I2C_PORT_USB_MUX, AMD_FP5_MUX_I2C_ADDR_FLAGS, - port, val); + me->usb_port, val); } -static int amd_fp5_init(int port) +static int amd_fp5_init(const struct usb_mux *me) { return EC_SUCCESS; } -static int amd_fp5_set_mux(int port, mux_state_t mux_state) +static int amd_fp5_set_mux(const struct usb_mux *me, mux_state_t mux_state) { uint8_t val = 0; @@ -63,10 +63,10 @@ static int amd_fp5_set_mux(int port, mux_state_t mux_state) val = (mux_state & USB_PD_MUX_POLARITY_INVERTED) ? AMD_FP5_MUX_DP_INVERTED : AMD_FP5_MUX_DP; - return amd_fp5_mux_write(port, val); + return amd_fp5_mux_write(me, val); } -static int amd_fp5_get_mux(int port, mux_state_t *mux_state) +static int amd_fp5_get_mux(const struct usb_mux *me, mux_state_t *mux_state) { uint8_t val = AMD_FP5_MUX_SAFE; @@ -78,12 +78,11 @@ static int amd_fp5_get_mux(int port, mux_state_t *mux_state) if (!chipset_in_state(CHIPSET_STATE_HARD_OFF)) { int rv; - rv = amd_fp5_mux_read(port, &val); + rv = amd_fp5_mux_read(me, &val); if (rv) return rv; } - switch (val) { case AMD_FP5_MUX_USB: *mux_state = USB_PD_MUX_USB_ENABLED; @@ -115,19 +114,8 @@ static int amd_fp5_get_mux(int port, mux_state_t *mux_state) return EC_SUCCESS; } -/* - * The FP5 MUX can look like a retimer or a MUX. So create both tables - * and use them as needed, until retimers become a type of MUX and - * then we will only need one of these tables. - * - * TODO(b:147593660) Cleanup of retimers as muxes in a more - * generalized mechanism - */ -const struct usb_retimer_driver amd_fp5_usb_retimer = { - .set = amd_fp5_set_mux, -}; const struct usb_mux_driver amd_fp5_usb_mux_driver = { - .init = amd_fp5_init, - .set = amd_fp5_set_mux, - .get = amd_fp5_get_mux, + .init = &amd_fp5_init, + .set = &amd_fp5_set_mux, + .get = &amd_fp5_get_mux, }; diff --git a/driver/usb_mux/amd_fp5.h b/driver/usb_mux/amd_fp5.h index ac1a7ce27e..7534ea0d8a 100644 --- a/driver/usb_mux/amd_fp5.h +++ b/driver/usb_mux/amd_fp5.h @@ -18,7 +18,4 @@ #define AMD_FP5_MUX_DP 0x0C #define AMD_FP5_MUX_DP_INVERTED 0x1C -extern const struct usb_mux_driver amd_fp5_usb_mux_driver; -extern const struct usb_retimer_driver amd_fp5_usb_retimer; - #endif /* __CROS_EC_USB_MUX_AMD_FP5_H */ diff --git a/driver/usb_mux/anx7440.c b/driver/usb_mux/anx7440.c index 1c9633c536..df3a9c2682 100644 --- a/driver/usb_mux/anx7440.c +++ b/driver/usb_mux/anx7440.c @@ -16,14 +16,16 @@ #define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ## args) #define CPRINTF(format, args...) cprintf(CC_USBCHARGE, format, ## args) -static inline int anx7440_read(int port, uint8_t reg, int *val) +static inline int anx7440_read(const struct usb_mux *me, + uint8_t reg, int *val) { - return i2c_read8(I2C_PORT_USB_MUX, MUX_ADDR(port), reg, val); + return i2c_read8(me->i2c_port, me->i2c_addr_flags, reg, val); } -static inline int anx7440_write(int port, uint8_t reg, uint8_t val) +static inline int anx7440_write(const struct usb_mux *me, + uint8_t reg, uint8_t val) { - return i2c_write8(I2C_PORT_USB_MUX, MUX_ADDR(port), reg, val); + return i2c_write8(me->i2c_port, me->i2c_addr_flags, reg, val); } struct anx7440_id_t { @@ -39,7 +41,7 @@ static const struct anx7440_id_t anx7440_device_ids[] = { { ANX7440_DEVICE_VERSION, ANX7440_REG_DEVICE_VERSION }, }; -static int anx7440_init(int port) +static int anx7440_init(const struct usb_mux *me) { int i; int val; @@ -47,7 +49,7 @@ static int anx7440_init(int port) /* Verify device id / version registers */ for (i = 0; i < ARRAY_SIZE(anx7440_device_ids); i++) { - res = anx7440_read(port, anx7440_device_ids[i].reg, &val); + res = anx7440_read(me, anx7440_device_ids[i].reg, &val); if (res) return res; @@ -59,11 +61,11 @@ static int anx7440_init(int port) } /* Writes control register to set switch mode */ -static int anx7440_set_mux(int port, mux_state_t mux_state) +static int anx7440_set_mux(const struct usb_mux *me, mux_state_t mux_state) { int reg, res; - res = anx7440_read(port, ANX7440_REG_CHIP_CTRL, ®); + res = anx7440_read(me, ANX7440_REG_CHIP_CTRL, ®); if (res) return res; @@ -75,16 +77,16 @@ static int anx7440_set_mux(int port, mux_state_t mux_state) if (mux_state & USB_PD_MUX_POLARITY_INVERTED) reg |= ANX7440_CHIP_CTRL_SW_FLIP; - return anx7440_write(port, ANX7440_REG_CHIP_CTRL, reg); + return anx7440_write(me, ANX7440_REG_CHIP_CTRL, reg); } /* Reads control register and updates mux_state accordingly */ -static int anx7440_get_mux(int port, mux_state_t *mux_state) +static int anx7440_get_mux(const struct usb_mux *me, mux_state_t *mux_state) { int reg, res; *mux_state = 0; - res = anx7440_read(port, ANX7440_REG_CHIP_CTRL, ®); + res = anx7440_read(me, ANX7440_REG_CHIP_CTRL, ®); if (res) return res; diff --git a/driver/usb_mux/it5205.c b/driver/usb_mux/it5205.c index e7911b80e3..95416547cd 100644 --- a/driver/usb_mux/it5205.c +++ b/driver/usb_mux/it5205.c @@ -14,14 +14,14 @@ #define MUX_STATE_DP_USB_MASK (USB_PD_MUX_USB_ENABLED | USB_PD_MUX_DP_ENABLED) -static int it5205_read(int port, uint8_t reg, int *val) +static int it5205_read(const struct usb_mux *me, uint8_t reg, int *val) { - return i2c_read8(I2C_PORT_USB_MUX, MUX_ADDR(port), reg, val); + return i2c_read8(me->i2c_port, me->i2c_addr_flags, reg, val); } -static int it5205_write(int port, uint8_t reg, uint8_t val) +static int it5205_write(const struct usb_mux *me, uint8_t reg, uint8_t val) { - return i2c_write8(I2C_PORT_USB_MUX, MUX_ADDR(port), reg, val); + return i2c_write8(me->i2c_port, me->i2c_addr_flags, reg, val); } struct mux_chip_id_t { @@ -36,17 +36,17 @@ static const struct mux_chip_id_t mux_chip_id_verify[] = { { '5', IT5205_REG_CHIP_ID0}, }; -static int it5205_init(int port) +static int it5205_init(const struct usb_mux *me) { int i, val, ret; /* bit[0]: mux power on, bit[7-1]: reserved. */ - ret = it5205_write(port, IT5205_REG_MUXPDR, 0); + ret = it5205_write(me, IT5205_REG_MUXPDR, 0); if (ret) return ret; /* Verify chip ID registers. */ for (i = 0; i < ARRAY_SIZE(mux_chip_id_verify); i++) { - ret = it5205_read(port, mux_chip_id_verify[i].reg, &val); + ret = it5205_read(me, mux_chip_id_verify[i].reg, &val); if (ret) return ret; @@ -58,7 +58,7 @@ static int it5205_init(int port) } /* Writes control register to set switch mode */ -static int it5205_set_mux(int port, mux_state_t mux_state) +static int it5205_set_mux(const struct usb_mux *me, mux_state_t mux_state) { uint8_t reg; @@ -80,15 +80,15 @@ static int it5205_set_mux(int port, mux_state_t mux_state) if (mux_state & USB_PD_MUX_POLARITY_INVERTED) reg |= IT5205_POLARITY_INVERTED; - return it5205_write(port, IT5205_REG_MUXCR, reg); + return it5205_write(me, IT5205_REG_MUXCR, reg); } /* Reads control register and updates mux_state accordingly */ -static int it5205_get_mux(int port, mux_state_t *mux_state) +static int it5205_get_mux(const struct usb_mux *me, mux_state_t *mux_state) { int reg, ret; - ret = it5205_read(port, IT5205_REG_MUXCR, ®); + ret = it5205_read(me, IT5205_REG_MUXCR, ®); if (ret) return ret; @@ -113,18 +113,18 @@ static int it5205_get_mux(int port, mux_state_t *mux_state) return EC_SUCCESS; } -static int it5205_enter_low_power_mode(int port) +static int it5205_enter_low_power_mode(const struct usb_mux *me) { int rv; /* Turn off all switches */ - rv = it5205_write(port, IT5205_REG_MUXCR, 0); + rv = it5205_write(me, IT5205_REG_MUXCR, 0); if (rv) return rv; /* Power down mux */ - return it5205_write(port, IT5205_REG_MUXPDR, IT5205_MUX_POWER_DOWN); + return it5205_write(me, IT5205_REG_MUXPDR, IT5205_MUX_POWER_DOWN); } const struct usb_mux_driver it5205_usb_mux_driver = { diff --git a/driver/usb_mux/pi3usb3x532.c b/driver/usb_mux/pi3usb3x532.c index bf6d1f5a01..c3d22b8f61 100644 --- a/driver/usb_mux/pi3usb3x532.c +++ b/driver/usb_mux/pi3usb3x532.c @@ -11,7 +11,8 @@ #include "usb_mux.h" #include "util.h" -static int pi3usb3x532_read(int port, uint8_t reg, uint8_t *val) +static int pi3usb3x532_read(const struct usb_mux *me, + uint8_t reg, uint8_t *val) { int read, res; @@ -20,7 +21,7 @@ static int pi3usb3x532_read(int port, uint8_t reg, uint8_t *val) * Second byte read will be vendor ID. * Third byte read will be selection control. */ - res = i2c_read16(MUX_PORT(port), MUX_ADDR(port), 0, &read); + res = i2c_read16(me->i2c_port, me->i2c_addr_flags, 0, &read); if (res) return res; @@ -32,32 +33,33 @@ static int pi3usb3x532_read(int port, uint8_t reg, uint8_t *val) return EC_SUCCESS; } -static int pi3usb3x532_write(int port, uint8_t reg, uint8_t val) +static int pi3usb3x532_write(const struct usb_mux *me, + uint8_t reg, uint8_t val) { if (reg != PI3USB3X532_REG_CONTROL) return EC_ERROR_UNKNOWN; - return i2c_write8(MUX_PORT(port), MUX_ADDR(port), 0, val); + return i2c_write8(me->i2c_port, me->i2c_addr_flags, 0, val); } -static int pi3usb3x532_reset(int port) +static int pi3usb3x532_reset(const struct usb_mux *me) { return pi3usb3x532_write( - port, + me, PI3USB3X532_REG_CONTROL, (PI3USB3X532_MODE_POWERDOWN & PI3USB3X532_CTRL_MASK) | PI3USB3X532_CTRL_RSVD); } -static int pi3usb3x532_init(int port) +static int pi3usb3x532_init(const struct usb_mux *me) { uint8_t val; int res; - res = pi3usb3x532_reset(port); + res = pi3usb3x532_reset(me); if (res) return res; - res = pi3usb3x532_read(port, PI3USB3X532_REG_VENDOR, &val); + res = pi3usb3x532_read(me, PI3USB3X532_REG_VENDOR, &val); if (res) return res; if (val != PI3USB3X532_VENDOR_ID) @@ -67,7 +69,8 @@ static int pi3usb3x532_init(int port) } /* Writes control register to set switch mode */ -static int pi3usb3x532_set_mux(int port, mux_state_t mux_state) +static int pi3usb3x532_set_mux(const struct usb_mux *me, + mux_state_t mux_state) { uint8_t reg = 0; @@ -78,18 +81,19 @@ static int pi3usb3x532_set_mux(int port, mux_state_t mux_state) if (mux_state & USB_PD_MUX_POLARITY_INVERTED) reg |= PI3USB3X532_BIT_SWAP; - return pi3usb3x532_write(port, PI3USB3X532_REG_CONTROL, + return pi3usb3x532_write(me, PI3USB3X532_REG_CONTROL, reg | PI3USB3X532_CTRL_RSVD); } /* Reads control register and updates mux_state accordingly */ -static int pi3usb3x532_get_mux(int port, mux_state_t *mux_state) +static int pi3usb3x532_get_mux(const struct usb_mux *me, + mux_state_t *mux_state) { uint8_t reg = 0; uint8_t res; *mux_state = 0; - res = pi3usb3x532_read(port, PI3USB3X532_REG_CONTROL, ®); + res = pi3usb3x532_read(me, PI3USB3X532_REG_CONTROL, ®); if (res) return res; diff --git a/driver/usb_mux/ps874x.c b/driver/usb_mux/ps874x.c index 08f526d28a..fedb06b27c 100644 --- a/driver/usb_mux/ps874x.c +++ b/driver/usb_mux/ps874x.c @@ -11,32 +11,34 @@ #include "usb_mux.h" #include "util.h" -static inline int ps874x_read(int port, uint8_t reg, int *val) +static inline int ps874x_read(const struct usb_mux *me, + uint8_t reg, int *val) { - return i2c_read8(I2C_PORT_USB_MUX, MUX_ADDR(port), + return i2c_read8(me->i2c_port, me->i2c_addr_flags, reg, val); } -static inline int ps874x_write(int port, uint8_t reg, uint8_t val) +static inline int ps874x_write(const struct usb_mux *me, + uint8_t reg, uint8_t val) { - return i2c_write8(I2C_PORT_USB_MUX, MUX_ADDR(port), + return i2c_write8(me->i2c_port, me->i2c_addr_flags, reg, val); } -static int ps874x_init(int port) +static int ps874x_init(const struct usb_mux *me) { int val; int res; /* Reset chip back to power-on state */ - res = ps874x_write(port, PS874X_REG_MODE, PS874X_MODE_POWER_DOWN); + res = ps874x_write(me, PS874X_REG_MODE, PS874X_MODE_POWER_DOWN); if (res) return res; /* * Verify revision / chip ID registers. */ - res = ps874x_read(port, PS874X_REG_REVISION_ID1, &val); + res = ps874x_read(me, PS874X_REG_REVISION_ID1, &val); if (res) return res; @@ -52,19 +54,19 @@ static int ps874x_init(int port) return EC_ERROR_UNKNOWN; #endif - res = ps874x_read(port, PS874X_REG_REVISION_ID2, &val); + res = ps874x_read(me, PS874X_REG_REVISION_ID2, &val); if (res) return res; if (val != PS874X_REVISION_ID2) return EC_ERROR_UNKNOWN; - res = ps874x_read(port, PS874X_REG_CHIP_ID1, &val); + res = ps874x_read(me, PS874X_REG_CHIP_ID1, &val); if (res) return res; if (val != PS874X_CHIP_ID1) return EC_ERROR_UNKNOWN; - res = ps874x_read(port, PS874X_REG_CHIP_ID2, &val); + res = ps874x_read(me, PS874X_REG_CHIP_ID2, &val); if (res) return res; if (val != PS874X_CHIP_ID2) @@ -74,7 +76,7 @@ static int ps874x_init(int port) } /* Writes control register to set switch mode */ -static int ps874x_set_mux(int port, mux_state_t mux_state) +static int ps874x_set_mux(const struct usb_mux *me, mux_state_t mux_state) { uint8_t reg = 0; @@ -85,16 +87,16 @@ static int ps874x_set_mux(int port, mux_state_t mux_state) if (mux_state & USB_PD_MUX_POLARITY_INVERTED) reg |= PS874X_MODE_POLARITY_INVERTED; - return ps874x_write(port, PS874X_REG_MODE, reg); + return ps874x_write(me, PS874X_REG_MODE, reg); } /* Reads control register and updates mux_state accordingly */ -static int ps874x_get_mux(int port, mux_state_t *mux_state) +static int ps874x_get_mux(const struct usb_mux *me, mux_state_t *mux_state) { int reg; int res; - res = ps874x_read(port, PS874X_REG_STATUS, ®); + res = ps874x_read(me, PS874X_REG_STATUS, ®); if (res) return res; @@ -113,9 +115,10 @@ static int ps874x_get_mux(int port, mux_state_t *mux_state) int ps874x_tune_usb_eq(int port, uint8_t tx, uint8_t rx) { int ret; + const struct usb_mux *me = &usb_muxes[port]; - ret = ps874x_write(port, PS874X_REG_USB_EQ_TX, tx); - ret |= ps874x_write(port, PS874X_REG_USB_EQ_RX, rx); + ret = ps874x_write(me, PS874X_REG_USB_EQ_TX, tx); + ret |= ps874x_write(me, PS874X_REG_USB_EQ_RX, rx); return ret; } diff --git a/driver/usb_mux/usb_mux.c b/driver/usb_mux/usb_mux.c index 5bf057ed91..3d629a6ab0 100644 --- a/driver/usb_mux/usb_mux.c +++ b/driver/usb_mux/usb_mux.c @@ -32,100 +32,107 @@ enum mux_config_type { USB_MUX_GET_MODE, }; -/* Configure the retimer */ -static int configure_retimer(int port, enum mux_config_type config, - mux_state_t mux_state) +/* Configure the MUX */ +static int configure_mux(int port, + enum mux_config_type config, + mux_state_t *mux_state) { - int res = 0; + int rv = EC_SUCCESS; + const struct usb_mux *mux_ptr; + + if (config == USB_MUX_SET_MODE || + config == USB_MUX_GET_MODE) { + if (mux_state == NULL) + return EC_ERROR_INVAL; - if (IS_ENABLED(CONFIG_USBC_MUX_RETIMER)) { - const struct usb_retimer *retimer = &usb_retimers[port]; + if (config == USB_MUX_GET_MODE) + *mux_state = USB_PD_MUX_NONE; + } - if (!retimer->driver) - return 0; + /* + * a MUX for a particular port can be a linked list chain of + * MUXes. So when we change one, we traverse the whole list + * to make sure they are all updated appropriately. + */ + for (mux_ptr = &usb_muxes[port]; + rv == EC_SUCCESS && mux_ptr != NULL; + mux_ptr = mux_ptr->next_mux) { + mux_state_t lcl_state; + const struct usb_mux_driver *drv = mux_ptr->driver; switch (config) { case USB_MUX_INIT: - if (retimer->driver->init) - res = retimer->driver->init(port); + if (drv && drv->init) { + rv = drv->init(mux_ptr); + if (rv) + break; + } + + /* Apply board specific initialization */ + if (mux_ptr->board_init) + rv = mux_ptr->board_init(mux_ptr); + break; + case USB_MUX_LOW_POWER: - if (retimer->driver->enter_low_power_mode) - res = retimer->driver->enter_low_power_mode( - port); + if (drv && drv->enter_low_power_mode) + rv = drv->enter_low_power_mode(mux_ptr); + break; + case USB_MUX_SET_MODE: - if (retimer->driver->set) - res = retimer->driver->set(port, mux_state); - break; - default: - break; - } - } + lcl_state = *mux_state; - return res; -} + if (mux_ptr->flags & USB_MUX_FLAG_SET_WITHOUT_FLIP) + lcl_state &= ~USB_PD_MUX_POLARITY_INVERTED; -/* Configure the MUX */ -static int configure_mux(int port, enum mux_config_type config, - mux_state_t *mux_state) -{ - const struct usb_mux *mux = &usb_muxes[port]; - int res; + if (drv && drv->set) { + rv = drv->set(mux_ptr, lcl_state); + if (rv) + break; + } - switch (config) { - case USB_MUX_INIT: - res = mux->driver->init(port); - if (res) - break; + /* Apply board specific setting */ + if (mux_ptr->board_set) + rv = mux_ptr->board_set(mux_ptr, lcl_state); - res = configure_retimer(port, config, USB_PD_MUX_NONE); - if (res) break; - /* Apply board specific initialization */ - if (mux->board_init) - res = mux->board_init(port); - - break; - case USB_MUX_LOW_POWER: - if (mux->driver->enter_low_power_mode) { - res = mux->driver->enter_low_power_mode(port); - if (res) - break; - } - res = configure_retimer(port, config, USB_PD_MUX_NONE); - break; - case USB_MUX_SET_MODE: - res = mux->driver->set(port, *mux_state); - if (res) + case USB_MUX_GET_MODE: + /* + * This is doing a GET_CC on all of the MUXes in the + * chain and ORing them together. This will make sure + * if one of the MUX values has FLIP turned off that + * we will end up with the correct value in the end. + */ + if (drv && drv->get) { + rv = drv->get(mux_ptr, &lcl_state); + if (rv) + break; + *mux_state |= lcl_state; + } break; - res = configure_retimer(port, config, *mux_state); - break; - case USB_MUX_GET_MODE: - res = mux->driver->get(port, mux_state); - break; + } } - if (res) - CPRINTS("mux config:%d, port:%d, res:%d", config, port, res); + if (rv) + CPRINTS("mux config:%d, port:%d, rv:%d", + config, port, rv); - return res; + return rv; } static void enter_low_power_mode(int port) { - mux_state_t mux_state = USB_PD_MUX_NONE; - /* - * Set LPM flag regardless of method presence or method failure. We want - * know know that we tried to put the device in low power mode so we can - * re-initialize the device on the next access. + * Set LPM flag regardless of method presence or method failure. We + * want know know that we tried to put the device in low power mode + * so we can re-initialize the device on the next access. */ flags[port] |= USB_MUX_FLAG_IN_LPM; /* Apply any low power customization if present */ - configure_mux(port, USB_MUX_LOW_POWER, &mux_state); + configure_mux(port, USB_MUX_LOW_POWER, NULL); } static inline void exit_low_power_mode(int port) @@ -137,11 +144,9 @@ static inline void exit_low_power_mode(int port) void usb_mux_init(int port) { - mux_state_t mux_state = USB_PD_MUX_NONE; - ASSERT(port >= 0 && port < CONFIG_USB_PD_PORT_MAX_COUNT); - configure_mux(port, USB_MUX_INIT, &mux_state); + configure_mux(port, USB_MUX_INIT, NULL); /* Device is always out of LPM after initialization. */ flags[port] &= ~USB_MUX_FLAG_IN_LPM; @@ -225,16 +230,17 @@ void usb_mux_flip(int port) void usb_mux_hpd_update(int port, int hpd_lvl, int hpd_irq) { - const struct usb_mux *mux = &usb_muxes[port]; mux_state_t mux_state; + const struct usb_mux *mux_ptr = &usb_muxes[port]; - if (mux->hpd_update) - mux->hpd_update(port, hpd_lvl, hpd_irq); + for (; mux_ptr; mux_ptr = mux_ptr->next_mux) + if (mux_ptr->hpd_update) + mux_ptr->hpd_update(mux_ptr, hpd_lvl, hpd_irq); if (!configure_mux(port, USB_MUX_GET_MODE, &mux_state)) { mux_state |= (hpd_lvl ? USB_PD_MUX_HPD_LVL : 0) | - (hpd_irq ? USB_PD_MUX_HPD_IRQ : 0); - configure_retimer(port, USB_MUX_SET_MODE, mux_state); + (hpd_irq ? USB_PD_MUX_HPD_IRQ : 0); + configure_mux(port, USB_MUX_SET_MODE, &mux_state); } } @@ -297,7 +303,7 @@ static enum ec_status hc_usb_pd_mux_info(struct host_cmd_handler_args *args) const struct ec_params_usb_pd_mux_info *p = args->params; struct ec_response_usb_pd_mux_info *r = args->response; int port = p->port; - const struct usb_mux *mux = &usb_muxes[port]; + const struct usb_mux *me = &usb_muxes[port]; mux_state_t mux_state; if (port >= board_get_usb_pd_port_count()) @@ -311,7 +317,7 @@ static enum ec_status hc_usb_pd_mux_info(struct host_cmd_handler_args *args) /* Clear HPD IRQ event since we're about to inform host of it. */ if (IS_ENABLED(CONFIG_USB_MUX_VIRTUAL) && (r->flags & USB_PD_MUX_HPD_IRQ) && - (mux->hpd_update == &virtual_hpd_update)) { + (me->hpd_update == &virtual_hpd_update)) { usb_mux_hpd_update(port, r->flags & USB_PD_MUX_HPD_LVL, 0); } diff --git a/driver/usb_mux/virtual.c b/driver/usb_mux/virtual.c index 6f80157deb..5a2f4a62d3 100644 --- a/driver/usb_mux/virtual.c +++ b/driver/usb_mux/virtual.c @@ -33,7 +33,7 @@ static inline void virtual_mux_update_state(int port, mux_state_t mux_state) } } -static int virtual_init(int port) +static int virtual_init(const struct usb_mux *me) { return EC_SUCCESS; } @@ -42,8 +42,10 @@ static int virtual_init(int port) * Set the state of our 'virtual' mux. The EC does not actually control this * mux, so update the desired state, then notify the host of the update. */ -static int virtual_set_mux(int port, mux_state_t mux_state) +static int virtual_set_mux(const struct usb_mux *me, mux_state_t mux_state) { + int port = me->usb_port; + /* Current USB & DP mux status + existing HPD related mux status */ mux_state_t new_mux_state = (mux_state & ~USB_PD_MUX_HPD_STATE) | (virtual_mux_state[port] & USB_PD_MUX_HPD_STATE); @@ -58,15 +60,19 @@ static int virtual_set_mux(int port, mux_state_t mux_state) * control this mux, and the EC has no way of knowing its actual status, * we return the desired state here. */ -static int virtual_get_mux(int port, mux_state_t *mux_state) +static int virtual_get_mux(const struct usb_mux *me, mux_state_t *mux_state) { + int port = me->usb_port; + *mux_state = virtual_mux_state[port]; return EC_SUCCESS; } -void virtual_hpd_update(int port, int hpd_lvl, int hpd_irq) +void virtual_hpd_update(const struct usb_mux *me, int hpd_lvl, int hpd_irq) { + int port = me->usb_port; + /* Current HPD related mux status + existing USB & DP mux status */ mux_state_t new_mux_state = (hpd_lvl ? USB_PD_MUX_HPD_LVL : 0) | (hpd_irq ? USB_PD_MUX_HPD_IRQ : 0) | |