diff options
author | Rob Barnes <robbarnes@google.com> | 2021-04-07 09:12:53 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-04-09 06:35:45 +0000 |
commit | 41aeb59c43bfb94ac7d34a4a796aa245759ee8e3 (patch) | |
tree | 3bc83f13544f9d40668cb863a9843a82e1db1d22 /baseboard/guybrush/baseboard.c | |
parent | 1afac2a88aceab06bbc99f068a76bf94068d9e20 (diff) | |
download | chrome-ec-41aeb59c43bfb94ac7d34a4a796aa245759ee8e3.tar.gz |
guybrush: Dynamically configure C1 mux
Two C1 muxes are currently supported for guybrush. Configure the correct
C1 mux at runtime based on fw_config.
Move board_c1_ps8818_mux_set to guybrush board.c since it's board
specific tuning.
BUG=b:184548806
TEST=Build and run on guybrush B2
BRANCH=None
Signed-off-by: Rob Barnes <robbarnes@google.com>
Change-Id: I6ff809a9cbd1ddc2a408d2ce84f75d6723b7844f
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2809259
Reviewed-by: Diana Z <dzigterman@chromium.org>
Diffstat (limited to 'baseboard/guybrush/baseboard.c')
-rw-r--r-- | baseboard/guybrush/baseboard.c | 119 |
1 files changed, 41 insertions, 78 deletions
diff --git a/baseboard/guybrush/baseboard.c b/baseboard/guybrush/baseboard.c index d4f58004bc..050545b997 100644 --- a/baseboard/guybrush/baseboard.c +++ b/baseboard/guybrush/baseboard.c @@ -25,6 +25,7 @@ #include "driver/retimer/ps8818.h" #include "driver/tcpm/nct38xx.h" #include "driver/temp_sensor/sb_tsi.h" +#include "driver/usb_mux/anx7451.h" #include "driver/usb_mux/amd_fp6.h" #include "fan.h" #include "fan_chip.h" @@ -406,7 +407,7 @@ BUILD_ASSERT(ARRAY_SIZE(pi3usb9201_bc12_chips) == USBC_PORT_COUNT); * properly. */ static int fsusb42umx_set_mux(const struct usb_mux*, mux_state_t); -const struct usb_mux_driver usbc0_sbu_mux_driver = { +struct usb_mux_driver usbc0_sbu_mux_driver = { .set = fsusb42umx_set_mux, }; @@ -414,18 +415,39 @@ const struct usb_mux_driver usbc0_sbu_mux_driver = { * Since FSUSB42UMX is not a i2c device, .i2c_port and * .i2c_addr_flags are not required here. */ -const struct usb_mux usbc0_sbu_mux = { +struct usb_mux usbc0_sbu_mux = { .usb_port = USBC_PORT_C0, .driver = &usbc0_sbu_mux_driver, }; -static int board_ps8818_mux_set(const struct usb_mux*, mux_state_t); -const struct usb_mux usbc1_ps8818 = { +__overridable int board_c1_ps8818_mux_set(const struct usb_mux *me, + mux_state_t mux_state) +{ + CPRINTSUSB("C1: PS8818 mux using default tuning"); + return 0; +} + +struct usb_mux usbc1_ps8818 = { .usb_port = USBC_PORT_C1, .i2c_port = I2C_PORT_TCPC1, .i2c_addr_flags = PS8818_I2C_ADDR_FLAGS, .driver = &ps8818_usb_retimer_driver, - .board_set = &board_ps8818_mux_set, + .board_set = &board_c1_ps8818_mux_set, +}; + +__overridable int board_c1_anx7451_mux_set(const struct usb_mux *me, + mux_state_t mux_state) +{ + CPRINTSUSB("C1: ANX7451 mux using default tuning"); + return 0; +} + +struct usb_mux usbc1_anx7451 = { + .usb_port = USBC_PORT_C1, + .i2c_port = I2C_PORT_TCPC1, + .i2c_addr_flags = ANX7491_I2C_ADDR0_FLAGS, + .driver = &anx7451_usb_mux_driver, + .board_set = &board_c1_anx7451_mux_set, }; struct usb_mux usb_muxes[] = { @@ -441,7 +463,7 @@ struct usb_mux usb_muxes[] = { .i2c_port = I2C_PORT_USB_MUX, .i2c_addr_flags = AMD_FP6_C4_MUX_I2C_ADDR, .driver = &amd_fp6_usb_mux_driver, - .next_mux = &usbc1_ps8818, + /* .next_mux = filled in by setup_mux based on fw_config */ } }; BUILD_ASSERT(ARRAY_SIZE(usb_muxes) == USBC_PORT_COUNT); @@ -548,81 +570,22 @@ static int fsusb42umx_set_mux(const struct usb_mux *me, mux_state_t mux_state) return EC_SUCCESS; } -/* - * PS8818 set mux board tuning. - * Adds in board specific gain and DP lane count configuration - * TODO(b/179036200): Adjust PS8818 tuning for guybrush and variants - */ -static int board_ps8818_mux_set(const struct usb_mux *me, - mux_state_t mux_state) +static void setup_mux(void) { - int rv = EC_SUCCESS; - - /* USB specific config */ - if (mux_state & USB_PD_MUX_USB_ENABLED) { - /* Boost the USB gain */ - rv = ps8818_i2c_field_update8(me, - PS8818_REG_PAGE1, - PS8818_REG1_APTX1EQ_10G_LEVEL, - PS8818_EQ_LEVEL_UP_MASK, - PS8818_EQ_LEVEL_UP_19DB); - if (rv) - return rv; - - rv = ps8818_i2c_field_update8(me, - PS8818_REG_PAGE1, - PS8818_REG1_APTX2EQ_10G_LEVEL, - PS8818_EQ_LEVEL_UP_MASK, - PS8818_EQ_LEVEL_UP_19DB); - if (rv) - return rv; - - rv = ps8818_i2c_field_update8(me, - PS8818_REG_PAGE1, - PS8818_REG1_APTX1EQ_5G_LEVEL, - PS8818_EQ_LEVEL_UP_MASK, - PS8818_EQ_LEVEL_UP_19DB); - if (rv) - return rv; - - rv = ps8818_i2c_field_update8(me, - PS8818_REG_PAGE1, - PS8818_REG1_APTX2EQ_5G_LEVEL, - PS8818_EQ_LEVEL_UP_MASK, - PS8818_EQ_LEVEL_UP_19DB); - if (rv) - return rv; - - /* Set the RX input termination */ - rv = ps8818_i2c_field_update8(me, - PS8818_REG_PAGE1, - PS8818_REG1_RX_PHY, - PS8818_RX_INPUT_TERM_MASK, - PS8818_RX_INPUT_TERM_112_OHM); - if (rv) - return rv; - } - - /* DP specific config */ - if (mux_state & USB_PD_MUX_DP_ENABLED) { - /* Boost the DP gain */ - rv = ps8818_i2c_field_update8(me, - PS8818_REG_PAGE1, - PS8818_REG1_DPEQ_LEVEL, - PS8818_DPEQ_LEVEL_UP_MASK, - PS8818_DPEQ_LEVEL_UP_19DB); - if (rv) - return rv; - - /* Enable HPD on the DB */ - gpio_set_level(GPIO_USB_C1_HPD, 1); - } else { - /* Disable HPD on the DB */ - gpio_set_level(GPIO_USB_C1_HPD, 0); + switch (board_get_usb_c1_mux()) { + case USB_C1_MUX_PS8818: + CPRINTSUSB("C1: Setting PS8818 mux"); + usb_muxes[USBC_PORT_C1].next_mux = &usbc1_ps8818; + break; + case USB_C1_MUX_ANX7451: + CPRINTSUSB("C1: Setting ANX7451 mux"); + usb_muxes[USBC_PORT_C1].next_mux = &usbc1_anx7451; + break; + default: + CPRINTSUSB("C1: Mux is unknown"); } - - return rv; } +DECLARE_HOOK(HOOK_INIT, setup_mux, HOOK_PRIO_INIT_I2C); int board_set_active_charge_port(int port) { |