diff options
-rw-r--r-- | board/cheza/board.c | 86 | ||||
-rw-r--r-- | board/cheza/board.h | 1 |
2 files changed, 83 insertions, 4 deletions
diff --git a/board/cheza/board.c b/board/cheza/board.c index c8126790c0..715e8fa768 100644 --- a/board/cheza/board.c +++ b/board/cheza/board.c @@ -246,14 +246,92 @@ const struct tcpc_config_t tcpc_config[CONFIG_USB_PD_PORT_COUNT] = { TCPC_ALERT_ACTIVE_LOW}, }; +/* + * Port-0 USB mux driver. + * + * The USB mux is handled by TCPC chip and the HPD is handled by AP. + * Redirect to anx74xx_tcpm_usb_mux_driver but override the get() function + * to check the HPD_IRQ mask from virtual_usb_mux_driver. + */ +static int port0_usb_mux_init(int port) +{ + return anx74xx_tcpm_usb_mux_driver.init(port); +} + +static int port0_usb_mux_set(int i2c_addr, mux_state_t mux_state) +{ + return anx74xx_tcpm_usb_mux_driver.set(i2c_addr, mux_state); +} + +static int port0_usb_mux_get(int port, mux_state_t *mux_state) +{ + int rv; + mux_state_t virtual_mux_state; + + rv = anx74xx_tcpm_usb_mux_driver.get(port, mux_state); + rv |= virtual_usb_mux_driver.get(port, &virtual_mux_state); + + if (virtual_mux_state & USB_PD_MUX_HPD_IRQ) + *mux_state |= USB_PD_MUX_HPD_IRQ; + return rv; +} + +const struct usb_mux_driver port0_usb_mux_driver = { + .init = port0_usb_mux_init, + .set = port0_usb_mux_set, + .get = port0_usb_mux_get, +}; + +/* + * Port-1 USB mux driver. + * + * The USB mux is handled by TCPC chip and the HPD is handled by AP. + * Redirect to tcpci_tcpm_usb_mux_driver but override the get() function + * to check the HPD_IRQ mask from virtual_usb_mux_driver. + */ +static int port1_usb_mux_init(int port) +{ + return tcpci_tcpm_usb_mux_driver.init(port); +} + +static int port1_usb_mux_set(int i2c_addr, mux_state_t mux_state) +{ + return tcpci_tcpm_usb_mux_driver.set(i2c_addr, mux_state); +} + +static int port1_usb_mux_get(int port, mux_state_t *mux_state) +{ + int rv; + mux_state_t virtual_mux_state; + + rv = tcpci_tcpm_usb_mux_driver.get(port, mux_state); + rv |= virtual_usb_mux_driver.get(port, &virtual_mux_state); + + if (virtual_mux_state & USB_PD_MUX_HPD_IRQ) + *mux_state |= USB_PD_MUX_HPD_IRQ; + return rv; +} + +static int port1_usb_mux_enter_low_power(int port) +{ + return tcpci_tcpm_usb_mux_driver.enter_low_power_mode(port); +} + +const struct usb_mux_driver port1_usb_mux_driver = { + .init = &port1_usb_mux_init, + .set = &port1_usb_mux_set, + .get = &port1_usb_mux_get, + .enter_low_power_mode = &port1_usb_mux_enter_low_power, +}; + struct usb_mux usb_muxes[CONFIG_USB_PD_PORT_COUNT] = { { - .driver = &anx74xx_tcpm_usb_mux_driver, - .hpd_update = &anx74xx_tcpc_update_hpd_status, + .driver = &port0_usb_mux_driver, + .hpd_update = &virtual_hpd_update, }, { - .driver = &tcpci_tcpm_usb_mux_driver, - .hpd_update = &ps8xxx_tcpc_update_hpd_status, + .driver = &port1_usb_mux_driver, + .hpd_update = &virtual_hpd_update, } }; diff --git a/board/cheza/board.h b/board/cheza/board.h index 9998233356..84dd89ee4c 100644 --- a/board/cheza/board.h +++ b/board/cheza/board.h @@ -115,6 +115,7 @@ #define CONFIG_USB_PD_TRY_SRC #define CONFIG_USB_PD_VBUS_DETECT_CHARGER #define CONFIG_USB_PD_5V_EN_CUSTOM +#define CONFIG_USB_MUX_VIRTUAL #define CONFIG_USBC_PPC_SN5S330 #define CONFIG_USBC_SS_MUX #define CONFIG_USBC_VCONN |