diff options
author | Lu Zhang <lu.zhang@bitland.corp-partner.google.com> | 2020-06-09 11:38:09 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-06-10 04:05:49 +0000 |
commit | 1587e30266cf7e2efdd6c11872fe98d2034e5279 (patch) | |
tree | e87cdce30dd63cf3df83c5ea3dadfcd16b51f052 /board | |
parent | d2ffb374350e59ac93a8cda6b38a58423b6f055e (diff) | |
download | chrome-ec-1587e30266cf7e2efdd6c11872fe98d2034e5279.tar.gz |
vilboz: Split mux to dalboz and vilboz
BUG=b:158125500
BRANCH=none
TEST=make buildall -j
Signed-off-by: Lu Zhang <lu.zhang@bitland.corp-partner.google.com>
Change-Id: I0836daf254f1c1c1fb2d7fd45868b55517689cf9
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2235236
Reviewed-by: Edward Hill <ecgh@chromium.org>
Reviewed-by: Peter Marheine <pmarheine@chromium.org>
Diffstat (limited to 'board')
-rw-r--r-- | board/dalboz/board.c | 82 | ||||
-rw-r--r-- | board/dalboz/board.h | 6 | ||||
-rw-r--r-- | board/vilboz/board.c | 81 | ||||
-rw-r--r-- | board/vilboz/board.h | 6 |
4 files changed, 175 insertions, 0 deletions
diff --git a/board/dalboz/board.c b/board/dalboz/board.c index edfcdafc77..7bb4c20a5f 100644 --- a/board/dalboz/board.c +++ b/board/dalboz/board.c @@ -13,6 +13,7 @@ #include "driver/ppc/aoz1380.h" #include "driver/ppc/nx20p348x.h" #include "driver/tcpm/nct38xx.h" +#include "driver/usb_mux/amd_fp5.h" #include "driver/usb_mux/ps8740.h" #include "driver/usb_mux/ps8743.h" #include "extpower.h" @@ -198,6 +199,71 @@ static int board_ps8743_mux_set(const struct usb_mux *me, return EC_SUCCESS; } + +/***************************************************************************** + * USB-C + */ + +/* + * USB C0 port SBU mux use standalone FSUSB42UMX + * chip and it need a board specific driver. + * Overall, it will use chained mux framework. + */ +static int fsusb42umx_set_mux(const struct usb_mux *me, mux_state_t mux_state) +{ + if (mux_state & USB_PD_MUX_POLARITY_INVERTED) + ioex_set_level(IOEX_USB_C0_SBU_FLIP, 1); + else + ioex_set_level(IOEX_USB_C0_SBU_FLIP, 0); + + return EC_SUCCESS; +} + +/* + * .init is not necessary here because it has nothing + * to do. Primary mux will handle mux state so .get is + * not needed as well. usb_mux.c can handle the situation + * properly. + */ +const struct usb_mux_driver usbc0_sbu_mux_driver = { + .set = fsusb42umx_set_mux, +}; + +/* + * Since FSUSB42UMX is not a i2c device, .i2c_port and + * .i2c_addr_flags are not required here. + */ +const struct usb_mux usbc0_sbu_mux = { + .usb_port = USBC_PORT_C0, + .driver = &usbc0_sbu_mux_driver, +}; + +struct usb_mux usbc1_amd_fp5_usb_mux = { + .usb_port = USBC_PORT_C1, + .i2c_port = I2C_PORT_USB_AP_MUX, + .i2c_addr_flags = AMD_FP5_MUX_I2C_ADDR_FLAGS, + .driver = &amd_fp5_usb_mux_driver, + .flags = USB_MUX_FLAG_SET_WITHOUT_FLIP, +}; + +struct usb_mux usb_muxes[] = { + [USBC_PORT_C0] = { + .usb_port = USBC_PORT_C0, + .i2c_port = I2C_PORT_USB_AP_MUX, + .i2c_addr_flags = AMD_FP5_MUX_I2C_ADDR_FLAGS, + .driver = &amd_fp5_usb_mux_driver, + .next_mux = &usbc0_sbu_mux, + }, + [USBC_PORT_C1] = { + .usb_port = USBC_PORT_C1, + .i2c_port = I2C_PORT_TCPC1, + .i2c_addr_flags = PS8743_I2C_ADDR1_FLAG, + .driver = &ps8743_usb_mux_driver, + .next_mux = &usbc1_amd_fp5_usb_mux, + } +}; +BUILD_ASSERT(ARRAY_SIZE(usb_muxes) == USBC_PORT_COUNT); + struct ppc_config_t ppc_chips[] = { [USBC_PORT_C0] = { /* Device does not talk I2C */ @@ -283,6 +349,22 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } +void board_overcurrent_event(int port, int is_overcurrented) +{ + switch (port) { + case USBC_PORT_C0: + ioex_set_level(IOEX_USB_C0_FAULT_ODL, !is_overcurrented); + break; + + case USBC_PORT_C1: + ioex_set_level(IOEX_USB_C1_FAULT_ODL, !is_overcurrented); + break; + + default: + break; + } +} + const struct tcpc_config_t tcpc_config[] = { [USBC_PORT_C0] = { .bus_type = EC_BUS_TYPE_I2C, diff --git a/board/dalboz/board.h b/board/dalboz/board.h index 392a3d1f37..389aeb3587 100644 --- a/board/dalboz/board.h +++ b/board/dalboz/board.h @@ -23,6 +23,12 @@ #define CONFIG_IO_EXPANDER_PCAL6408 #define CONFIG_MKBP_USE_GPIO +#define CONFIG_USBC_PPC_NX20P3483 +#define CONFIG_USB_MUX_PS8740 +#define CONFIG_USB_MUX_PS8743 + +#define CONFIG_USB_PD_PORT_MAX_COUNT 2 + /* Power LEDs */ #define CONFIG_LED_POWER_LED diff --git a/board/vilboz/board.c b/board/vilboz/board.c index b3f06498db..6c7a153c75 100644 --- a/board/vilboz/board.c +++ b/board/vilboz/board.c @@ -13,6 +13,7 @@ #include "driver/ppc/aoz1380.h" #include "driver/ppc/nx20p348x.h" #include "driver/tcpm/nct38xx.h" +#include "driver/usb_mux/amd_fp5.h" #include "driver/usb_mux/ps8740.h" #include "driver/usb_mux/ps8743.h" #include "extpower.h" @@ -180,6 +181,70 @@ static int board_ps8743_mux_set(const struct usb_mux *me, return ps8743_write(me, PS8743_REG_MODE, reg); } +/***************************************************************************** + * USB-C + */ + +/* + * USB C0 port SBU mux use standalone FSUSB42UMX + * chip and it need a board specific driver. + * Overall, it will use chained mux framework. + */ +static int fsusb42umx_set_mux(const struct usb_mux *me, mux_state_t mux_state) +{ + if (mux_state & USB_PD_MUX_POLARITY_INVERTED) + ioex_set_level(IOEX_USB_C0_SBU_FLIP, 1); + else + ioex_set_level(IOEX_USB_C0_SBU_FLIP, 0); + + return EC_SUCCESS; +} + +/* + * .init is not necessary here because it has nothing + * to do. Primary mux will handle mux state so .get is + * not needed as well. usb_mux.c can handle the situation + * properly. + */ +const struct usb_mux_driver usbc0_sbu_mux_driver = { + .set = fsusb42umx_set_mux, +}; + +/* + * Since FSUSB42UMX is not a i2c device, .i2c_port and + * .i2c_addr_flags are not required here. + */ +const struct usb_mux usbc0_sbu_mux = { + .usb_port = USBC_PORT_C0, + .driver = &usbc0_sbu_mux_driver, +}; + +struct usb_mux usbc1_amd_fp5_usb_mux = { + .usb_port = USBC_PORT_C1, + .i2c_port = I2C_PORT_USB_AP_MUX, + .i2c_addr_flags = AMD_FP5_MUX_I2C_ADDR_FLAGS, + .driver = &amd_fp5_usb_mux_driver, + .flags = USB_MUX_FLAG_SET_WITHOUT_FLIP, +}; + +struct usb_mux usb_muxes[] = { + [USBC_PORT_C0] = { + .usb_port = USBC_PORT_C0, + .i2c_port = I2C_PORT_USB_AP_MUX, + .i2c_addr_flags = AMD_FP5_MUX_I2C_ADDR_FLAGS, + .driver = &amd_fp5_usb_mux_driver, + .next_mux = &usbc0_sbu_mux, + }, + [USBC_PORT_C1] = { + .usb_port = USBC_PORT_C1, + .i2c_port = I2C_PORT_TCPC1, + .i2c_addr_flags = PS8743_I2C_ADDR1_FLAG, + .driver = &ps8743_usb_mux_driver, + .next_mux = &usbc1_amd_fp5_usb_mux, + } +}; +BUILD_ASSERT(ARRAY_SIZE(usb_muxes) == USBC_PORT_COUNT); + struct ppc_config_t ppc_chips[] = { [USBC_PORT_C0] = { /* Device does not talk I2C */ @@ -265,6 +330,22 @@ int board_set_active_charge_port(int port) return EC_SUCCESS; } +void board_overcurrent_event(int port, int is_overcurrented) +{ + switch (port) { + case USBC_PORT_C0: + ioex_set_level(IOEX_USB_C0_FAULT_ODL, !is_overcurrented); + break; + + case USBC_PORT_C1: + ioex_set_level(IOEX_USB_C1_FAULT_ODL, !is_overcurrented); + break; + + default: + break; + } +} + const struct tcpc_config_t tcpc_config[] = { [USBC_PORT_C0] = { .bus_type = EC_BUS_TYPE_I2C, diff --git a/board/vilboz/board.h b/board/vilboz/board.h index a4ebee6585..fa95f0bd0d 100644 --- a/board/vilboz/board.h +++ b/board/vilboz/board.h @@ -22,6 +22,12 @@ #define CONFIG_MKBP_USE_GPIO +#define CONFIG_USBC_PPC_NX20P3483 +#define CONFIG_USB_MUX_PS8740 +#define CONFIG_USB_MUX_PS8743 + +#define CONFIG_USB_PD_PORT_MAX_COUNT 2 + /* Power LEDs */ #define CONFIG_LED_POWER_LED |