summaryrefslogtreecommitdiff
path: root/baseboard/guybrush/baseboard.c
diff options
context:
space:
mode:
authorRob Barnes <robbarnes@google.com>2021-04-07 09:12:53 -0600
committerCommit Bot <commit-bot@chromium.org>2021-04-09 06:35:45 +0000
commit41aeb59c43bfb94ac7d34a4a796aa245759ee8e3 (patch)
tree3bc83f13544f9d40668cb863a9843a82e1db1d22 /baseboard/guybrush/baseboard.c
parent1afac2a88aceab06bbc99f068a76bf94068d9e20 (diff)
downloadchrome-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.c119
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)
{