summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacky Wang <jacky5_wang@pegatron.corp-partner.google.com>2020-11-12 18:07:36 +0800
committerCommit Bot <commit-bot@chromium.org>2020-11-17 02:13:57 +0000
commitb9dd4b3acd5758bdc84fc5160689dc553b2d9739 (patch)
treef07350eedcbe4873a58112d7feaa39a45a235775
parentb13f7473d5283f75739e207c73af116ffa406e3c (diff)
downloadchrome-ec-b9dd4b3acd5758bdc84fc5160689dc553b2d9739.tar.gz
drobit: Iinital TCPC configurations
Base on schematic, Update TCPC configurations. 1. The TCPC using rt1715 for C0 and C1. 2. Change PPC from sn5s330 to syv682x for C0. 3. Support retimer Intel Burnside Bridge for C0 and C1. BUG=b:172305295 BRANCH=firmware-volteer-13521.B TEST=make BOARD=drobit Check TCPC init ready and PPC init'd Signed-off-by: Jacky Wang <jacky5_wang@pegatron.corp-partner.google.com> Change-Id: I0e81ca5077f20104f62dbb80abe1aa347e91b765 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2534430 Reviewed-by: Michael5 Chen <michael5_chen1@pegatron.corp-partner.google.com> Reviewed-by: Keith Short <keithshort@chromium.org>
-rw-r--r--board/drobit/board.c238
-rw-r--r--board/drobit/board.h7
-rw-r--r--board/drobit/gpio.inc5
3 files changed, 26 insertions, 224 deletions
diff --git a/board/drobit/board.c b/board/drobit/board.c
index 00e7e20710..2b032faf58 100644
--- a/board/drobit/board.c
+++ b/board/drobit/board.c
@@ -10,14 +10,11 @@
#include "accelgyro.h"
#include "cbi_ec_fw_config.h"
#include "driver/bc12/pi3usb9201.h"
-#include "driver/ppc/sn5s330.h"
#include "driver/ppc/syv682x.h"
#include "driver/retimer/bb_retimer.h"
#include "driver/sync.h"
-#include "driver/tcpm/ps8xxx.h"
#include "driver/tcpm/rt1715.h"
#include "driver/tcpm/tcpci.h"
-#include "driver/tcpm/tusb422.h"
#include "extpower.h"
#include "fan.h"
#include "fan_chip.h"
@@ -67,7 +64,7 @@ struct keyboard_scan_config keyscan_config = {
* FW_CONFIG defaults for Volteer if the CBI data is not initialized.
*/
union volteer_cbi_fw_config fw_config_defaults = {
- .usb_db = DB_USB4_GEN2,
+ .usb_db = DB_USB4_GEN3,
};
static void board_init(void)
@@ -78,47 +75,6 @@ static void board_init(void)
}
DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT);
-__override enum tbt_compat_cable_speed board_get_max_tbt_speed(int port)
-{
- enum ec_cfg_usb_db_type usb_db = ec_cfg_usb_db_type();
-
- if (port == USBC_PORT_C1) {
- if (usb_db == DB_USB4_GEN2) {
- /*
- * Older boards violate 205mm trace length prior
- * to connection to the re-timer and only support up
- * to GEN2 speeds.
- */
- return TBT_SS_U32_GEN1_GEN2;
- } else if (usb_db == DB_USB4_GEN3) {
- return TBT_SS_TBT_GEN3;
- }
- }
-
- /*
- * Thunderbolt-compatible mode not supported
- *
- * TODO (b/147726366): All the USB-C ports need to support same speed.
- * Need to fix once USB-C feature set is known for Volteer.
- */
- return TBT_SS_RES_0;
-}
-
-__override bool board_is_tbt_usb4_port(int port)
-{
- enum ec_cfg_usb_db_type usb_db = ec_cfg_usb_db_type();
-
- /*
- * Volteer reference design only supports TBT & USB4 on port 1
- * if the USB4 DB is present.
- *
- * TODO (b/147732807): All the USB-C ports need to support same
- * features. Need to fix once USB-C feature set is known for Volteer.
- */
- return ((port == USBC_PORT_C1)
- && ((usb_db == DB_USB4_GEN2) || (usb_db == DB_USB4_GEN3)));
-}
-
/******************************************************************************/
/* Physical fans. These are logically separate from pwm_channels. */
@@ -308,178 +264,14 @@ const struct pwm_t pwm_channels[] = {
BUILD_ASSERT(ARRAY_SIZE(pwm_channels) == PWM_CH_COUNT);
/******************************************************************************/
-/* Volteer specific USB daughter-board configuration */
-
-/* USBC TCPC configuration for USB3 daughter board */
-static const struct tcpc_config_t tcpc_config_p1_usb3 = {
- .bus_type = EC_BUS_TYPE_I2C,
- .i2c_info = {
- .port = I2C_PORT_USB_C1,
- .addr_flags = PS8751_I2C_ADDR1_FLAGS,
- },
- .flags = TCPC_FLAGS_TCPCI_REV2_0 | TCPC_FLAGS_TCPCI_REV2_0_NO_VSAFE0V,
- .drv = &ps8xxx_tcpm_drv,
-};
-
-/*
- * USB3 DB mux configuration - the top level mux still needs to be set to the
- * virtual_usb_mux_driver so the AP gets notified of mux changes and updates
- * the TCSS configuration on state changes.
- */
-static const struct usb_mux usbc1_usb3_db_retimer = {
- .usb_port = USBC_PORT_C1,
- .driver = &tcpci_tcpm_usb_mux_driver,
- .hpd_update = &ps8xxx_tcpc_update_hpd_status,
- .next_mux = NULL,
-};
-
-static const struct usb_mux mux_config_p1_usb3_active = {
- .usb_port = USBC_PORT_C1,
- .driver = &virtual_usb_mux_driver,
- .hpd_update = &virtual_hpd_update,
- .next_mux = &usbc1_usb3_db_retimer,
-};
-
-static const struct usb_mux mux_config_p1_usb3_passive = {
- .usb_port = USBC_PORT_C1,
- .driver = &virtual_usb_mux_driver,
- .hpd_update = &virtual_hpd_update,
-};
-
-/******************************************************************************/
/* USB-A charging control */
const int usb_port_enable[USB_PORT_COUNT] = {
GPIO_EN_PP5000_USBA,
};
-static void ps8815_reset(void)
-{
- int val;
-
- gpio_set_level(GPIO_USB_C1_RT_RST_ODL, 0);
- msleep(GENERIC_MAX(PS8XXX_RESET_DELAY_MS,
- PS8815_PWR_H_RST_H_DELAY_MS));
- gpio_set_level(GPIO_USB_C1_RT_RST_ODL, 1);
- msleep(PS8815_FW_INIT_DELAY_MS);
-
- /*
- * b/144397088
- * ps8815 firmware 0x01 needs special configuration
- */
-
- CPRINTS("%s: patching ps8815 registers", __func__);
-
- if (i2c_read8(I2C_PORT_USB_C1,
- PS8751_I2C_ADDR1_P2_FLAGS, 0x0f, &val) == EC_SUCCESS)
- CPRINTS("ps8815: reg 0x0f was %02x", val);
-
- if (i2c_write8(I2C_PORT_USB_C1,
- PS8751_I2C_ADDR1_P2_FLAGS, 0x0f, 0x31) == EC_SUCCESS)
- CPRINTS("ps8815: reg 0x0f set to 0x31");
-
- if (i2c_read8(I2C_PORT_USB_C1,
- PS8751_I2C_ADDR1_P2_FLAGS, 0x0f, &val) == EC_SUCCESS)
- CPRINTS("ps8815: reg 0x0f now %02x", val);
-}
-
void board_reset_pd_mcu(void)
{
- enum ec_cfg_usb_db_type usb_db = ec_cfg_usb_db_type();
-
- /* No reset available for TCPC on port 0 */
- /* Daughterboard specific reset for port 1 */
- if (usb_db == DB_USB3_ACTIVE) {
- ps8815_reset();
- usb_mux_hpd_update(USBC_PORT_C1, 0, 0);
- }
-}
-
-/*
- * Set up support for the USB3 daughterboard:
- * Parade PS8815 TCPC (integrated retimer)
- * Diodes PI3USB9201 BC 1.2 chip (same as USB4 board)
- * Silergy SYV682A PPC (same as USB4 board)
- * Virtual mux with stacked retimer
- */
-static void config_db_usb3_active(void)
-{
- tcpc_config[USBC_PORT_C1] = tcpc_config_p1_usb3;
- usb_muxes[USBC_PORT_C1] = mux_config_p1_usb3_active;
-}
-
-/*
- * Set up support for the passive USB3 daughterboard:
- * TUSB422 TCPC (already the default)
- * PI3USB9201 BC 1.2 chip (already the default)
- * Silergy SYV682A PPC (already the default)
- * Virtual mux without stacked retimer
- */
-
-static void config_db_usb3_passive(void)
-{
- usb_muxes[USBC_PORT_C1] = mux_config_p1_usb3_passive;
-}
-
-static void config_port_discrete_tcpc(int port)
-{
- /*
- * Support 2 Pin-to-Pin compatible parts: TUSB422 and RT1715, for
- * simplicity allow either and decide at runtime which we are using.
- * Default to TUSB422, and switch to RT1715 if it is on the I2C bus and
- * the VID matches.
- */
-
- int regval;
-
- if (i2c_read16(port ? I2C_PORT_USB_C1 : I2C_PORT_USB_C0,
- RT1715_I2C_ADDR_FLAGS, TCPC_REG_VENDOR_ID,
- &regval) == EC_SUCCESS) {
- if (regval == RT1715_VENDOR_ID) {
- CPRINTS("C%d: RT1715 detected", port);
- tcpc_config[port].i2c_info.addr_flags =
- RT1715_I2C_ADDR_FLAGS;
- tcpc_config[port].drv = &rt1715_tcpm_drv;
- return;
- }
- }
- CPRINTS("C%d: Default to TUSB422", port);
-}
-
-static const char *db_type_prefix = "USB DB type: ";
-__override void board_cbi_init(void)
-{
- enum ec_cfg_usb_db_type usb_db = ec_cfg_usb_db_type();
-
- config_port_discrete_tcpc(0);
- switch (usb_db) {
- case DB_USB_ABSENT:
- CPRINTS("%sNone", db_type_prefix);
- break;
- case DB_USB4_GEN2:
- config_port_discrete_tcpc(1);
- CPRINTS("%sUSB4 Gen1/2", db_type_prefix);
- break;
- case DB_USB4_GEN3:
- config_port_discrete_tcpc(1);
- CPRINTS("%sUSB4 Gen3", db_type_prefix);
- break;
- case DB_USB3_ACTIVE:
- config_db_usb3_active();
- CPRINTS("%sUSB3 Active", db_type_prefix);
- break;
- case DB_USB3_PASSIVE:
- config_db_usb3_passive();
- config_port_discrete_tcpc(1);
- CPRINTS("%sUSB3 Passive", db_type_prefix);
- break;
- default:
- CPRINTS("%sID %d not supported", db_type_prefix, usb_db);
- }
-
- if ((!IS_ENABLED(TEST_BUILD) && !ec_cfg_has_numeric_pad()) ||
- get_board_id() <= 2)
- keyboard_raw_set_cols(KEYBOARD_COLS_NO_KEYPAD);
}
/******************************************************************************/
@@ -487,8 +279,8 @@ __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,
@@ -505,7 +297,7 @@ void ppc_interrupt(enum gpio_signal signal)
{
switch (signal) {
case GPIO_USB_C0_PPC_INT_ODL:
- sn5s330_interrupt(USBC_PORT_C0);
+ syv682x_interrupt(USBC_PORT_C0);
break;
case GPIO_USB_C1_PPC_INT_ODL:
syv682x_interrupt(USBC_PORT_C1);
@@ -535,17 +327,17 @@ struct tcpc_config_t tcpc_config[] = {
.bus_type = EC_BUS_TYPE_I2C,
.i2c_info = {
.port = I2C_PORT_USB_C0,
- .addr_flags = TUSB422_I2C_ADDR_FLAGS,
+ .addr_flags = RT1715_I2C_ADDR_FLAGS,
},
- .drv = &tusb422_tcpm_drv,
+ .drv = &rt1715_tcpm_drv,
},
[USBC_PORT_C1] = {
.bus_type = EC_BUS_TYPE_I2C,
.i2c_info = {
.port = I2C_PORT_USB_C1,
- .addr_flags = TUSB422_I2C_ADDR_FLAGS,
+ .addr_flags = RT1715_I2C_ADDR_FLAGS,
},
- .drv = &tusb422_tcpm_drv,
+ .drv = &rt1715_tcpm_drv,
},
};
BUILD_ASSERT(ARRAY_SIZE(tcpc_config) == USBC_PORT_COUNT);
@@ -553,7 +345,13 @@ BUILD_ASSERT(CONFIG_USB_PD_PORT_MAX_COUNT == USBC_PORT_COUNT);
/******************************************************************************/
/* USBC mux configuration - Tiger Lake includes internal mux */
-struct usb_mux usbc1_usb4_db_retimer = {
+struct usb_mux usbc0_usb4_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_retimer = {
.usb_port = USBC_PORT_C1,
.driver = &bb_usb_retimer,
.i2c_port = I2C_PORT_USB_1_MIX,
@@ -564,19 +362,21 @@ struct usb_mux usb_muxes[] = {
.usb_port = USBC_PORT_C0,
.driver = &virtual_usb_mux_driver,
.hpd_update = &virtual_hpd_update,
+ .next_mux = &usbc0_usb4_retimer,
},
[USBC_PORT_C1] = {
.usb_port = USBC_PORT_C1,
.driver = &virtual_usb_mux_driver,
.hpd_update = &virtual_hpd_update,
- .next_mux = &usbc1_usb4_db_retimer,
+ .next_mux = &usbc1_usb4_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,
diff --git a/board/drobit/board.h b/board/drobit/board.h
index 292d6e576a..897a724541 100644
--- a/board/drobit/board.h
+++ b/board/drobit/board.h
@@ -59,7 +59,6 @@
/* Enabling USB4 mode */
#define CONFIG_USB_PD_USB4
-#define USBC_PORT_C1_BB_RETIMER_I2C_ADDR 0x40
/*
* For USB4, set the total budget for source current to 4.5A so that the first
* connected port is allowed to source 3A while sourcing 1.5A on other type-C
@@ -67,13 +66,15 @@
*/
#define CONFIG_USB_PD_MAX_TOTAL_SOURCE_CURRENT 4500
+#define USBC_PORT_C0_BB_RETIMER_I2C_ADDR 0x40
+#define USBC_PORT_C1_BB_RETIMER_I2C_ADDR 0x41
+
/* USB Type A Features */
#define USB_PORT_COUNT 1
#define CONFIG_USB_PORT_POWER_DUMB
/* USBC PPC*/
-#define CONFIG_USBC_PPC_SN5S330 /* USBC port C0 */
-#define CONFIG_USBC_PPC_SYV682X /* USBC port C1 */
+#define CONFIG_USBC_PPC_SYV682X
/* BC 1.2 */
diff --git a/board/drobit/gpio.inc b/board/drobit/gpio.inc
index 1e7ff5120f..042d145e6a 100644
--- a/board/drobit/gpio.inc
+++ b/board/drobit/gpio.inc
@@ -79,13 +79,16 @@ GPIO(EC_PCH_INT_ODL, PIN(B, 0), GPIO_ODR_HIGH)
/* USB and USBC Signals */
GPIO(EN_PP5000_USBA, PIN(C, 6), GPIO_OUT_LOW) /* Enable USB-A charging - all ports */
GPIO(USB_A_LOW_PWR_OD, PIN(6, 6), GPIO_ODR_LOW) /* Don't limit USB-A charging by default - all ports */
+GPIO(USB_C0_RT_RST_ODL, PIN(D, 4), GPIO_ODR_LOW)
GPIO(USB_C1_RT_RST_ODL, PIN(8, 3), GPIO_ODR_LOW)
GPIO(USB_C0_OC_ODL, PIN(B, 1), GPIO_ODR_HIGH)
GPIO(USB_C1_OC_ODL, PIN(5, 0), GPIO_ODR_HIGH)
/* There is currently no need to service this interrupt. */
+GPIO(USB_C0_RT_INT_ODL, PIN(F, 2), GPIO_INPUT)
GPIO(USB_C1_RT_INT_ODL, PIN(F, 3), GPIO_INPUT)
/* Don't have a load switch for retimer */
+UNIMPLEMENTED(USB_C0_LS_EN)
UNIMPLEMENTED(USB_C1_LS_EN)
/* Misc Signals */
@@ -102,10 +105,8 @@ GPIO(EC_SLP_S0IX, PIN(7, 2), GPIO_INPUT | GPIO_PULL_UP)
/* Unused signals */
GPIO(UNUSED_GPIO41, PIN(4, 1), GPIO_INPUT | GPIO_PULL_UP)
-GPIO(UNUSED_GPIOF2, PIN(F, 2), GPIO_INPUT | GPIO_PULL_UP)
GPIO(UNUSED_GPIO96, PIN(9, 6), GPIO_INPUT | GPIO_PULL_UP)
GPIO(UNUSED_GPIO34, PIN(3, 4), GPIO_INPUT | GPIO_PULL_UP)
-GPIO(UNUSED_GPIOD4, PIN(D, 4), GPIO_INPUT | GPIO_PULL_UP)
GPIO(UNUSED_GPIO56, PIN(5, 6), GPIO_INPUT | GPIO_PULL_UP)
GPIO(UNUSED_GPIO81, PIN(8, 1), GPIO_INPUT | GPIO_PULL_UP)
GPIO(UNUSED_GPIO95, PIN(9, 5), GPIO_INPUT | GPIO_PULL_UP)