diff options
author | Samsp_Liu <Samsp_Liu@compal.corp-partner.google.com> | 2020-07-22 16:21:20 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-09-02 04:19:10 +0000 |
commit | 074b0e363491af9c82c9d54fa0c84b8df9ec2e1e (patch) | |
tree | 4bcd68b1f6a54959332fdd442bfc52780f7ef616 /board/halvor/board.c | |
parent | cd17b934942a3ca602d6eadf38ed3ed95b55ef4c (diff) | |
download | chrome-ec-074b0e363491af9c82c9d54fa0c84b8df9ec2e1e.tar.gz |
Halvor: Need to Implement three USB-C function
The PD function can be enabled.
BUG=b:153705222
BRANCH=none
TEST=Enable Halvor PD Port 0,Port 1 and Port 2
Change-Id: Id171e7c9f900098b2b727e4f69479ee49ea995b3
Signed-off-by: Samsp_Liu <Samsp_Liu@compal.corp-partner.google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2311998
Tested-by: SamSP Liu <samsp_liu@compal.corp-partner.google.com>
Reviewed-by: Abe Levkoy <alevkoy@chromium.org>
Commit-Queue: SamSP Liu <samsp_liu@compal.corp-partner.google.com>
Diffstat (limited to 'board/halvor/board.c')
-rw-r--r-- | board/halvor/board.c | 137 |
1 files changed, 107 insertions, 30 deletions
diff --git a/board/halvor/board.c b/board/halvor/board.c index 4e1d8a3479..1281e0c6fb 100644 --- a/board/halvor/board.c +++ b/board/halvor/board.c @@ -4,19 +4,19 @@ */ /* Volteer board-specific configuration */ +#include "accelgyro.h" +#include "assert.h" #include "bb_retimer.h" #include "button.h" #include "common.h" -#include "accelgyro.h" #include "cbi_ec_fw_config.h" #include "driver/accel_bma2x2.h" #include "driver/als_tcs3400.h" #include "driver/bc12/pi3usb9201.h" -#include "driver/ppc/sn5s330.h" #include "driver/ppc/syv682x.h" +#include "driver/sync.h" #include "driver/tcpm/tcpci.h" #include "driver/tcpm/tusb422.h" -#include "driver/sync.h" #include "extpower.h" #include "gpio.h" #include "hooks.h" @@ -30,11 +30,11 @@ #include "task.h" #include "tablet_mode.h" #include "uart.h" -#include "usb_mux.h" -#include "usb_pd.h" #include "usb_pd_tbt.h" -#include "usb_pd_tcpm.h" #include "usbc_ppc.h" +#include "usb_pd.h" +#include "usb_pd_tcpm.h" +#include "usb_mux.h" #include "util.h" #include "gpio_list.h" /* Must come after other header files. */ @@ -183,17 +183,59 @@ BUILD_ASSERT(ARRAY_SIZE(pwm_channels) == PWM_CH_COUNT); /******************************************************************************/ void halvor_tcpc_alert_event(enum gpio_signal signal) { - /* TODO (b/153705222): Need to implement three USB-C function */ + int port = -1; + + switch (signal) { + case GPIO_USB_C0_TCPC_INT_ODL: + port = USBC_PORT_C0; + break; + case GPIO_USB_C1_TCPC_INT_ODL: + port = USBC_PORT_C1; + break; + case GPIO_USB_C2_TCPC_INT_ODL: + port = USBC_PORT_C2; + break; + default: + return; + } + + ASSERT(port != -1); + schedule_deferred_pd_interrupt(port); } void halvor_ppc_interrupt(enum gpio_signal signal) { - /* TODO (b/153705222): Need to implement three USB-C function */ + switch (signal) { + case GPIO_USB_C0_PPC_INT_ODL: + syv682x_interrupt(USBC_PORT_C0); + break; + case GPIO_USB_C1_PPC_INT_ODL: + syv682x_interrupt(USBC_PORT_C1); + break; + case GPIO_USB_C2_PPC_INT_ODL: + syv682x_interrupt(USBC_PORT_C2); + break; + default: + break; + } } void halvor_bc12_interrupt(enum gpio_signal signal) { - /* TODO (b/153705222): Need to implement three USB-C function */ + switch (signal) { + case GPIO_USB_C0_BC12_INT_ODL: + task_set_event(TASK_ID_USB_CHG_P0, USB_CHG_EVENT_BC12, 0); + break; + case GPIO_USB_C1_BC12_INT_ODL: + task_set_event(TASK_ID_USB_CHG_P1, USB_CHG_EVENT_BC12, 0); + break; + case GPIO_USB_C2_BC12_INT_ODL: + task_set_event(TASK_ID_USB_CHG_P2, USB_CHG_EVENT_BC12, 0); + break; + + default: + break; + } } void board_reset_pd_mcu(void) @@ -211,34 +253,24 @@ __override void board_cbi_init(void) struct ppc_config_t ppc_chips[] = { [USBC_PORT_C0] = { .i2c_port = I2C_PORT_USB_C0, - .i2c_addr_flags = SN5S330_ADDR0_FLAGS, - .drv = &sn5s330_drv, + .i2c_addr_flags = SYV682X_ADDR0_FLAGS, + .drv = &syv682x_drv, }, [USBC_PORT_C1] = { .i2c_port = I2C_PORT_USB_C1, .i2c_addr_flags = SYV682X_ADDR0_FLAGS, .drv = &syv682x_drv, }, + [USBC_PORT_C2] = { + .i2c_port = I2C_PORT_USB_C2, + .i2c_addr_flags = SYV682X_ADDR0_FLAGS, + .drv = &syv682x_drv, + }, }; BUILD_ASSERT(ARRAY_SIZE(ppc_chips) == USBC_PORT_COUNT); unsigned int ppc_cnt = ARRAY_SIZE(ppc_chips); /******************************************************************************/ -/* PPC support routines */ -void ppc_interrupt(enum gpio_signal signal) -{ - switch (signal) { - case GPIO_USB_C0_PPC_INT_ODL: - sn5s330_interrupt(USBC_PORT_C0); - break; - case GPIO_USB_C1_PPC_INT_ODL: - syv682x_interrupt(USBC_PORT_C1); - default: - break; - } -} - -/******************************************************************************/ /* BC1.2 charger detect configuration */ const struct pi3usb9201_config_t pi3usb9201_bc12_chips[] = { [USBC_PORT_C0] = { @@ -249,6 +281,10 @@ const struct pi3usb9201_config_t pi3usb9201_bc12_chips[] = { .i2c_port = I2C_PORT_USB_C1, .i2c_addr_flags = PI3USB9201_I2C_ADDR_3_FLAGS, }, + [USBC_PORT_C2] = { + .i2c_port = I2C_PORT_USB_C2, + .i2c_addr_flags = PI3USB9201_I2C_ADDR_3_FLAGS, + }, }; BUILD_ASSERT(ARRAY_SIZE(pi3usb9201_bc12_chips) == USBC_PORT_COUNT); @@ -273,23 +309,45 @@ struct tcpc_config_t tcpc_config[] = { .drv = &tusb422_tcpm_drv, .usb23 = USBC_PORT_1_USB2_NUM | (USBC_PORT_1_USB3_NUM << 4), }, + [USBC_PORT_C2] = { + .bus_type = EC_BUS_TYPE_I2C, + .i2c_info = { + .port = I2C_PORT_USB_C2, + .addr_flags = TUSB422_I2C_ADDR_FLAGS, + }, + .drv = &tusb422_tcpm_drv, + .usb23 = USBC_PORT_2_USB2_NUM | (USBC_PORT_2_USB3_NUM << 4), + }, }; BUILD_ASSERT(ARRAY_SIZE(tcpc_config) == USBC_PORT_COUNT); BUILD_ASSERT(CONFIG_USB_PD_PORT_MAX_COUNT == USBC_PORT_COUNT); /******************************************************************************/ /* USBC mux configuration - Tiger Lake includes internal mux */ +struct usb_mux usbc0_usb4_db_retimer = { + .usb_port = USBC_PORT_C0, + .driver = &bb_usb_retimer, + .i2c_port = I2C_PORT_USB_1_MIX, + .i2c_addr_flags = USBC_PORT_C0_BB_RETIMER_I2C_ADDR, +}; struct usb_mux usbc1_usb4_db_retimer = { .usb_port = USBC_PORT_C1, .driver = &bb_usb_retimer, .i2c_port = I2C_PORT_USB_1_MIX, .i2c_addr_flags = USBC_PORT_C1_BB_RETIMER_I2C_ADDR, }; +struct usb_mux usbc2_usb4_db_retimer = { + .usb_port = USBC_PORT_C2, + .driver = &bb_usb_retimer, + .i2c_port = I2C_PORT_USB_1_MIX, + .i2c_addr_flags = USBC_PORT_C2_BB_RETIMER_I2C_ADDR, +}; struct usb_mux usb_muxes[] = { [USBC_PORT_C0] = { .usb_port = USBC_PORT_C0, .driver = &virtual_usb_mux_driver, .hpd_update = &virtual_hpd_update, + .next_mux = &usbc0_usb4_db_retimer, }, [USBC_PORT_C1] = { .usb_port = USBC_PORT_C1, @@ -297,21 +355,32 @@ struct usb_mux usb_muxes[] = { .hpd_update = &virtual_hpd_update, .next_mux = &usbc1_usb4_db_retimer, }, + [USBC_PORT_C2] = { + .usb_port = USBC_PORT_C2, + .driver = &virtual_usb_mux_driver, + .hpd_update = &virtual_hpd_update, + .next_mux = &usbc2_usb4_db_retimer, + }, }; BUILD_ASSERT(ARRAY_SIZE(usb_muxes) == USBC_PORT_COUNT); struct bb_usb_control bb_controls[] = { [USBC_PORT_C0] = { - /* USB-C port 0 doesn't have a retimer */ + .usb_ls_en_gpio = GPIO_USB_C0_LS_EN, + .retimer_rst_gpio = GPIO_USB_C0_RT_RST_ODL, }, [USBC_PORT_C1] = { .usb_ls_en_gpio = GPIO_USB_C1_LS_EN, .retimer_rst_gpio = GPIO_USB_C1_RT_RST_ODL, }, + [USBC_PORT_C2] = { + .usb_ls_en_gpio = GPIO_USB_C2_LS_EN, + .retimer_rst_gpio = GPIO_USB_C2_RT_RST_ODL, + }, }; BUILD_ASSERT(ARRAY_SIZE(bb_controls) == USBC_PORT_COUNT); -static void board_tcpc_init(void) +static void board_usb_chip_init(void) { /* Don't reset TCPCs after initial reset */ if (!system_jumped_late()) @@ -320,16 +389,19 @@ static void board_tcpc_init(void) /* Enable PPC interrupts. */ gpio_enable_interrupt(GPIO_USB_C0_PPC_INT_ODL); gpio_enable_interrupt(GPIO_USB_C1_PPC_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C2_PPC_INT_ODL); /* Enable TCPC interrupts. */ gpio_enable_interrupt(GPIO_USB_C0_TCPC_INT_ODL); gpio_enable_interrupt(GPIO_USB_C1_TCPC_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C2_TCPC_INT_ODL); /* Enable BC1.2 interrupts. */ gpio_enable_interrupt(GPIO_USB_C0_BC12_INT_ODL); gpio_enable_interrupt(GPIO_USB_C1_BC12_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C2_BC12_INT_ODL); } -DECLARE_HOOK(HOOK_INIT, board_tcpc_init, HOOK_PRIO_INIT_CHIPSET); +DECLARE_HOOK(HOOK_INIT, board_usb_chip_init, HOOK_PRIO_INIT_CHIPSET); /******************************************************************************/ /* TCPC support routines */ @@ -344,6 +416,8 @@ uint16_t tcpc_get_alert_status(void) status |= PD_STATUS_TCPC_ALERT_0; if (!gpio_get_level(GPIO_USB_C1_TCPC_INT_ODL)) status |= PD_STATUS_TCPC_ALERT_1; + if (!gpio_get_level(GPIO_USB_C2_TCPC_INT_ODL)) + status |= PD_STATUS_TCPC_ALERT_2; return status; } @@ -352,6 +426,9 @@ int ppc_get_alert_status(int port) { if (port == USBC_PORT_C0) return gpio_get_level(GPIO_USB_C0_PPC_INT_ODL) == 0; - else + else if (port == USBC_PORT_C1) return gpio_get_level(GPIO_USB_C1_PPC_INT_ODL) == 0; + else + return gpio_get_level(GPIO_USB_C2_PPC_INT_ODL) == 0; } + |