From 8c0af6114508375f0c75112b9cef593719d8812a Mon Sep 17 00:00:00 2001 From: Rob Barnes Date: Mon, 7 Jun 2021 14:39:12 -0600 Subject: guybrush: Reuse USB mux structure for USBA retimers Reuse the USB mux structure for USB A retimers. These retimers do not have an internal mux, so many fields do not apply. This change makes it simpler to create generic methods. BUG=None TEST=Build and run BRANCH=None Signed-off-by: Rob Barnes Change-Id: Idb2eef25bdd820febb18ef3b7af48c21f4c545d8 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2946306 Reviewed-by: Diana Z --- baseboard/guybrush/baseboard.c | 60 ++++++++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 17 deletions(-) (limited to 'baseboard') diff --git a/baseboard/guybrush/baseboard.c b/baseboard/guybrush/baseboard.c index 69e454eef9..b034b6f633 100644 --- a/baseboard/guybrush/baseboard.c +++ b/baseboard/guybrush/baseboard.c @@ -849,12 +849,13 @@ void board_hibernate(void) } } -__overridable void board_a1_ps8811_retimer_setup(void) +__overridable enum ec_error_list +board_a1_ps8811_retimer_init(const struct usb_mux *me) { - CPRINTSUSB("A1: PS8811 retimer using default tuning"); + return EC_SUCCESS; } -static void baseboard_a1_ps8811_retimer_setup(void) +static int baseboard_a1_ps8811_retimer_init(const struct usb_mux *me) { int rv; int tries = 2; @@ -862,25 +863,37 @@ static void baseboard_a1_ps8811_retimer_setup(void) do { int val; - rv = i2c_read8(I2C_PORT_TCPC1, - PS8811_I2C_ADDR_FLAGS3 + PS8811_REG_PAGE1, - PS8811_REG1_USB_BEQ_LEVEL, &val); + rv = i2c_read8(me->i2c_port, + me->i2c_addr_flags + PS8811_REG_PAGE1, + PS8811_REG1_USB_BEQ_LEVEL, &val); } while (rv && --tries); if (rv) { CPRINTSUSB("A1: PS8811 retimer not detected!"); - return; + return rv; } CPRINTSUSB("A1: PS8811 retimer detected"); - board_a1_ps8811_retimer_setup(); + rv = board_a1_ps8811_retimer_init(me); + if (rv) + CPRINTSUSB("A1: Error during PS8811 setup rv:%d", rv); + return rv; } -__overridable void board_a1_anx7491_retimer_setup(void) +/* PS8811 is just a type-A USB retimer, reusing mux structure for convience. */ +const struct usb_mux usba1_ps8811 = { + .usb_port = USBA_PORT_A1, + .i2c_port = I2C_PORT_TCPC1, + .i2c_addr_flags = PS8811_I2C_ADDR_FLAGS3, + .board_init = &baseboard_a1_ps8811_retimer_init, +}; + +__overridable enum ec_error_list +board_a1_anx7491_retimer_init(const struct usb_mux *me) { - CPRINTSUSB("A1: ANX7491 retimer using default tuning"); + return EC_SUCCESS; } -static void baseboard_a1_anx7491_retimer_setup(void) +static int baseboard_a1_anx7491_retimer_init(const struct usb_mux *me) { int rv; int tries = 2; @@ -888,29 +901,42 @@ static void baseboard_a1_anx7491_retimer_setup(void) do { int val; - rv = i2c_read8(I2C_PORT_TCPC1, ANX7491_I2C_ADDR0_FLAGS, 0, - &val); + rv = i2c_read8(me->i2c_port, me->i2c_addr_flags, 0, &val); } while (rv && --tries); if (rv) { CPRINTSUSB("A1: ANX7491 retimer not detected!"); - return; + return rv; } CPRINTSUSB("A1: ANX7491 retimer detected"); - board_a1_anx7491_retimer_setup(); + rv = board_a1_anx7491_retimer_init(me); + if (rv) + CPRINTSUSB("A1: Error during ANX7491 setup rv:%d", rv); + return rv; } +/* ANX7491 is just a type-A USB retimer, reusing mux structure for convience. */ +const struct usb_mux usba1_anx7491 = { + .usb_port = USBA_PORT_A1, + .i2c_port = I2C_PORT_TCPC1, + .i2c_addr_flags = ANX7491_I2C_ADDR0_FLAGS, + .board_init = &baseboard_a1_anx7491_retimer_init, +}; + void baseboard_a1_retimer_setup(void) { + struct usb_mux a1_retimer; switch (board_get_usb_a1_retimer()) { case USB_A1_RETIMER_ANX7491: - baseboard_a1_anx7491_retimer_setup(); + a1_retimer = usba1_anx7491; break; case USB_A1_RETIMER_PS8811: - baseboard_a1_ps8811_retimer_setup(); + a1_retimer = usba1_ps8811; break; default: CPRINTSUSB("A1: Unknown retimer!"); + return; } + a1_retimer.board_init(&a1_retimer); } DECLARE_DEFERRED(baseboard_a1_retimer_setup); -- cgit v1.2.1