From 9981038037a413804884e938418d35fd0508309b Mon Sep 17 00:00:00 2001 From: Matt_Wang Date: Tue, 31 Aug 2021 15:17:21 +0800 Subject: felwinter: Modify daughterboard config Felwinter has two different daughterboards distinguish by FW config. FW config fields bit[2:0] 2 = USB4 1 = USB3.2 USB4 TCPC: NCT3807 PPC: SY6862 BC12: PI3USB9201 Retimer: BB USB3.2 TCPC: PS8815 PPC: SM5360A BC12: PI3USB9201 Retimer: PS8815 BUG=b:196184152, b:197595441 BRANCH=brya TEST=Test the C2 port can charge and use USB3.0/2.0 on Brya P2. Signed-off-by: Matt_Wang Change-Id: I210d37352b0b315d98c0e494fd2068fe40fcc376 Signed-off-by: Logan_Liao Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3132316 Reviewed-by: Logan Liao Reviewed-by: Elmo Lan Reviewed-by: Boris Mittelberg Reviewed-by: Ko Ko Tested-by: Logan Liao Commit-Queue: Boris Mittelberg --- board/felwinter/board.c | 7 ++ board/felwinter/board.h | 21 ++-- board/felwinter/ec.tasklist | 4 +- board/felwinter/fw_config.h | 7 +- board/felwinter/gpio.inc | 40 ++----- board/felwinter/i2c.c | 12 +-- board/felwinter/usbc_config.c | 242 ++++++++++++++++-------------------------- board/felwinter/usbc_config.h | 8 +- 8 files changed, 130 insertions(+), 211 deletions(-) (limited to 'board') diff --git a/board/felwinter/board.c b/board/felwinter/board.c index bbab3a79be..c4dfe8e530 100644 --- a/board/felwinter/board.c +++ b/board/felwinter/board.c @@ -105,3 +105,10 @@ enum battery_present battery_hw_present(void) /* The GPIO is low when the battery is physically present */ return gpio_get_level(batt_pres) ? BP_NO : BP_YES; } + +static void board_init(void) +{ + if (ec_cfg_usb_db_type() == DB_USB4_NCT3807) + db_update_usb4_config_from_config(); +} +DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT); diff --git a/board/felwinter/board.h b/board/felwinter/board.h index e15cec40b8..d9fb63c789 100644 --- a/board/felwinter/board.h +++ b/board/felwinter/board.h @@ -71,7 +71,7 @@ #define CONFIG_IO_EXPANDER #define CONFIG_IO_EXPANDER_NCT38XX -#define CONFIG_IO_EXPANDER_PORT_COUNT 4 +#define CONFIG_IO_EXPANDER_PORT_COUNT 2 #define CONFIG_USB_PD_TCPM_PS8815 #define CONFIG_USBC_RETIMER_INTEL_BB @@ -134,16 +134,16 @@ #define I2C_PORT_SENSOR NPCX_I2C_PORT0_0 -#define I2C_PORT_USB_C0_C2_TCPC NPCX_I2C_PORT1_0 +#define I2C_PORT_USB_C2_TCPC NPCX_I2C_PORT1_0 #define I2C_PORT_USB_C1_TCPC NPCX_I2C_PORT4_1 -#define I2C_PORT_USB_C0_C2_PPC NPCX_I2C_PORT2_0 +#define I2C_PORT_USB_C2_PPC NPCX_I2C_PORT2_0 #define I2C_PORT_USB_C1_PPC NPCX_I2C_PORT6_1 -#define I2C_PORT_USB_C0_C2_BC12 NPCX_I2C_PORT2_0 +#define I2C_PORT_USB_C2_BC12 NPCX_I2C_PORT2_0 #define I2C_PORT_USB_C1_BC12 NPCX_I2C_PORT6_1 -#define I2C_PORT_USB_C0_C2_MUX NPCX_I2C_PORT3_0 +#define I2C_PORT_USB_C2_MUX NPCX_I2C_PORT3_0 #define I2C_PORT_USB_C1_MUX NPCX_I2C_PORT6_1 #define I2C_PORT_BATTERY NPCX_I2C_PORT5_0 @@ -156,10 +156,9 @@ #define I2C_ADDR_MP2964_FLAGS 0x20 /* - * see b/174768555#comment22 + * */ -#define USBC_PORT_C0_BB_RETIMER_I2C_ADDR 0x56 -#define USBC_PORT_C2_BB_RETIMER_I2C_ADDR 0x57 +#define USBC_PORT_BB_RETIMER_I2C_ADDR 0x57 /* Enabling Thunderbolt-compatible mode */ #define CONFIG_USB_PD_TBT_COMPAT_MODE @@ -215,10 +214,8 @@ enum sensor_id { }; enum ioex_port { - IOEX_C0_NCT38XX = 0, - IOEX_C2_NCT38XX, - IOEX_ID_1_C0_NCT38XX, - IOEX_ID_1_C2_NCT38XX, + IOEX_C2_NCT38XX = 0, + IOEX_C1_NCT38XX, IOEX_PORT_COUNT }; diff --git a/board/felwinter/ec.tasklist b/board/felwinter/ec.tasklist index ef0aa84584..290c17c748 100644 --- a/board/felwinter/ec.tasklist +++ b/board/felwinter/ec.tasklist @@ -15,7 +15,6 @@ TASK_ALWAYS(CHG_RAMP, chg_ramp_task, NULL, 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) \ @@ -26,6 +25,5 @@ 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_shared_alert_task, (BIT(2) | BIT(0)), 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) diff --git a/board/felwinter/fw_config.h b/board/felwinter/fw_config.h index 6e4eb3ef58..f9de98a93f 100644 --- a/board/felwinter/fw_config.h +++ b/board/felwinter/fw_config.h @@ -9,15 +9,14 @@ #include /**************************************************************************** - * CBI FW_CONFIG layout for Brya board. + * CBI FW_CONFIG layout for felwinter board. * - * Source of truth is the project/brya/brya/config.star configuration file. + * Source of truth is the project/brya/felwinter/config.star configuration file. */ enum ec_cfg_usb_db_type { - DB_USB_ABSENT = 0, DB_USB3_PS8815 = 1, - DB_USB_ABSENT2 = 15 + DB_USB4_NCT3807 = 2 }; enum ec_cfg_keyboard_backlight_type { diff --git a/board/felwinter/gpio.inc b/board/felwinter/gpio.inc index fe3082ee5d..ba7116847a 100644 --- a/board/felwinter/gpio.inc +++ b/board/felwinter/gpio.inc @@ -24,10 +24,7 @@ GPIO_INT(SLP_S3_L, PIN(A, 5), GPIO_INT_BOTH, power_signal_ GPIO_INT(SLP_SUS_L, PIN(F, 1), GPIO_INT_BOTH, power_signal_interrupt) GPIO_INT(SYS_SLP_S0IX_L, PIN(D, 5), GPIO_INT_BOTH, power_signal_interrupt) GPIO_INT(TABLET_MODE_L, PIN(9, 5), GPIO_INT_BOTH, gmr_tablet_switch_isr) -GPIO_INT(USB_C0_BC12_INT_ODL, PIN(C, 6), GPIO_INT_FALLING, bc12_interrupt) -GPIO_INT(USB_C0_C2_TCPC_INT_ODL, PIN(E, 0), GPIO_INT_FALLING, tcpc_alert_event) -GPIO_INT(USB_C0_PPC_INT_ODL, PIN(6, 2), GPIO_INT_FALLING, ppc_interrupt) -GPIO_INT(USB_C0_RT_INT_ODL, PIN(B, 1), GPIO_INT_FALLING, retimer_interrupt) +GPIO_INT(USB_C2_TCPC_INT_ODL, PIN(E, 0), GPIO_INT_FALLING, tcpc_alert_event) GPIO_INT(USB_C1_BC12_INT_ODL, PIN(5, 0), GPIO_INT_FALLING, bc12_interrupt) GPIO_INT(USB_C1_PPC_INT_ODL, PIN(F, 5), GPIO_INT_FALLING, ppc_interrupt) GPIO_INT(USB_C1_TCPC_INT_ODL, PIN(A, 2), GPIO_INT_FALLING, tcpc_alert_event) @@ -129,6 +126,9 @@ UNUSED(PIN(6, 6)) /* GPIO66 */ UNUSED(PIN(C, 3)) /* GPIOC3 */ UNUSED(PIN(E, 1)) /* GPIOE1 */ UNUSED(PIN(D, 4)) /* GPIOD4 */ +UNUSED(PIN(C, 6)) /* GPIOC6 */ +UNUSED(PIN(6, 2)) /* GPIO62 */ +UNUSED(PIN(B, 1)) /* GPIOB1 */ /* Pre-configured PSL balls: J8 K6 */ @@ -140,40 +140,12 @@ UNUSED(PIN(D, 4)) /* GPIOD4 */ */ GPIO(EC_KSO_02_INV, PIN(1, 7), GPIO_OUT_LOW) -/* - * GPIO34 is an INPUT on board ID 2 and ODR_LOW on board ID 1. - * - * Since this pin is pulled up to 3.3V through a 30.9K ohm resistor on - * board ID 2, we will leak about 0.3mW until the pin is put in ALT mode - * when MODULE_ADC configuration runs. Initializing the pin to ODR_LOW - * gives us full control on both boards. - */ -GPIO(ID_1_USB_C0_C2_TCPC_RST_ODL, PIN(3, 4), GPIO_ODR_LOW) - -/* Board ID 1 IO expander configuration */ - -IOEX(ID_1_USB_C0_RT_RST_ODL, EXPIN(IOEX_ID_1_C0_NCT38XX, 0, 2), GPIO_ODR_LOW) -/* GPIO03_P1 to PU */ -IOEX(ID_1_USB_C0_FRS_EN, EXPIN(IOEX_ID_1_C0_NCT38XX, 0, 4), GPIO_LOW) -IOEX(ID_1_USB_C0_OC_ODL, EXPIN(IOEX_ID_1_C0_NCT38XX, 0, 6), GPIO_ODR_HIGH) -/* GPIO07_P1 to PU */ - -IOEX(ID_1_USB_C2_RT_RST_ODL, EXPIN(IOEX_ID_1_C2_NCT38XX, 0, 2), GPIO_ODR_LOW) -/* GPIO03_P2 to PU */ -IOEX(ID_1_USB_C2_FRS_EN, EXPIN(IOEX_ID_1_C2_NCT38XX, 0, 4), GPIO_LOW) -IOEX(ID_1_USB_C1_OC_ODL, EXPIN(IOEX_ID_1_C2_NCT38XX, 0, 6), GPIO_ODR_HIGH) -IOEX(ID_1_USB_C2_OC_ODL, EXPIN(IOEX_ID_1_C2_NCT38XX, 0, 7), GPIO_ODR_HIGH) - -/* Board ID 2 IO expander configuration */ - /* GPIO02_P2 to PU */ /* GPIO03_P2 to PU */ -IOEX(USB_C0_OC_ODL, EXPIN(IOEX_C0_NCT38XX, 0, 4), GPIO_ODR_HIGH) -IOEX(USB_C0_FRS_EN, EXPIN(IOEX_C0_NCT38XX, 0, 6), GPIO_LOW) -IOEX(USB_C0_RT_RST_ODL, EXPIN(IOEX_C0_NCT38XX, 0, 7), GPIO_ODR_LOW) + +IOEX(USB_C1_OC_ODL, EXPIN(IOEX_C1_NCT38XX, 0, 4), GPIO_ODR_HIGH) IOEX(USB_C2_RT_RST_ODL, EXPIN(IOEX_C2_NCT38XX, 0, 2), GPIO_ODR_LOW) -IOEX(USB_C1_OC_ODL, EXPIN(IOEX_C2_NCT38XX, 0, 3), GPIO_ODR_HIGH) IOEX(USB_C2_OC_ODL, EXPIN(IOEX_C2_NCT38XX, 0, 4), GPIO_ODR_HIGH) IOEX(USB_C2_FRS_EN, EXPIN(IOEX_C2_NCT38XX, 0, 6), GPIO_LOW) /* GPIO07_P2 to PU */ diff --git a/board/felwinter/i2c.c b/board/felwinter/i2c.c index bb55b13d0c..b54cc98de8 100644 --- a/board/felwinter/i2c.c +++ b/board/felwinter/i2c.c @@ -20,24 +20,24 @@ const struct i2c_port_t i2c_ports[] = { }, { /* I2C1 */ - .name = "tcpc0,2", - .port = I2C_PORT_USB_C0_C2_TCPC, + .name = "tcpc2", + .port = I2C_PORT_USB_C2_TCPC, .kbps = 1000, .scl = GPIO_EC_I2C_USB_C0_C2_TCPC_SCL, .sda = GPIO_EC_I2C_USB_C0_C2_TCPC_SDA, }, { /* I2C2 */ - .name = "ppc0,2", - .port = I2C_PORT_USB_C0_C2_PPC, + .name = "ppc2", + .port = I2C_PORT_USB_C2_PPC, .kbps = 1000, .scl = GPIO_EC_I2C_USB_C0_C2_PPC_BC_SCL, .sda = GPIO_EC_I2C_USB_C0_C2_PPC_BC_SDA, }, { /* I2C3 */ - .name = "retimer0,2", - .port = I2C_PORT_USB_C0_C2_MUX, + .name = "retimer2", + .port = I2C_PORT_USB_C2_MUX, .kbps = 1000, .scl = GPIO_EC_I2C_USB_C0_C2_RT_SCL, .sda = GPIO_EC_I2C_USB_C0_C2_RT_SDA, diff --git a/board/felwinter/usbc_config.c b/board/felwinter/usbc_config.c index 818397aa31..df9772e6f0 100644 --- a/board/felwinter/usbc_config.c +++ b/board/felwinter/usbc_config.c @@ -37,11 +37,11 @@ #define CPRINTS(format, args...) cprints(CC_USBPD, format, ## args) /* USBC TCPC configuration */ -const struct tcpc_config_t tcpc_config[] = { - [USBC_PORT_C0] = { +struct tcpc_config_t tcpc_config[] = { + [USBC_PORT_C2] = { .bus_type = EC_BUS_TYPE_I2C, .i2c_info = { - .port = I2C_PORT_USB_C0_C2_TCPC, + .port = I2C_PORT_USB_C2_TCPC, .addr_flags = NCT38XX_I2C_ADDR1_1_FLAGS, }, .drv = &nct38xx_tcpm_drv, @@ -58,24 +58,26 @@ const struct tcpc_config_t tcpc_config[] = { .flags = TCPC_FLAGS_TCPCI_REV2_0 | TCPC_FLAGS_TCPCI_REV2_0_NO_VSAFE0V, }, - [USBC_PORT_C2] = { - .bus_type = EC_BUS_TYPE_I2C, - .i2c_info = { - .port = I2C_PORT_USB_C0_C2_TCPC, - .addr_flags = NCT38XX_I2C_ADDR2_1_FLAGS, - }, - .drv = &nct38xx_tcpm_drv, - .flags = TCPC_FLAGS_TCPCI_REV2_0, - }, }; BUILD_ASSERT(ARRAY_SIZE(tcpc_config) == USBC_PORT_COUNT); BUILD_ASSERT(CONFIG_USB_PD_PORT_MAX_COUNT == USBC_PORT_COUNT); +struct tcpc_config_t tcpc_config_c1 = { + .bus_type = EC_BUS_TYPE_I2C, + .i2c_info = { + .port = I2C_PORT_USB_C1_TCPC, + .addr_flags = NCT38XX_I2C_ADDR1_1_FLAGS, + }, + .drv = &nct38xx_tcpm_drv, + .flags = TCPC_FLAGS_TCPCI_REV2_0 | + TCPC_FLAGS_NO_DEBUG_ACC_CONTROL, +}; + /* USBC PPC configuration */ struct ppc_config_t ppc_chips[] = { - [USBC_PORT_C0] = { - .i2c_port = I2C_PORT_USB_C0_C2_PPC, - .i2c_addr_flags = SYV682X_ADDR0_FLAGS, + [USBC_PORT_C2] = { + .i2c_port = I2C_PORT_USB_C2_PPC, + .i2c_addr_flags = SYV682X_ADDR2_FLAGS, .drv = &syv682x_drv, }, [USBC_PORT_C1] = { @@ -84,28 +86,26 @@ struct ppc_config_t ppc_chips[] = { .i2c_addr_flags = NX20P3483_ADDR2_FLAGS, .drv = &nx20p348x_drv, }, - [USBC_PORT_C2] = { - .i2c_port = I2C_PORT_USB_C0_C2_PPC, - /* - * b/179987870 - * schematics I2C map says ADDR3 - */ - .i2c_addr_flags = SYV682X_ADDR2_FLAGS, - .drv = &syv682x_drv, - }, }; BUILD_ASSERT(ARRAY_SIZE(ppc_chips) == USBC_PORT_COUNT); unsigned int ppc_cnt = ARRAY_SIZE(ppc_chips); +struct ppc_config_t ppc_chips_c1 = { + .i2c_port = I2C_PORT_USB_C1_PPC, + .i2c_addr_flags = SYV682X_ADDR0_FLAGS, + .drv = &syv682x_drv, +}; + /* USBC mux configuration - Alder Lake includes internal mux */ -static const struct usb_mux usbc0_tcss_usb_mux = { - .usb_port = USBC_PORT_C0, +static const struct usb_mux usbc2_tcss_usb_mux = { + .usb_port = USBC_PORT_C2, .driver = &virtual_usb_mux_driver, .hpd_update = &virtual_hpd_update, }; -static const struct usb_mux usbc2_tcss_usb_mux = { - .usb_port = USBC_PORT_C2, + +static const struct usb_mux usbc1_tcss_usb_mux = { + .usb_port = USBC_PORT_C1, .driver = &virtual_usb_mux_driver, .hpd_update = &virtual_hpd_update, }; @@ -121,13 +121,13 @@ static const struct usb_mux usbc1_usb3_db_retimer = { .hpd_update = &ps8xxx_tcpc_update_hpd_status, }; -const struct usb_mux usb_muxes[] = { - [USBC_PORT_C0] = { - .usb_port = USBC_PORT_C0, +struct usb_mux usb_muxes[] = { + [USBC_PORT_C2] = { + .usb_port = USBC_PORT_C2, .driver = &bb_usb_retimer, - .i2c_port = I2C_PORT_USB_C0_C2_MUX, - .i2c_addr_flags = USBC_PORT_C0_BB_RETIMER_I2C_ADDR, - .next_mux = &usbc0_tcss_usb_mux, + .i2c_port = I2C_PORT_USB_C2_MUX, + .i2c_addr_flags = USBC_PORT_BB_RETIMER_I2C_ADDR, + .next_mux = &usbc2_tcss_usb_mux, }, [USBC_PORT_C1] = { /* PS8815 DB */ @@ -136,30 +136,27 @@ const struct usb_mux usb_muxes[] = { .hpd_update = &virtual_hpd_update, .next_mux = &usbc1_usb3_db_retimer, }, - [USBC_PORT_C2] = { - .usb_port = USBC_PORT_C2, - .driver = &bb_usb_retimer, - .i2c_port = I2C_PORT_USB_C0_C2_MUX, - .i2c_addr_flags = USBC_PORT_C2_BB_RETIMER_I2C_ADDR, - .next_mux = &usbc2_tcss_usb_mux, - }, }; BUILD_ASSERT(ARRAY_SIZE(usb_muxes) == USBC_PORT_COUNT); +struct usb_mux usb_muxes_c1 = { + .usb_port = USBC_PORT_C1, + .driver = &bb_usb_retimer, + .i2c_port = I2C_PORT_USB_C1_MUX, + .i2c_addr_flags = USBC_PORT_BB_RETIMER_I2C_ADDR, + .next_mux = &usbc1_tcss_usb_mux, +}; + /* BC1.2 charger detect configuration */ const struct pi3usb9201_config_t pi3usb9201_bc12_chips[] = { - [USBC_PORT_C0] = { - .i2c_port = I2C_PORT_USB_C0_C2_BC12, - .i2c_addr_flags = PI3USB9201_I2C_ADDR_3_FLAGS, + [USBC_PORT_C2] = { + .i2c_port = I2C_PORT_USB_C2_BC12, + .i2c_addr_flags = PI3USB9201_I2C_ADDR_1_FLAGS, }, [USBC_PORT_C1] = { .i2c_port = I2C_PORT_USB_C1_BC12, .i2c_addr_flags = PI3USB9201_I2C_ADDR_3_FLAGS, }, - [USBC_PORT_C2] = { - .i2c_port = I2C_PORT_USB_C0_C2_BC12, - .i2c_addr_flags = PI3USB9201_I2C_ADDR_1_FLAGS, - }, }; BUILD_ASSERT(ARRAY_SIZE(pi3usb9201_bc12_chips) == USBC_PORT_COUNT); @@ -173,30 +170,18 @@ BUILD_ASSERT(ARRAY_SIZE(pi3usb9201_bc12_chips) == USBC_PORT_COUNT); */ struct ioexpander_config_t ioex_config[] = { - [IOEX_C0_NCT38XX] = { - .i2c_host_port = I2C_PORT_USB_C0_C2_TCPC, + [IOEX_C1_NCT38XX] = { + .i2c_host_port = I2C_PORT_USB_C1_TCPC, .i2c_addr_flags = NCT38XX_I2C_ADDR1_1_FLAGS, .drv = &nct38xx_ioexpander_drv, .flags = IOEX_FLAGS_DISABLED, }, [IOEX_C2_NCT38XX] = { - .i2c_host_port = I2C_PORT_USB_C0_C2_TCPC, - .i2c_addr_flags = NCT38XX_I2C_ADDR2_1_FLAGS, - .drv = &nct38xx_ioexpander_drv, - .flags = IOEX_FLAGS_DISABLED, - }, - [IOEX_ID_1_C0_NCT38XX] = { - .i2c_host_port = I2C_PORT_USB_C0_C2_TCPC, + .i2c_host_port = I2C_PORT_USB_C2_TCPC, .i2c_addr_flags = NCT38XX_I2C_ADDR1_1_FLAGS, .drv = &nct38xx_ioexpander_drv, .flags = IOEX_FLAGS_DISABLED, }, - [IOEX_ID_1_C2_NCT38XX] = { - .i2c_host_port = I2C_PORT_USB_C0_C2_TCPC, - .i2c_addr_flags = NCT38XX_I2C_ADDR2_1_FLAGS, - .drv = &nct38xx_ioexpander_drv, - .flags = IOEX_FLAGS_DISABLED, - }, }; BUILD_ASSERT(ARRAY_SIZE(ioex_config) == CONFIG_IO_EXPANDER_PORT_COUNT); @@ -215,19 +200,12 @@ __override int bb_retimer_power_enable(const struct usb_mux *me, bool enable) { enum ioex_signal rst_signal; - if (me->usb_port == USBC_PORT_C0) { - if (get_board_id() == 1) - rst_signal = IOEX_ID_1_USB_C0_RT_RST_ODL; - else - rst_signal = IOEX_USB_C0_RT_RST_ODL; - } else if (me->usb_port == USBC_PORT_C2) { - if (get_board_id() == 1) - rst_signal = IOEX_ID_1_USB_C2_RT_RST_ODL; - else - rst_signal = IOEX_USB_C2_RT_RST_ODL; - } else { + if (me->usb_port == USBC_PORT_C1) + rst_signal = GPIO_USB_C1_RT_RST_R_ODL; + else if (me->usb_port == USBC_PORT_C2) + rst_signal = IOEX_USB_C2_RT_RST_ODL; + else return EC_ERROR_INVAL; - } /* * We do not have a load switch for the burnside bridge chips, @@ -247,20 +225,6 @@ __override int bb_retimer_power_enable(const struct usb_mux *me, bool enable) * which powers I2C controller within retimer */ msleep(1); - if (get_board_id() == 1) { - int val; - - /* - * Check if we were able to deassert - * reset. Board ID 1 uses a GPIO that is - * uncontrollable when a debug accessory is - * connected. - */ - if (ioex_get_level(rst_signal, &val) != EC_SUCCESS) - return EC_ERROR_UNKNOWN; - if (val != 1) - return EC_ERROR_NOT_POWERED; - } } else { ioex_set_level(rst_signal, 0); msleep(1); @@ -270,22 +234,16 @@ __override int bb_retimer_power_enable(const struct usb_mux *me, bool enable) void board_reset_pd_mcu(void) { - enum gpio_signal tcpc_rst; - - if (get_board_id() == 1) - tcpc_rst = GPIO_ID_1_USB_C0_C2_TCPC_RST_ODL; - else - tcpc_rst = GPIO_USB_C0_C2_TCPC_RST_ODL; - /* * TODO(b/179648104): figure out correct timing */ - gpio_set_level(tcpc_rst, 0); - if (ec_cfg_usb_db_type() != DB_USB_ABSENT) { + gpio_set_level(GPIO_USB_C0_C2_TCPC_RST_ODL, 0); + gpio_set_level(GPIO_USB_C1_RT_RST_R_ODL, 0); + + if (ec_cfg_usb_db_type() == DB_USB4_NCT3807) gpio_set_level(GPIO_USB_C1_RST_ODL, 0); - gpio_set_level(GPIO_USB_C1_RT_RST_R_ODL, 0); - } + /* * delay for power-on to reset-off and min. assertion time @@ -293,11 +251,11 @@ void board_reset_pd_mcu(void) msleep(20); - gpio_set_level(tcpc_rst, 1); - if (ec_cfg_usb_db_type() != DB_USB_ABSENT) { + gpio_set_level(GPIO_USB_C0_C2_TCPC_RST_ODL, 1); + gpio_set_level(GPIO_USB_C1_RT_RST_R_ODL, 1); + + if (ec_cfg_usb_db_type() == DB_USB4_NCT3807) gpio_set_level(GPIO_USB_C1_RST_ODL, 1); - gpio_set_level(GPIO_USB_C1_RT_RST_R_ODL, 1); - } /* wait for chips to come up */ @@ -321,31 +279,22 @@ static void board_tcpc_init(void) * C0/C2 TCPC, so they must be set up after the TCPC has * been taken out of reset. */ - if (get_board_id() == 1) { - enable_ioex(IOEX_ID_1_C0_NCT38XX); - enable_ioex(IOEX_ID_1_C2_NCT38XX); - } else { - enable_ioex(IOEX_C0_NCT38XX); - enable_ioex(IOEX_C2_NCT38XX); - } + if (ec_cfg_usb_db_type() == DB_USB4_NCT3807) + enable_ioex(IOEX_C1_NCT38XX); + enable_ioex(IOEX_C2_NCT38XX); } /* 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_C2_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); - - if (ec_cfg_usb_db_type() != DB_USB_ABSENT) { - gpio_enable_interrupt(GPIO_USB_C1_PPC_INT_ODL); - gpio_enable_interrupt(GPIO_USB_C1_TCPC_INT_ODL); - gpio_enable_interrupt(GPIO_USB_C1_BC12_INT_ODL); - } } DECLARE_HOOK(HOOK_INIT, board_tcpc_init, HOOK_PRIO_INIT_CHIPSET); @@ -353,11 +302,10 @@ uint16_t tcpc_get_alert_status(void) { uint16_t status = 0; - if (gpio_get_level(GPIO_USB_C0_C2_TCPC_INT_ODL) == 0) - status |= PD_STATUS_TCPC_ALERT_0 | PD_STATUS_TCPC_ALERT_2; + if (gpio_get_level(GPIO_USB_C2_TCPC_INT_ODL) == 0) + status |= PD_STATUS_TCPC_ALERT_0; - if ((ec_cfg_usb_db_type() != DB_USB_ABSENT) && - gpio_get_level(GPIO_USB_C1_TCPC_INT_ODL) == 0) + if (gpio_get_level(GPIO_USB_C1_TCPC_INT_ODL) == 0) status |= PD_STATUS_TCPC_ALERT_1; return status; @@ -365,25 +313,20 @@ uint16_t tcpc_get_alert_status(void) int ppc_get_alert_status(int port) { - if (port == USBC_PORT_C0) - return gpio_get_level(GPIO_USB_C0_PPC_INT_ODL) == 0; - else if ((port == USBC_PORT_C1) && - (ec_cfg_usb_db_type() != DB_USB_ABSENT)) - return gpio_get_level(GPIO_USB_C1_PPC_INT_ODL) == 0; - else if (port == USBC_PORT_C2) + if (port == USBC_PORT_C2) return gpio_get_level(GPIO_USB_C2_PPC_INT_ODL) == 0; + else if (port == USBC_PORT_C1) + return gpio_get_level(GPIO_USB_C1_PPC_INT_ODL) == 0; return 0; } void tcpc_alert_event(enum gpio_signal signal) { switch (signal) { - case GPIO_USB_C0_C2_TCPC_INT_ODL: - schedule_deferred_pd_interrupt(USBC_PORT_C0); + case GPIO_USB_C2_TCPC_INT_ODL: + schedule_deferred_pd_interrupt(USBC_PORT_C2); break; case GPIO_USB_C1_TCPC_INT_ODL: - if (ec_cfg_usb_db_type() == DB_USB_ABSENT) - break; schedule_deferred_pd_interrupt(USBC_PORT_C1); break; default: @@ -394,16 +337,11 @@ void tcpc_alert_event(enum gpio_signal signal) void bc12_interrupt(enum gpio_signal signal) { switch (signal) { - case GPIO_USB_C0_BC12_INT_ODL: - task_set_event(TASK_ID_USB_CHG_P0, USB_CHG_EVENT_BC12); - break; case GPIO_USB_C1_BC12_INT_ODL: - if (ec_cfg_usb_db_type() == DB_USB_ABSENT) - break; - task_set_event(TASK_ID_USB_CHG_P1, USB_CHG_EVENT_BC12); + task_set_event(TASK_ID_USB_CHG_P0, USB_CHG_EVENT_BC12); break; case GPIO_USB_C2_BC12_INT_ODL: - task_set_event(TASK_ID_USB_CHG_P2, USB_CHG_EVENT_BC12); + task_set_event(TASK_ID_USB_CHG_P1, USB_CHG_EVENT_BC12); break; default: break; @@ -413,17 +351,14 @@ void bc12_interrupt(enum gpio_signal signal) void ppc_interrupt(enum gpio_signal signal) { switch (signal) { - case GPIO_USB_C0_PPC_INT_ODL: - syv682x_interrupt(USBC_PORT_C0); - break; case GPIO_USB_C1_PPC_INT_ODL: switch (ec_cfg_usb_db_type()) { - case DB_USB_ABSENT: - case DB_USB_ABSENT2: - break; case DB_USB3_PS8815: nx20p348x_interrupt(USBC_PORT_C1); break; + case DB_USB4_NCT3807: + syv682x_interrupt(USBC_PORT_C1); + break; } break; case GPIO_USB_C2_PPC_INT_ODL: @@ -443,12 +378,14 @@ void retimer_interrupt(enum gpio_signal signal) __override bool board_is_dts_port(int port) { - return port == USBC_PORT_C0; + return port == USBC_PORT_C2; } __override bool board_is_tbt_usb4_port(int port) { - if (port == USBC_PORT_C0 || port == USBC_PORT_C2) + if ((port == USBC_PORT_C2) || + ((port == USBC_PORT_C1) && + (ec_cfg_usb_db_type() == DB_USB4_NCT3807))) return true; return false; @@ -461,3 +398,10 @@ __override enum tbt_compat_cable_speed board_get_max_tbt_speed(int port) return TBT_SS_TBT_GEN3; } + +void db_update_usb4_config_from_config(void) +{ + tcpc_config[USBC_PORT_C1] = tcpc_config_c1; + ppc_chips[USBC_PORT_C1] = ppc_chips_c1; + usb_muxes[USBC_PORT_C1] = usb_muxes_c1; +} diff --git a/board/felwinter/usbc_config.h b/board/felwinter/usbc_config.h index 5d08a446fb..cea53dcaa2 100644 --- a/board/felwinter/usbc_config.h +++ b/board/felwinter/usbc_config.h @@ -8,15 +8,17 @@ #ifndef __CROS_EC_USBC_CONFIG_H #define __CROS_EC_USBC_CONFIG_H -#define CONFIG_USB_PD_PORT_MAX_COUNT 3 +#define CONFIG_USB_PD_PORT_MAX_COUNT 2 +#define CONFIG_USB_PD_TCPC_RUNTIME_CONFIG +#define CONFIG_USB_MUX_RUNTIME_CONFIG enum usbc_port { - USBC_PORT_C0 = 0, + USBC_PORT_C2 = 0, USBC_PORT_C1, - USBC_PORT_C2, USBC_PORT_COUNT }; void config_usb_db_type(void); +void db_update_usb4_config_from_config(void); #endif /* __CROS_EC_USBC_CONFIG_H */ -- cgit v1.2.1