summaryrefslogtreecommitdiff
path: root/driver/usb_mux
diff options
context:
space:
mode:
Diffstat (limited to 'driver/usb_mux')
-rw-r--r--driver/usb_mux/amd_fp5.c36
-rw-r--r--driver/usb_mux/amd_fp5.h3
-rw-r--r--driver/usb_mux/anx7440.c24
-rw-r--r--driver/usb_mux/it5205.c28
-rw-r--r--driver/usb_mux/pi3usb3x532.c30
-rw-r--r--driver/usb_mux/ps874x.c35
-rw-r--r--driver/usb_mux/usb_mux.c156
-rw-r--r--driver/usb_mux/virtual.c14
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, &reg);
+ res = anx7440_read(me, ANX7440_REG_CHIP_CTRL, &reg);
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, &reg);
+ res = anx7440_read(me, ANX7440_REG_CHIP_CTRL, &reg);
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, &reg);
+ ret = it5205_read(me, IT5205_REG_MUXCR, &reg);
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, &reg);
+ res = pi3usb3x532_read(me, PI3USB3X532_REG_CONTROL, &reg);
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, &reg);
+ res = ps874x_read(me, PS874X_REG_STATUS, &reg);
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) |