diff options
Diffstat (limited to 'baseboard/zork/baseboard.c')
-rw-r--r-- | baseboard/zork/baseboard.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/baseboard/zork/baseboard.c b/baseboard/zork/baseboard.c index 3dcbd96560..ef55d12138 100644 --- a/baseboard/zork/baseboard.c +++ b/baseboard/zork/baseboard.c @@ -467,6 +467,102 @@ void bc12_interrupt(enum gpio_signal signal) */ /* + * PS8818 set mux tuning. + * Adds in board specific gain and DP lane count configuration + */ +static int ps8818_tune_mux(int port, mux_state_t mux_state) +{ + int rv = EC_SUCCESS; + + /* USB specific config */ + if (mux_state & USB_PD_MUX_USB_ENABLED) { + /* Boost the USB gain */ + rv = ps8818_i2c_write(port, + PS8818_REG_PAGE1, + PS8818_REG1_APTX1EQ_10G_LEVEL, + PS8818_EQ_LEVEL_UP_21DB); + if (rv) + return rv; + + rv = ps8818_i2c_write(port, + PS8818_REG_PAGE1, + PS8818_REG1_APTX2EQ_10G_LEVEL, + PS8818_EQ_LEVEL_UP_21DB); + if (rv) + return rv; + + rv = ps8818_i2c_write(port, + PS8818_REG_PAGE1, + PS8818_REG1_APTX1EQ_5G_LEVEL, + PS8818_EQ_LEVEL_UP_21DB); + if (rv) + return rv; + + rv = ps8818_i2c_write(port, + PS8818_REG_PAGE1, + PS8818_REG1_APTX2EQ_5G_LEVEL, + PS8818_EQ_LEVEL_UP_21DB); + if (rv) + return rv; + + rv = ps8818_i2c_write(port, + PS8818_REG_PAGE1, + PS8818_REG1_CRX1EQ_10G_LEVEL, + PS8818_EQ_LEVEL_UP_21DB); + if (rv) + return rv; + + rv = ps8818_i2c_write(port, + PS8818_REG_PAGE1, + PS8818_REG1_CRX2EQ_10G_LEVEL, + PS8818_EQ_LEVEL_UP_21DB); + if (rv) + return rv; + + rv = ps8818_i2c_write(port, + PS8818_REG_PAGE1, + PS8818_REG1_CRX1EQ_5G_LEVEL, + PS8818_EQ_LEVEL_UP_21DB); + if (rv) + return rv; + + rv = ps8818_i2c_write(port, + PS8818_REG_PAGE1, + PS8818_REG1_CRX2EQ_5G_LEVEL, + PS8818_EQ_LEVEL_UP_21DB); + if (rv) + return rv; + } + + /* DP specific config */ + if (mux_state & USB_PD_MUX_DP_ENABLED) { + int val; + + /* Boost the DP gain */ + rv = ps8818_i2c_write(port, + PS8818_REG_PAGE1, + PS8818_REG1_DPEQ_LEVEL, + PS8818_DPEQ_LEVEL_UP_21DB); + if (rv) + return rv; + + /* Set DP lane count */ + val = (mux_state & USB_PD_MUX_USB_ENABLED) + ? PS8818_LANE_COUNT_SET_2_LANE + : PS8818_LANE_COUNT_SET_4_LANE; + + rv = ps8818_i2c_write(port, + PS8818_REG_PAGE2, + PS8818_REG2_LANE_COUNT_SET, + val); + if (rv) + return rv; + } + + return rv; +} + +/* * FP5 is a true MUX but being used as a secondary MUX. Don't want to * send FLIP or this will cause a double flip */ @@ -532,6 +628,7 @@ static int zork_c1_detect(int port, int err_if_power_off) /* Main MUX is FP5, secondary MUX is PS8818 */ usb_muxes[USBC_PORT_C1].driver = &amd_fp5_usb_mux_driver; usb_retimers[USBC_PORT_C1].driver = &ps8818_usb_retimer; + usb_retimers[USBC_PORT_C1].tune = &ps8818_tune_mux; return rv; } |