diff options
author | Tomasz Michalec <tm@semihalf.com> | 2022-07-01 16:40:11 +0200 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-09-13 11:10:58 +0000 |
commit | c0601ea736d191af111132bd9ad75e2ecad3067d (patch) | |
tree | dc5b45fe36e1ee1a8691d05542fb9017c72d975f | |
parent | 99990795d8452d13fd678da7245e041f0b9e6ba7 (diff) | |
download | chrome-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.c | 13 | ||||
-rw-r--r-- | driver/retimer/kb800x.c | 13 | ||||
-rw-r--r-- | driver/tcpm/anx7447.c | 14 | ||||
-rw-r--r-- | driver/tcpm/anx74xx.c | 10 | ||||
-rw-r--r-- | driver/usb_mux/anx3443.c | 10 | ||||
-rw-r--r-- | driver/usb_mux/ps8743.c | 4 | ||||
-rw-r--r-- | driver/usb_mux/usb_mux.c | 24 | ||||
-rw-r--r-- | include/usb_mux.h | 16 |
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, ®)) 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, ®)) 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, ®); 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 */ |