summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomasz Michalec <tm@semihalf.com>2022-07-01 16:40:11 +0200
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-09-13 11:10:58 +0000
commitc0601ea736d191af111132bd9ad75e2ecad3067d (patch)
treedc5b45fe36e1ee1a8691d05542fb9017c72d975f
parent99990795d8452d13fd678da7245e041f0b9e6ba7 (diff)
downloadchrome-ec-c0601ea736d191af111132bd9ad75e2ecad3067d.tar.gz
usb_mux: Split struct usb_mux in common files
Split struct usb_mux into struct usb_mux_chain and struct usb_mux. The first structure is linked list to construct USB muxes chain and has pointer to struct usb_mux. New struct usb_mux contains only information about mux itself, not it position in the chain. This is first CL and it changes common EC files. LOW_COVERAGE_REASON=no emulator for some of the muxes set up yet BUG=b:236274003 TEST=zmake build -a TEST=./twister -T zephyr/test TEST=make buildall BRANCH=None Cq-Depend: chromium:3779618, chromium:3779619, chromium:3779620 Cq-Depend: chromium:3779621, chromium:3779622, chromium:3779623 Cq-Depend: chromium:3779624, chromium:3779625, chromium:3779626 Cq-Depend: chromium:3779627, chromium:3779628, chromium:3779629 Cq-Depend: chromium:3779630, chromium:3779631, chromium:3779632 Cq-Depend: chromium:3779633, chromium:3779634, chromium:3779635 Cq-Depend: chromium:3779636, chromium:3780397, chromium:3780398 Cq-Depend: chromium:3780399, chromium:3780400, chromium:3780401 Cq-Depend: chromium:3780402, chromium:3780403, chromium:3780404 Cq-Depend: chromium:3780405, chromium:3780406, chromium:3780407 Cq-Depend: chromium:3780408, chromium:3780409, chromium:3780410 Cq-Depend: chromium:3780411, chromium:3780412, chromium:3780413 Signed-off-by: Tomasz Michalec <tm@semihalf.com> Change-Id: Ida64c87b8194dbf4a1273d66aaa773a21b2cff87 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3748785 Commit-Queue: Tomasz Michalec <tmichalec@google.com> Tested-by: Tomasz Michalec <tmichalec@google.com> Reviewed-by: Keith Short <keithshort@chromium.org> Code-Coverage: Tomasz Michalec <tmichalec@google.com>
-rw-r--r--driver/retimer/bb_retimer.c13
-rw-r--r--driver/retimer/kb800x.c13
-rw-r--r--driver/tcpm/anx7447.c14
-rw-r--r--driver/tcpm/anx74xx.c10
-rw-r--r--driver/usb_mux/anx3443.c10
-rw-r--r--driver/usb_mux/ps8743.c4
-rw-r--r--driver/usb_mux/usb_mux.c24
-rw-r--r--include/usb_mux.h16
8 files changed, 61 insertions, 43 deletions
diff --git a/driver/retimer/bb_retimer.c b/driver/retimer/bb_retimer.c
index c3a55733c3..897541bfc2 100644
--- a/driver/retimer/bb_retimer.c
+++ b/driver/retimer/bb_retimer.c
@@ -638,6 +638,7 @@ static int console_command_bb_retimer(int argc, const char **argv)
int port, reg, data, val = 0;
int rv = EC_SUCCESS;
const struct usb_mux *mux;
+ const struct usb_mux_chain *mux_chain;
if (argc < 4)
return EC_ERROR_PARAM_COUNT;
@@ -647,14 +648,15 @@ static int console_command_bb_retimer(int argc, const char **argv)
if (*e || !board_is_usb_pd_port_present(port))
return EC_ERROR_PARAM1;
- mux = &usb_muxes[port];
- while (mux) {
+ mux_chain = &usb_muxes[port];
+ while (mux_chain) {
+ mux = mux_chain->mux;
if (mux->driver == &bb_usb_retimer)
break;
- mux = mux->next_mux;
+ mux_chain = mux_chain->next;
}
- if (!mux)
+ if (!mux_chain)
return EC_ERROR_PARAM1;
/* Validate r/w selection */
@@ -674,7 +676,8 @@ static int console_command_bb_retimer(int argc, const char **argv)
return EC_ERROR_PARAM4;
}
- for (; mux != NULL; mux = mux->next_mux) {
+ for (; mux_chain != NULL; mux_chain = mux_chain->next) {
+ mux = mux_chain->mux;
if (mux->driver == &bb_usb_retimer) {
if (rw == 'r')
rv = bb_retimer_read(mux, reg, &data);
diff --git a/driver/retimer/kb800x.c b/driver/retimer/kb800x.c
index 9470e49289..35ab5b183d 100644
--- a/driver/retimer/kb800x.c
+++ b/driver/retimer/kb800x.c
@@ -479,6 +479,7 @@ static int console_command_kb800x_xfer(int argc, const char **argv)
char rw, *e;
int rv, port, reg, val;
uint8_t data;
+ const struct usb_mux_chain *mux_chain;
const struct usb_mux *mux;
if (argc < 4)
@@ -489,16 +490,18 @@ static int console_command_kb800x_xfer(int argc, const char **argv)
if (*e || !board_is_usb_pd_port_present(port))
return EC_ERROR_PARAM1;
- mux = &usb_muxes[port];
- while (mux) {
- if (mux->driver == &kb800x_usb_mux_driver)
+ mux_chain = &usb_muxes[port];
+ while (mux_chain) {
+ if (mux_chain->mux->driver == &kb800x_usb_mux_driver)
break;
- mux = mux->next_mux;
+ mux_chain = mux_chain->next;
}
- if (!mux)
+ if (!mux_chain)
return EC_ERROR_PARAM1;
+ mux = mux_chain->mux;
+
/* Validate r/w selection */
rw = argv[2][0];
if (rw != 'w' && rw != 'r')
diff --git a/driver/tcpm/anx7447.c b/driver/tcpm/anx7447.c
index f864278cbc..c21b4cdf2f 100644
--- a/driver/tcpm/anx7447.c
+++ b/driver/tcpm/anx7447.c
@@ -286,7 +286,7 @@ DECLARE_CONSOLE_COMMAND(anx_ocm, command_anx_ocm, "port [erase]",
static int anx7447_init(int port)
{
int rv, reg, i;
- const struct usb_mux *me = &usb_muxes[port];
+ const struct usb_mux_chain *me = &usb_muxes[port];
bool unused;
ASSERT(port < CONFIG_USB_PD_PORT_MAX_COUNT);
@@ -384,15 +384,15 @@ static int anx7447_init(int port)
* Run mux_set() here for considering CCD(Case-Closed Debugging) case
* If this TCPC is not also the MUX then don't initialize to NONE
*/
- while ((me != NULL) && (me->driver != &anx7447_usb_mux_driver))
- me = me->next_mux;
+ while ((me != NULL) && (me->mux->driver != &anx7447_usb_mux_driver))
+ me = me->next;
/*
* Note that bypassing the usb_mux API is okay for internal driver calls
* since the task calling init already holds this port's mux lock.
*/
- if (me != NULL && !(me->flags & USB_MUX_FLAG_NOT_TCPC))
- rv = anx7447_mux_set(me, USB_PD_MUX_NONE, &unused);
+ if (me != NULL && !(me->mux->flags & USB_MUX_FLAG_NOT_TCPC))
+ rv = anx7447_mux_set(me->mux, USB_PD_MUX_NONE, &unused);
#endif /* CONFIG_USB_PD_TCPM_MUX */
return rv;
@@ -631,7 +631,7 @@ static int anx7447_mux_init(const struct usb_mux *me)
const uint16_t tcpc_i2c_addr =
I2C_STRIP_FLAGS(tcpc_config[me->usb_port].i2c_info.addr_flags);
const uint16_t mux_i2c_addr =
- I2C_STRIP_FLAGS(usb_muxes[port].i2c_addr_flags);
+ I2C_STRIP_FLAGS(usb_muxes[port].mux->i2c_addr_flags);
/*
* find corresponding anx7447 SPI address according to
@@ -650,7 +650,7 @@ static int anx7447_mux_init(const struct usb_mux *me)
}
if (!I2C_STRIP_FLAGS(anx[port].i2c_addr_flags)) {
ccprintf("TCPC I2C addr 0x%x is invalid for ANX7447\n",
- I2C_STRIP_FLAGS(usb_muxes[port].i2c_addr_flags));
+ I2C_STRIP_FLAGS(usb_muxes[port].mux->i2c_addr_flags));
return EC_ERROR_UNKNOWN;
}
diff --git a/driver/tcpm/anx74xx.c b/driver/tcpm/anx74xx.c
index 7f676dd378..ed43061c62 100644
--- a/driver/tcpm/anx74xx.c
+++ b/driver/tcpm/anx74xx.c
@@ -292,7 +292,7 @@ static int anx74xx_tcpm_mux_init(const struct usb_mux *me)
static int anx74xx_tcpm_mux_enter_safe_mode(int port)
{
int reg;
- const struct usb_mux *me = &usb_muxes[port];
+ const struct usb_mux *me = usb_muxes[port].mux;
if (mux_read(me, ANX74XX_REG_ANALOG_CTRL_2, &reg))
return EC_ERROR_UNKNOWN;
@@ -306,7 +306,7 @@ static int anx74xx_tcpm_mux_enter_safe_mode(int port)
static int anx74xx_tcpm_mux_exit_safe_mode(int port)
{
int reg;
- const struct usb_mux *me = &usb_muxes[port];
+ const struct usb_mux *me = usb_muxes[port].mux;
if (mux_read(me, ANX74XX_REG_ANALOG_CTRL_2, &reg))
return EC_ERROR_UNKNOWN;
@@ -320,7 +320,7 @@ static int anx74xx_tcpm_mux_exit_safe_mode(int port)
static int anx74xx_tcpm_mux_exit(int port)
{
int reg;
- const struct usb_mux *me = &usb_muxes[port];
+ const struct usb_mux *me = usb_muxes[port].mux;
/*
* Safe mode must be entered before any changes are made to the mux
@@ -360,7 +360,7 @@ static int anx74xx_mux_aux_to_sbu(int port, int polarity, int enabled)
int reg;
const int aux_mask = ANX74XX_REG_AUX_SWAP_SET_CC2 |
ANX74XX_REG_AUX_SWAP_SET_CC1;
- const struct usb_mux *me = &usb_muxes[port];
+ const struct usb_mux *me = usb_muxes[port].mux;
/*
* Get the current value of analog_ctrl_2 register. Note, that safe mode
@@ -777,7 +777,7 @@ static int anx74xx_tcpm_set_cc(int port, int pull)
static int anx74xx_tcpm_set_polarity(int port, enum tcpc_cc_polarity polarity)
{
int reg, mux_state, rv = EC_SUCCESS;
- const struct usb_mux *me = &usb_muxes[port];
+ const struct usb_mux *me = usb_muxes[port].mux;
bool unused;
rv |= tcpc_read(port, ANX74XX_REG_CC_SOFTWARE_CTRL, &reg);
diff --git a/driver/usb_mux/anx3443.c b/driver/usb_mux/anx3443.c
index b48361dcc6..c0a7ff498c 100644
--- a/driver/usb_mux/anx3443.c
+++ b/driver/usb_mux/anx3443.c
@@ -194,7 +194,7 @@ static bool anx3443_port_is_usb2_only(const struct usb_mux *me)
static void anx3443_suspend(void)
{
for (int i = 0; i < CONFIG_USB_PD_PORT_MAX_COUNT; i++) {
- const struct usb_mux *mux = &usb_muxes[i];
+ const struct usb_mux *mux = usb_muxes[i].mux;
if (mux->driver != &anx3443_usb_mux_driver)
continue;
@@ -208,14 +208,14 @@ DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, anx3443_suspend, HOOK_PRIO_DEFAULT);
static void anx3443_resume(void)
{
for (int i = 0; i < CONFIG_USB_PD_PORT_MAX_COUNT; i++) {
- int port = usb_muxes[i].usb_port;
+ int port = usb_muxes[i].mux->usb_port;
bool ack_required;
- if (usb_muxes[i].driver != &anx3443_usb_mux_driver)
+ if (usb_muxes[i].mux->driver != &anx3443_usb_mux_driver)
continue;
- anx3443_set_mux(&usb_muxes[i], saved_mux_state[port].mux_state,
- &ack_required);
+ anx3443_set_mux(usb_muxes[i].mux,
+ saved_mux_state[port].mux_state, &ack_required);
}
}
DECLARE_HOOK(HOOK_CHIPSET_RESUME, anx3443_resume, HOOK_PRIO_DEFAULT);
diff --git a/driver/usb_mux/ps8743.c b/driver/usb_mux/ps8743.c
index c960d21e1f..bebcf53248 100644
--- a/driver/usb_mux/ps8743.c
+++ b/driver/usb_mux/ps8743.c
@@ -210,7 +210,7 @@ static enum usb_conn_status ps8743_get_usb_conn_status(const struct usb_mux *me)
static void ps8743_suspend(void)
{
for (int i = 0; i < board_get_usb_pd_port_count(); i++) {
- const struct usb_mux *mux = &usb_muxes[i];
+ const struct usb_mux *mux = usb_muxes[i].mux;
if (mux->driver != &ps8743_usb_mux_driver)
continue;
@@ -229,7 +229,7 @@ DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, ps8743_suspend, HOOK_PRIO_DEFAULT);
static void ps8743_resume(void)
{
for (int i = 0; i < board_get_usb_pd_port_count(); i++) {
- const struct usb_mux *mux = &usb_muxes[i];
+ const struct usb_mux *mux = usb_muxes[i].mux;
if (mux->driver != &ps8743_usb_mux_driver)
continue;
diff --git a/driver/usb_mux/usb_mux.c b/driver/usb_mux/usb_mux.c
index 50eb668626..a3cd6e2c99 100644
--- a/driver/usb_mux/usb_mux.c
+++ b/driver/usb_mux/usb_mux.c
@@ -256,7 +256,7 @@ static int configure_mux(int port, int index, enum mux_config_type config,
mux_state_t *mux_state)
{
int rv = EC_SUCCESS;
- const struct usb_mux *mux_ptr;
+ const struct usb_mux_chain *mux_chain;
int chip = 0;
if (config == USB_MUX_SET_MODE || config == USB_MUX_GET_MODE) {
@@ -272,9 +272,11 @@ static int configure_mux(int port, int index, enum mux_config_type config,
* 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, chip++) {
+ for (mux_chain = &usb_muxes[port];
+ rv == EC_SUCCESS && mux_chain != NULL;
+ mux_chain = mux_chain->next, chip++) {
mux_state_t lcl_state;
+ const struct usb_mux *mux_ptr = mux_chain->mux;
const struct usb_mux_driver *drv = mux_ptr->driver;
bool ack_required = false;
@@ -661,15 +663,17 @@ int usb_mux_retimer_fw_update_port_info(void)
int i;
int port_info = 0;
const struct usb_mux *mux_ptr;
+ const struct usb_mux_chain *mux_chain;
for (i = 0; i < CONFIG_USB_PD_PORT_MAX_COUNT; i++) {
- mux_ptr = &usb_muxes[i];
- while (mux_ptr) {
+ mux_chain = &usb_muxes[i];
+ while (mux_chain) {
+ mux_ptr = mux_chain->mux;
if (mux_ptr->driver &&
mux_ptr->driver->is_retimer_fw_update_capable &&
mux_ptr->driver->is_retimer_fw_update_capable())
port_info |= BIT(i);
- mux_ptr = mux_ptr->next_mux;
+ mux_chain = mux_chain->next;
}
}
return port_info;
@@ -693,17 +697,19 @@ static void usb_mux_reset_in_g3(void)
{
int port;
const struct usb_mux *mux_ptr;
+ const struct usb_mux_chain *mux_chain;
for (port = 0; port < board_get_usb_pd_port_count(); port++) {
- mux_ptr = &usb_muxes[port];
+ mux_chain = &usb_muxes[port];
- while (mux_ptr) {
+ while (mux_chain) {
+ mux_ptr = mux_chain->mux;
if (mux_ptr->flags & USB_MUX_FLAG_RESETS_IN_G3) {
atomic_clear_bits(&flags[port],
USB_MUX_FLAG_INIT |
USB_MUX_FLAG_IN_LPM);
}
- mux_ptr = mux_ptr->next_mux;
+ mux_chain = mux_chain->next;
}
}
}
diff --git a/include/usb_mux.h b/include/usb_mux.h
index 00f5417aca..d510a347d4 100644
--- a/include/usb_mux.h
+++ b/include/usb_mux.h
@@ -128,9 +128,6 @@ struct usb_mux {
/* Mux driver */
const struct usb_mux_driver *driver;
- /* Linked list chain of secondary MUXes. NULL terminated */
- const struct usb_mux *next_mux;
-
/**
* Optional method for tuning for USB mux during mux->driver->init().
*
@@ -162,6 +159,15 @@ struct usb_mux {
bool *ack_required);
};
+/* Linked list chain of secondary MUXes. NULL terminated */
+struct usb_mux_chain {
+ /* Structure describing USB mux */
+ const struct usb_mux *mux;
+
+ /* Pointer to next mux */
+ const struct usb_mux_chain *next;
+};
+
/* Supported USB mux drivers */
extern const struct usb_mux_driver amd_fp5_usb_mux_driver;
extern const struct usb_mux_driver amd_fp6_usb_mux_driver;
@@ -177,9 +183,9 @@ extern const struct usb_mux_driver virtual_usb_mux_driver;
/* USB muxes present in system, ordered by PD port #, defined at board-level */
#ifdef CONFIG_USB_MUX_RUNTIME_CONFIG
-extern struct usb_mux usb_muxes[];
+extern struct usb_mux_chain usb_muxes[];
#else
-extern const struct usb_mux usb_muxes[];
+extern const struct usb_mux_chain usb_muxes[];
#endif
/* Supported hpd_update functions */