From 074b0e363491af9c82c9d54fa0c84b8df9ec2e1e Mon Sep 17 00:00:00 2001 From: Samsp_Liu Date: Wed, 22 Jul 2020 16:21:20 +0800 Subject: 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 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2311998 Tested-by: SamSP Liu Reviewed-by: Abe Levkoy Commit-Queue: SamSP Liu --- board/halvor/board.c | 137 ++++++++++++++++++++++++++++++++++++----------- board/halvor/board.h | 17 ++++-- board/halvor/ec.tasklist | 5 +- board/halvor/gpio.inc | 2 + 4 files changed, 125 insertions(+), 36 deletions(-) (limited to 'board/halvor') 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,33 +253,23 @@ __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[] = { @@ -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; } + diff --git a/board/halvor/board.h b/board/halvor/board.h index d684bd1b5f..367668fbcd 100644 --- a/board/halvor/board.h +++ b/board/halvor/board.h @@ -42,7 +42,7 @@ (BIT(LID_ACCEL) | BIT(CLEAR_ALS)) /* USB Type C and USB PD defines */ -#define CONFIG_USB_PD_PORT_MAX_COUNT 2 +#define CONFIG_USB_PD_PORT_MAX_COUNT 3 /* * USB-C port's USB2 & USB3 mapping from schematics @@ -50,10 +50,12 @@ * USB3 numbering on AP - 0 to n (PMC's USB3 numbering for MUX * configuration is - 1 to n hence add +1) */ -#define USBC_PORT_0_USB2_NUM 9 +#define USBC_PORT_0_USB2_NUM 2 #define USBC_PORT_0_USB3_NUM 1 #define USBC_PORT_1_USB2_NUM 4 #define USBC_PORT_1_USB3_NUM 2 +#define USBC_PORT_2_USB2_NUM 6 +#define USBC_PORT_2_USB3_NUM 3 #define PD_POWER_SUPPLY_TURN_ON_DELAY 30000 /* us */ #define PD_POWER_SUPPLY_TURN_OFF_DELAY 250000 /* us */ @@ -73,13 +75,14 @@ /* Enabling USB4 mode */ #define CONFIG_USB_PD_USB4 -#define USBC_PORT_C1_BB_RETIMER_I2C_ADDR 0x40 +#define USBC_PORT_C0_BB_RETIMER_I2C_ADDR 0x40 +#define USBC_PORT_C1_BB_RETIMER_I2C_ADDR 0x41 +#define USBC_PORT_C2_BB_RETIMER_I2C_ADDR 0x42 /* USB Type A Features */ /* USBC PPC*/ -#define CONFIG_USBC_PPC_SN5S330 /* USBC port C0 */ -#define CONFIG_USBC_PPC_SYV682X /* USBC port C1 */ +#define CONFIG_USBC_PPC_SYV682X /* USBC port C0 C1 C2 */ /* BC 1.2 */ @@ -115,6 +118,9 @@ #define GPIO_RSMRST_L_PGOOD GPIO_PG_EC_RSMRST_ODL #define GPIO_CPU_PROCHOT GPIO_EC_PROCHOT_ODL #define GPIO_SYS_RESET_L GPIO_SYS_RST_ODL +#define GPIO_USB_C0_BC12_INT_ODL GPIO_USB_C0_MIX_INT_ODL +#define GPIO_USB_C1_BC12_INT_ODL GPIO_USB_C1_MIX_INT_ODL +#define GPIO_USB_C2_BC12_INT_ODL GPIO_USB_C2_MIX_INT_ODL #define GPIO_WP_L GPIO_EC_WP_L #define GMR_TABLET_MODE_GPIO_L GPIO_TABLET_MODE_L @@ -169,6 +175,7 @@ enum sensor_id { enum usbc_port { USBC_PORT_C0 = 0, USBC_PORT_C1, + USBC_PORT_C2, USBC_PORT_COUNT }; diff --git a/board/halvor/ec.tasklist b/board/halvor/ec.tasklist index 1cbda88563..66deb91f95 100644 --- a/board/halvor/ec.tasklist +++ b/board/halvor/ec.tasklist @@ -11,6 +11,7 @@ TASK_ALWAYS(HOOKS, hook_task, NULL, LARGER_TASK_STACK_SIZE) \ TASK_ALWAYS(USB_CHG_P0, usb_charger_task, 0, TASK_STACK_SIZE) \ TASK_ALWAYS(USB_CHG_P1, usb_charger_task, 0, TASK_STACK_SIZE) \ + TASK_ALWAYS(USB_CHG_P2, usb_charger_task, 0, TASK_STACK_SIZE) \ TASK_ALWAYS(CHARGER, charger_task, NULL, VENTI_TASK_STACK_SIZE) \ TASK_ALWAYS(MOTIONSENSE, motion_sense_task, NULL, VENTI_TASK_STACK_SIZE) \ TASK_NOTEST(KEYPROTO, keyboard_protocol_task, NULL, TASK_STACK_SIZE) \ @@ -21,5 +22,7 @@ TASK_NOTEST(KEYSCAN, keyboard_scan_task, NULL, TASK_STACK_SIZE) \ TASK_ALWAYS(PD_C0, pd_task, NULL, VENTI_TASK_STACK_SIZE) \ TASK_ALWAYS(PD_C1, pd_task, NULL, VENTI_TASK_STACK_SIZE) \ + TASK_ALWAYS(PD_C2, pd_task, NULL, VENTI_TASK_STACK_SIZE) \ TASK_ALWAYS(PD_INT_C0, pd_interrupt_handler_task, 0, TASK_STACK_SIZE) \ - TASK_ALWAYS(PD_INT_C1, pd_interrupt_handler_task, 1, TASK_STACK_SIZE) + TASK_ALWAYS(PD_INT_C1, pd_interrupt_handler_task, 1, TASK_STACK_SIZE) \ + TASK_ALWAYS(PD_INT_C2, pd_interrupt_handler_task, 2, TASK_STACK_SIZE) diff --git a/board/halvor/gpio.inc b/board/halvor/gpio.inc index 1b188e499a..7631415318 100644 --- a/board/halvor/gpio.inc +++ b/board/halvor/gpio.inc @@ -94,7 +94,9 @@ GPIO(USB_C2_OC_ODL, PIN(3, 2), GPIO_ODR_HIGH) /* Don't have a load switch for retimer */ +UNIMPLEMENTED(USB_C0_LS_EN) UNIMPLEMENTED(USB_C1_LS_EN) +UNIMPLEMENTED(USB_C2_LS_EN) UNIMPLEMENTED(USB_C0_BC12_INT_ODL) UNIMPLEMENTED(USB_C1_BC12_INT_ODL) -- cgit v1.2.1