diff options
author | YH Lin <yueherngl@chromium.org> | 2022-12-03 00:19:30 +0000 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-12-05 17:43:05 +0000 |
commit | c8af732351cc5c7167f27e8390e26f0556f53a5a (patch) | |
tree | bdff671e5ad3e71e30ab56f4f084f34a2fd72e28 /board/gaelin | |
parent | af25602b15b22b9ef5821dcba9934311f2157c48 (diff) | |
download | chrome-ec-c8af732351cc5c7167f27e8390e26f0556f53a5a.tar.gz |
Revert "Merge remote-tracking branch cros/main into factory-brya-14517.B-main"factory-brya-14517.B-main
This reverts commit af25602b15b22b9ef5821dcba9934311f2157c48.
Reason for revert: broken build due to ec-utils.
Original change's description:
> Merge remote-tracking branch cros/main into factory-brya-14517.B-main
>
> Generated by: util/update_release_branch.py --baseboard brya --relevant_paths_file
> baseboard/brya/relevant-paths.txt factory-brya-14517.B-main
>
> Relevant changes:
>
> git log --oneline 54462f034b..aa40b859b3 -- baseboard/brya board/agah
> board/anahera board/banshee board/brya board/crota board/felwinter
> board/gimble board/kano board/mithrax board/osiris board/primus
> board/redrix board/taeko board/taniks board/vell board/volmar
> driver/bc12/pi3usb9201_public.* driver/charger/bq25710.*
> driver/ppc/nx20p348x.* driver/ppc/syv682x_public.*
> driver/retimer/bb_retimer_public.* driver/tcpm/nct38xx.*
> driver/tcpm/ps8xxx_public.* driver/tcpm/tcpci.* include/power/alderlake*
> include/intel_x86.h power/alderlake* power/intel_x86.c
> util/getversion.sh
>
> e6da633c38 driver: Sort header files
> 234a87ae2d tcpci: Add FRS enable to driver structure
> a56be59ccd tcpm_header: add test for tcpm_dump_registers
> 57b3256963 Rename CONFIG_CHARGER_INPUT_CURRENT to _CHARGER_DEFAULT_CURRENT_LIMIT
> e420c8ff9a marasov: Modify TypeC and TypeA configuration.
> 43b53e0045 Add default implementation of board_set_charge_limit
> b75dc90677 Add CONFIG_CHARGER_MIN_INPUT_CURRENT_LIMIT
> f1b563c350 baseboard: Sort header files
> 7d01b1e58d driver/retimer/ps8818.h: Add I2C ADDR FLAGS 0x30, 0x58, 0x70
> ec31407993 Add CONFIG_CHARGER_INPUT_CURRENT_DERATE_PCT
> 8f89f69a5b crota: disable lid angle sensor for clamshell
>
> BRANCH=None
> BUG=b:259002141 b:255184961 b:247100970 b:259354679 b:260630630
> BUG=b:163093572 b:254328661
> TEST=`emerge-brya chromeos-ec`
>
> Force-Relevant-Builds: all
> Change-Id: Ia85a701fbf6b8e67ec214b9e25e0e55e980a6f47
> Signed-off-by: YH Lin <yueherngl@google.com>
Bug: b:259002141 b:255184961 b:247100970 b:259354679 b:260630630
Bug: b:163093572 b:254328661
Change-Id: I48d5aa4cc67a69ee1f6ac9255ac3087d34da4c72
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4077248
Tested-by: YH Lin <yueherngl@chromium.org>
Commit-Queue: YH Lin <yueherngl@chromium.org>
Reviewed-by: Boris Mittelberg <bmbm@google.com>
Auto-Submit: YH Lin <yueherngl@chromium.org>
Diffstat (limited to 'board/gaelin')
-rw-r--r-- | board/gaelin/board.c | 50 | ||||
-rw-r--r-- | board/gaelin/board.h | 61 | ||||
-rw-r--r-- | board/gaelin/build.mk | 1 | ||||
-rw-r--r-- | board/gaelin/ec.tasklist | 5 | ||||
-rw-r--r-- | board/gaelin/fans.c | 12 | ||||
-rw-r--r-- | board/gaelin/gpio.inc | 91 | ||||
-rw-r--r-- | board/gaelin/i2c.c | 52 | ||||
-rw-r--r-- | board/gaelin/led.c | 4 | ||||
-rw-r--r-- | board/gaelin/pwm.c | 4 | ||||
-rw-r--r-- | board/gaelin/thermal.c | 140 | ||||
-rw-r--r-- | board/gaelin/usbc_config.c | 289 | ||||
-rw-r--r-- | board/gaelin/usbc_config.h | 9 |
12 files changed, 422 insertions, 296 deletions
diff --git a/board/gaelin/board.c b/board/gaelin/board.c index 7228c9e2f2..6fad328a76 100644 --- a/board/gaelin/board.c +++ b/board/gaelin/board.c @@ -17,6 +17,7 @@ #include "gpio_signal.h" #include "power_button.h" #include "hooks.h" +#include "peripheral_charger.h" #include "power.h" #include "switch.h" #include "throttle_ap.h" @@ -40,6 +41,33 @@ const int usb_port_enable[USB_PORT_COUNT] = { }; BUILD_ASSERT(ARRAY_SIZE(usb_port_enable) == USB_PORT_COUNT); +extern struct pchg_drv cps8100_drv; +struct pchg pchgs[] = { + [0] = { + .cfg = &(const struct pchg_config) { + .drv = &cps8100_drv, + .i2c_port = I2C_PORT_QI, + .irq_pin = GPIO_QI_INT_ODL, + .full_percent = 96, + .block_size = 128, + }, + .policy = { + [PCHG_CHIPSET_STATE_ON] = &pchg_policy_on, + [PCHG_CHIPSET_STATE_SUSPEND] = &pchg_policy_suspend, + }, + .events = QUEUE_NULL(PCHG_EVENT_QUEUE_SIZE, enum pchg_event), + }, +}; +const int pchg_count = ARRAY_SIZE(pchgs); + +__override void board_pchg_power_on(int port, bool on) +{ + if (port == 0) + gpio_set_level(GPIO_EC_QI_PWR, on); + else + CPRINTS("%s: Invalid port=%d", __func__, port); +} + /******************************************************************************/ int board_set_active_charge_port(int port) @@ -90,6 +118,7 @@ int board_set_active_charge_port(int port) switch (port) { case CHARGE_PORT_TYPEC0: case CHARGE_PORT_TYPEC1: + case CHARGE_PORT_TYPEC2: gpio_set_level(GPIO_EN_PPVAR_BJ_ADP_L, 1); break; case CHARGE_PORT_BARRELJACK: @@ -264,7 +293,6 @@ void board_overcurrent_event(int port, int is_overcurrented) usbc_overcurrent = is_overcurrented; update_5v_usage(); } - /* * Power monitoring and management. * @@ -308,6 +336,7 @@ void board_overcurrent_event(int port, int is_overcurrented) #define THROT_TYPE_A_REAR BIT(1) #define THROT_TYPE_C0 BIT(2) #define THROT_TYPE_C1 BIT(3) +#define THROT_TYPE_C2 BIT(4) #define THROT_PROCHOT BIT(5) /* @@ -442,6 +471,16 @@ static void power_monitor(void) gap += POWER_GAIN_TYPE_C; } /* + * If the type-C port is sourcing power, + * check whether it should be throttled. + */ + if (ppc_is_sourcing_vbus(2) && gap <= 0) { + new_state |= THROT_TYPE_C2; + headroom_5v_z1 += PWR_Z1_C_HIGH - PWR_Z1_C_LOW; + if (!(current_state & THROT_TYPE_C2)) + gap += POWER_GAIN_TYPE_C; + } + /* * As a last resort, turn on PROCHOT to * throttle the CPU. */ @@ -531,6 +570,15 @@ static void power_monitor(void) tcpm_select_rp_value(1, rp); pd_update_contract(1); } + if (diff & THROT_TYPE_C2) { + enum tcpc_rp_value rp = (new_state & THROT_TYPE_C2) ? + TYPEC_RP_1A5 : + TYPEC_RP_3A0; + + ppc_set_vbus_source_current_limit(2, rp); + tcpm_select_rp_value(2, rp); + pd_update_contract(2); + } if (diff & THROT_TYPE_A_REAR) { int typea_bc = (new_state & THROT_TYPE_A_REAR) ? 1 : 0; diff --git a/board/gaelin/board.h b/board/gaelin/board.h index 166f0f1432..f113c6cffd 100644 --- a/board/gaelin/board.h +++ b/board/gaelin/board.h @@ -16,7 +16,7 @@ #define CONFIG_MP2964 /* Barrel Jack */ -#define DEDICATED_CHARGE_PORT 2 +#define DEDICATED_CHARGE_PORT 3 /* HDMI CEC */ #define CONFIG_CEC @@ -31,9 +31,19 @@ /* USB Type C and USB PD defines */ #define CONFIG_USB_PD_REQUIRE_AP_MODE_ENTRY +#define CONFIG_IO_EXPANDER +#define CONFIG_IO_EXPANDER_NCT38XX +#define CONFIG_IO_EXPANDER_PORT_COUNT 2 + #define CONFIG_USB_PD_PPC -#define CONFIG_USB_PD_TCPM_PS8815 -#define CONFIG_USBC_PPC_NX20P3483 /* Compatible with Silicon Mitus SM5360A */ +#define CONFIG_USB_PD_TCPM_RT1715 +#define CONFIG_USBC_RETIMER_INTEL_BB + +#define CONFIG_USBC_RETIMER_KB800X +#define CONFIG_KB800X_CUSTOM_XBAR +#define CONFIG_USBC_PPC_SYV682X +#undef CONFIG_SYV682X_HV_ILIM +#define CONFIG_SYV682X_HV_ILIM SYV682X_HV_ILIM_5_50 /* TODO: b/177608416 - measure and check these values on brya */ #define PD_POWER_SUPPLY_TURN_ON_DELAY 30000 /* us */ @@ -82,17 +92,22 @@ #define GPIO_RECOVERY_L_2 GPIO_GSC_EC_RECOVERY_BTN_OD /* I2C Bus Configuration */ -#define I2C_PORT_SCALER NPCX_I2C_PORT5_0 -#define I2C_PORT_USB_C0_TCPC NPCX_I2C_PORT1_0 +#define I2C_PORT_DP_REDRIVER NPCX_I2C_PORT0_0 + +#define I2C_PORT_USB_C0_C2_TCPC NPCX_I2C_PORT1_0 #define I2C_PORT_USB_C1_TCPC NPCX_I2C_PORT4_1 -#define I2C_PORT_USB_C0_PPC NPCX_I2C_PORT2_0 -#define I2C_PORT_USB_C1_PPC NPCX_I2C_PORT3_0 +#define I2C_PORT_USB_C0_C2_PPC NPCX_I2C_PORT2_0 +#define I2C_PORT_USB_C1_PPC NPCX_I2C_PORT6_1 -#define I2C_PORT_USB_C0_BC12 NPCX_I2C_PORT2_0 -#define I2C_PORT_USB_C1_BC12 NPCX_I2C_PORT3_0 +#define I2C_PORT_USB_C0_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_C1_MUX NPCX_I2C_PORT6_1 + +#define I2C_PORT_QI NPCX_I2C_PORT5_0 #define I2C_PORT_EEPROM NPCX_I2C_PORT7_0 #define I2C_PORT_MP2964 NPCX_I2C_PORT7_0 @@ -100,7 +115,17 @@ #define I2C_ADDR_MP2964_FLAGS 0x20 -#define I2C_ADDR_SCALER_FLAGS 0x58 +#define USBC_PORT_C0_BB_RETIMER_I2C_ADDR 0x58 +#define USBC_PORT_C2_BB_RETIMER_I2C_ADDR 0x59 + +/* Enabling Thunderbolt-compatible mode */ +#define CONFIG_USB_PD_TBT_COMPAT_MODE + +/* Enabling USB4 mode */ +#define CONFIG_USB_PD_USB4 + +/* Retimer */ +#define CONFIG_USBC_RETIMER_FW_UPDATE /* Thermal features */ #define CONFIG_THERMISTOR @@ -111,14 +136,21 @@ /* ADC */ #define CONFIG_ADC -/* Fan */ +/* + * TODO(b/197478860): Enable the fan control. We need + * to check the sensor value and adjust the fan speed. + */ #define CONFIG_FANS FAN_CH_COUNT -#define RPM_DEVIATION 1 -#define CONFIG_CUSTOM_FAN_CONTROL /* Include math_util for bitmask_uint64 used in pd_timers */ #define CONFIG_MATH_UTIL +/* WPC/Qi charger */ +#ifdef SECTION_IS_RW +#define CONFIG_PERIPHERAL_CHARGER +#define CONFIG_CPS8100 +#endif + #ifndef __ASSEMBLER__ #include "gpio_signal.h" /* needed by registers.h */ @@ -128,6 +160,7 @@ enum charge_port { CHARGE_PORT_TYPEC0, CHARGE_PORT_TYPEC1, + CHARGE_PORT_TYPEC2, CHARGE_PORT_BARRELJACK, CHARGE_PORT_ENUM_COUNT }; @@ -150,6 +183,8 @@ enum temp_sensor_id { TEMP_SENSOR_COUNT }; +enum ioex_port { IOEX_C0_NCT38XX = 0, IOEX_C2_NCT38XX, IOEX_PORT_COUNT }; + enum pwm_channel { PWM_CH_LED_GREEN, /* PWM0 */ PWM_CH_FAN, /* PWM5 */ diff --git a/board/gaelin/build.mk b/board/gaelin/build.mk index 6961fb3f60..3de758d1bd 100644 --- a/board/gaelin/build.mk +++ b/board/gaelin/build.mk @@ -19,5 +19,4 @@ board-y+=i2c.o board-y+=led.o board-y+=pwm.o board-y+=sensors.o -board-y+=thermal.o board-y+=usbc_config.o diff --git a/board/gaelin/ec.tasklist b/board/gaelin/ec.tasklist index 4a40f332e8..d16fc35f52 100644 --- a/board/gaelin/ec.tasklist +++ b/board/gaelin/ec.tasklist @@ -12,8 +12,10 @@ #define CONFIG_TASK_LIST \ TASK_ALWAYS(HOOKS, hook_task, NULL, LARGER_TASK_STACK_SIZE) \ + TASK_ALWAYS_RW(PCHG, pchg_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_NOTEST(CHIPSET, chipset_task, NULL, LARGER_TASK_STACK_SIZE) \ TASK_ALWAYS(USB_MUX, usb_mux_task, NULL, VENTI_TASK_STACK_SIZE) \ TASK_ALWAYS(HOSTCMD, host_command_task, NULL, LARGER_TASK_STACK_SIZE) \ @@ -21,6 +23,7 @@ TASK_ALWAYS(POWERBTN, power_button_task, NULL, LARGER_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_INT_C0, pd_interrupt_handler_task, 0, LARGER_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)), LARGER_TASK_STACK_SIZE) \ TASK_ALWAYS(PD_INT_C1, pd_interrupt_handler_task, 1, LARGER_TASK_STACK_SIZE) \ TASK_ALWAYS(CEC, cec_task, NULL, LARGER_TASK_STACK_SIZE) diff --git a/board/gaelin/fans.c b/board/gaelin/fans.c index 5f54e6e63c..6828438a10 100644 --- a/board/gaelin/fans.c +++ b/board/gaelin/fans.c @@ -30,10 +30,16 @@ static const struct fan_conf fan_conf_0 = { .enable_gpio = GPIO_EN_PP5000_FAN, }; +/* + * TOOD(b/197478860): need to update for real fan + * + * Prototype fan spins at about 7200 RPM at 100% PWM. + * Set minimum at around 30% PWM. + */ static const struct fan_rpm fan_rpm_0 = { - .rpm_min = 2350, - .rpm_start = 2350, - .rpm_max = 4100, + .rpm_min = 2200, + .rpm_start = 2200, + .rpm_max = 7200, }; const struct fan_t fans[FAN_CH_COUNT] = { diff --git a/board/gaelin/gpio.inc b/board/gaelin/gpio.inc index 6de7003743..51cf0010c6 100644 --- a/board/gaelin/gpio.inc +++ b/board/gaelin/gpio.inc @@ -18,11 +18,15 @@ GPIO_INT(SLP_S3_L, PIN(A, 5), GPIO_INT_BOTH, power_signal_inte 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(USB_C0_BC12_INT_ODL, PIN(C, 6), GPIO_INT_FALLING, bc12_interrupt) -GPIO_INT(USB_C0_TCPC_INT_ODL, PIN(E, 0), GPIO_INT_FALLING, tcpc_alert_event) +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_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) +GPIO_INT(USB_C2_BC12_INT_ODL, PIN(8, 3), GPIO_INT_FALLING, bc12_interrupt) +GPIO_INT(USB_C2_PPC_INT_ODL, PIN(7, 0), GPIO_INT_FALLING, ppc_interrupt) +GPIO_INT(USB_C2_RT_INT_ODL, PIN(4, 1), GPIO_INT_FALLING, retimer_interrupt) GPIO_INT(BJ_ADP_PRESENT_ODL, PIN(8, 2), GPIO_INT_BOTH | GPIO_PULL_UP, adp_connect_interrupt) GPIO_INT(EC_RECOVERY_BTN_OD, PIN(2, 3), GPIO_INT_BOTH, button_interrupt) GPIO_INT(HDMI_CONN_OC_ODL, PIN(2, 4), GPIO_INPUT | GPIO_INT_BOTH, port_ocp_interrupt) @@ -30,6 +34,11 @@ GPIO_INT(USB_A0_OC_ODL, PIN(3, 1), GPIO_INPUT | GPIO_PULL_UP | GPIO GPIO_INT(USB_A1_OC_ODL, PIN(3, 0), GPIO_INPUT | GPIO_PULL_UP | GPIO_INT_BOTH, port_ocp_interrupt) GPIO_INT(USB_A2_OC_ODL, PIN(2, 7), GPIO_INPUT | GPIO_PULL_UP | GPIO_INT_BOTH, port_ocp_interrupt) GPIO_INT(USB_A3_OC_ODL, PIN(2, 6), GPIO_INPUT | GPIO_PULL_UP | GPIO_INT_BOTH, port_ocp_interrupt) +#ifdef SECTION_IS_RW +GPIO_INT(QI_INT_ODL, PIN(9, 6), GPIO_INT_FALLING, pchg_irq) +#else +UNIMPLEMENTED(QI_INT_ODL) +#endif /* CCD */ GPIO(CCD_MODE_ODL, PIN(E, 5), GPIO_INPUT) @@ -45,25 +54,8 @@ GPIO(EN_PP5000_FAN, PIN(6, 1), GPIO_OUT_HIGH) GPIO(ANALOG_PPVAR_PWR_IN_IMON_EC, PIN(4, 2), GPIO_INPUT) /* Display */ -GPIO(EC_OVERRIDE_SCLR_EN, PIN(D, 4), GPIO_OUT_HIGH) - -/* TODO(b/260063632): the gpio pin control is wip, setting to level high - to enable the backlight by default */ -GPIO(EC_12VSC_EN, PIN(D, 2), GPIO_OUT_HIGH) - -GPIO(OSD_STS, PIN(4, 1), GPIO_INPUT) -GPIO(DISP_MODE, PIN(A, 0), GPIO_INPUT) -GPIO(PANEL_PWR_STS, PIN(9, 5), GPIO_INPUT) -GPIO(EN_SCLR_RAILS, PIN(0, 4), GPIO_INPUT) -GPIO(HDMI_5V_IN, PIN(9, 3), GPIO_INPUT) -GPIO(HDMI0_CABLE_DET, PIN(9, 6), GPIO_INPUT) -GPIO(WP_EC, PIN(C, 3), GPIO_INPUT) -GPIO(OSD_INT, PIN(0, 5), GPIO_INPUT) - -/* Audio */ -/* TODO(b/260063632): the gpio pin control is wip, setting to level high - to enable the speaker by default */ -GPIO(EC_AMP_SD, PIN(5, 6), GPIO_OUT_HIGH) +GPIO(DP_CONN_OC_ODL, PIN(2, 5), GPIO_INPUT) + /* BarrelJack */ GPIO(EN_PPVAR_BJ_ADP_L, PIN(0, 7), GPIO_OUT_LOW) @@ -87,6 +79,17 @@ GPIO(CPU_C10_GATE_L, PIN(6, 7), GPIO_INPUT) GPIO(EC_PCH_PWR_BTN_ODL, PIN(C, 1), GPIO_ODR_HIGH) GPIO(GSC_EC_RECOVERY_BTN_OD, PIN(2, 2), GPIO_INPUT) +/* NFC */ +/* TODO(b/194068530): Enable NFC */ +GPIO(NFC_COIL_ACT_L, PIN(D, 4), GPIO_INPUT) +GPIO(NFC_LOW_POWER_MODE, PIN(9, 5), GPIO_OUT_HIGH) +GPIO(NFC_CARD_DET_L, PIN(A, 3), GPIO_INPUT) +GPIO(EN_NFC_BUZZER, PIN(0, 5), GPIO_OUT_LOW) + +/* Wireless Charger */ +GPIO(EC_QI_PWR, PIN(D, 2), GPIO_OUT_LOW) +GPIO(QI_RESET_L, PIN(9, 3), GPIO_OUT_HIGH) + /* HDMI CEC */ /* TODO(b/197474873): Enable HDMI CEC */ GPIO(HDMI_CEC_IN, PIN(4, 0), GPIO_INPUT) @@ -94,16 +97,20 @@ GPIO(HDMI_CEC_OUT, PIN(D, 3), GPIO_OUT_HIGH | GPIO_OPEN_DRAIN) GPIO(HDMI_CEC_PULL_UP, PIN(C, 2), GPIO_OUT_HIGH) /* I2C SCL/SDA */ -GPIO(SMSCALER_CLK, PIN(3, 3), GPIO_INPUT) -GPIO(SMSCALER_DATA, PIN(3, 6), GPIO_INPUT) +GPIO(EC_I2C_QI_SCL, PIN(3, 3), GPIO_INPUT) +GPIO(EC_I2C_QI_SDA, PIN(3, 6), GPIO_INPUT) GPIO(EC_I2C_MISC_SCL_R, PIN(B, 3), GPIO_INPUT) GPIO(EC_I2C_MISC_SDA_R, PIN(B, 2), GPIO_INPUT) -GPIO(EC_I2C_USB_C0_PPC_BC_SCL, PIN(9, 2), GPIO_INPUT) -GPIO(EC_I2C_USB_C0_PPC_BC_SDA, PIN(9, 1), GPIO_INPUT) -GPIO(EC_I2C_USB_C1_PPC_BC_SCL, PIN(D, 1), GPIO_INPUT) -GPIO(EC_I2C_USB_C1_PPC_BC_SDA, PIN(D, 0), GPIO_INPUT) -GPIO(EC_I2C_USB_C0_TCPC_SCL, PIN(9, 0), GPIO_INPUT) -GPIO(EC_I2C_USB_C0_TCPC_SDA, PIN(8, 7), GPIO_INPUT) +GPIO(EC_I2C_DP_SCL, PIN(B, 5), GPIO_INPUT) +GPIO(EC_I2C_DP_SDA, PIN(B, 4), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_C2_PPC_SCL, PIN(9, 2), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_C2_PPC_SDA, PIN(9, 1), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_C2_RT_SCL, PIN(D, 1), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_C2_RT_SDA, PIN(D, 0), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_C2_TCPC_SCL, PIN(9, 0), GPIO_INPUT) +GPIO(EC_I2C_USB_C0_C2_TCPC_SDA, PIN(8, 7), GPIO_INPUT) +GPIO(EC_I2C_USB_C1_MIX_SCL, PIN(E, 4), GPIO_INPUT) +GPIO(EC_I2C_USB_C1_MIX_SDA, PIN(E, 3), GPIO_INPUT) GPIO(EC_I2C_USB_C1_TCPC_SCL, PIN(F, 3), GPIO_INPUT) GPIO(EC_I2C_USB_C1_TCPC_SDA, PIN(F, 2), GPIO_INPUT) @@ -121,26 +128,36 @@ GPIO(USB_A_OC_SOC_L, PIN(8, 0), GPIO_OUT_HIGH) /* LED */ /* TODO(b/197471359): LED implementation */ +GPIO(LED_GREEN_L, PIN(C, 3), GPIO_OUT_LOW) GPIO(LED_RED_L, PIN(C, 4), GPIO_OUT_LOW) /* USBC */ -GPIO(USB_C0_FRS_EN, PIN(9, 7), GPIO_OUT_LOW) -GPIO(USB_C0_RT_RST_L, PIN(A, 7), GPIO_OUT_HIGH) +GPIO(USB_C0_C2_TCPC_RST_ODL, PIN(A, 7), GPIO_ODR_LOW) GPIO(USB_C1_FRS_EN, PIN(9, 4), GPIO_OUT_LOW) -GPIO(USB_C1_RT_RST_L, PIN(0, 2), GPIO_OUT_HIGH) +GPIO(USB_C1_RT_INT_ODL, PIN(A, 0), GPIO_INPUT) +GPIO(USB_C1_RT_RST_R_L, PIN(0, 2), GPIO_OUT_LOW) /* 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_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 */ /* UART alternate functions */ ALTERNATE(PIN_MASK(6, 0x30), 0, MODULE_UART, 0) /* GPIO64/CR_SIN1, GPO65/CR_SOUT1/FLPRG1_L */ /* I2C alternate functions */ -ALTERNATE(PIN_MASK(3, 0x48), 0, MODULE_I2C, 0) /* GPIO36/RTS_L/I2C5_SDA0, GPIO33/I2C5_SCL0/CTS_L */ +ALTERNATE(PIN_MASK(3, 0x48), 0, MODULE_I2C, 0) /* GPIO33/I2C5_SCL0/CTS_L, GPIO36/RTS_L/I2C5_SDA0 */ ALTERNATE(PIN_MASK(8, 0x80), 0, MODULE_I2C, 0) /* GPIO87/I2C1_SDA0 */ ALTERNATE(PIN_MASK(9, 0x07), 0, MODULE_I2C, 0) /* GPIO92/I2C2_SCL0, GPIO91/I2C2_SDA0, GPIO90/I2C1_SCL0 */ ALTERNATE(PIN_MASK(B, 0x0c), 0, MODULE_I2C, 0) /* GPIOB3/I2C7_SCL0/DCD_L, GPIOB2/I2C7_SDA0/DSR_L */ +ALTERNATE(PIN_MASK(B, 0x30), 0, MODULE_I2C, 0) /* GPIOB5/I2C0_SCL0, GPIOB4/I2C0_SDA0 */ ALTERNATE(PIN_MASK(D, 0x03), 0, MODULE_I2C, 0) /* GPIOD1/I2C3_SCL0, GPIOD0/I2C3_SDA0 */ ALTERNATE(PIN_MASK(E, 0x18), 0, MODULE_I2C, 0) /* GPIOE4/I2C6_SCL1/I3C_SCL, GPIOE3/I2C6_SDA1/I3C_SDA */ ALTERNATE(PIN_MASK(F, 0x0c), 0, MODULE_I2C, 0) /* GPIOF3/I2C4_SCL1, GPIOF2/I2C4_SDA1 */ @@ -161,14 +178,10 @@ UNUSED(PIN(3, 2)) /* GPO32/TRIS_L */ UNUSED(PIN(3, 5)) /* GPO35/CR_SOUT4/TEST_L */ UNUSED(PIN(6, 6)) /* GPIO66 */ UNUSED(PIN(8, 1)) /* GPIO81/PECI_DATA */ +UNUSED(PIN(5, 6)) /* GPIO56/CLKRUN# */ +UNUSED(PIN(9, 7)) /* GPIO97 */ UNUSED(PIN(8, 6)) /* GPIO86/TXD/CR_SOUT2 */ UNUSED(PIN(1, 3)) /* KSO06/GPO13/GP_SEL# */ UNUSED(PIN(1, 2)) /* KSO07/GPO12/JEN# */ UNUSED(PIN(0, 6)) /* KSO11/GPIO06/P80_CLK */ -UNUSED(PIN(B, 4)) /* GPIOB4/I2C0_SDA0 */ -UNUSED(PIN(2, 5)) /* KSI4/GPIO25/TRACECLK/GP_SCLK */ -UNUSED(PIN(B, 5)) /* GPIOB5/I2C0_SCL0 */ -UNUSED(PIN(8, 3)) /* KSO15/GPIO83 */ -UNUSED(PIN(B, 1)) /* KSO17/GPIOB1/CR_SIN4 */ -UNUSED(PIN(7, 0)) /* GPIO70/PS2_DAT0 */ -UNUSED(PIN(A, 3)) /* SPIP_MOSI/GPIOA3 */ +UNUSED(PIN(0, 4)) /* KSO13/GPIO04 */ diff --git a/board/gaelin/i2c.c b/board/gaelin/i2c.c index f9bfa11657..0a0b6b69a6 100644 --- a/board/gaelin/i2c.c +++ b/board/gaelin/i2c.c @@ -11,44 +11,60 @@ /* I2C port map configuration */ const struct i2c_port_t i2c_ports[] = { { + /* I2C0 */ + .name = "dp_redriver", + .port = I2C_PORT_DP_REDRIVER, + .kbps = 400, + .scl = GPIO_EC_I2C_DP_SCL, + .sda = GPIO_EC_I2C_DP_SDA, + }, + { /* I2C1 */ - .name = "tcpc0", - .port = I2C_PORT_USB_C0_TCPC, + .name = "tcpc0,2", + .port = I2C_PORT_USB_C0_C2_TCPC, .kbps = 1000, - .scl = GPIO_EC_I2C_USB_C0_TCPC_SCL, - .sda = GPIO_EC_I2C_USB_C0_TCPC_SDA, + .scl = GPIO_EC_I2C_USB_C0_C2_TCPC_SCL, + .sda = GPIO_EC_I2C_USB_C0_C2_TCPC_SDA, }, { /* I2C2 */ - .name = "ppc0", - .port = I2C_PORT_USB_C0_PPC, + .name = "ppc0,2", + .port = I2C_PORT_USB_C0_C2_PPC, .kbps = 1000, - .scl = GPIO_EC_I2C_USB_C0_PPC_BC_SCL, - .sda = GPIO_EC_I2C_USB_C0_PPC_BC_SDA, + .scl = GPIO_EC_I2C_USB_C0_C2_PPC_SCL, + .sda = GPIO_EC_I2C_USB_C0_C2_PPC_SDA, }, { /* I2C3 */ - .name = "ppc1", - .port = I2C_PORT_USB_C1_PPC, + .name = "retimer0,2", + .port = I2C_PORT_USB_C0_C2_MUX, .kbps = 1000, - .scl = GPIO_EC_I2C_USB_C1_PPC_BC_SCL, - .sda = GPIO_EC_I2C_USB_C1_PPC_BC_SDA, + .scl = GPIO_EC_I2C_USB_C0_C2_RT_SCL, + .sda = GPIO_EC_I2C_USB_C0_C2_RT_SDA, }, { - /* I2C4 */ + /* I2C4 C1 TCPC */ .name = "tcpc1", .port = I2C_PORT_USB_C1_TCPC, - .kbps = 1000, + .kbps = 400, .scl = GPIO_EC_I2C_USB_C1_TCPC_SCL, .sda = GPIO_EC_I2C_USB_C1_TCPC_SDA, }, { /* I2C5 */ - .name = "scaler", - .port = I2C_PORT_SCALER, + .name = "wireless_charger", + .port = I2C_PORT_QI, .kbps = 400, - .scl = GPIO_SMSCALER_CLK, - .sda = GPIO_SMSCALER_DATA, + .scl = GPIO_EC_I2C_QI_SCL, + .sda = GPIO_EC_I2C_QI_SDA, + }, + { + /* I2C6 */ + .name = "ppc1", + .port = I2C_PORT_USB_C1_PPC, + .kbps = 1000, + .scl = GPIO_EC_I2C_USB_C1_MIX_SCL, + .sda = GPIO_EC_I2C_USB_C1_MIX_SDA, }, { /* I2C7 */ diff --git a/board/gaelin/led.c b/board/gaelin/led.c index a4b9a0d094..842cee0530 100644 --- a/board/gaelin/led.c +++ b/board/gaelin/led.c @@ -249,8 +249,8 @@ int led_set_brightness(enum ec_led_id id, const uint8_t *brightness) else return set_color(id, LED_OFF, 0); } -__override void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) +void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma, + int charge_mv) { /* Blink alert if insufficient power per system_can_boot_ap(). */ int insufficient_power = diff --git a/board/gaelin/pwm.c b/board/gaelin/pwm.c index fe7e82894a..3d4335f453 100644 --- a/board/gaelin/pwm.c +++ b/board/gaelin/pwm.c @@ -16,8 +16,8 @@ const struct pwm_t pwm_channels[] = { PWM_CONFIG_DSLEEP, .freq = 2000 }, [PWM_CH_FAN] = { .channel = 5, - .flags = PWM_CONFIG_OPEN_DRAIN, - .freq = 25000 }, + .flags = PWM_CONFIG_OPEN_DRAIN | PWM_CONFIG_DSLEEP, + .freq = 1000 }, [PWM_CH_LED_RED] = { .channel = 2, .flags = PWM_CONFIG_ACTIVE_LOW | PWM_CONFIG_DSLEEP, .freq = 2000 }, diff --git a/board/gaelin/thermal.c b/board/gaelin/thermal.c deleted file mode 100644 index e15e0043e1..0000000000 --- a/board/gaelin/thermal.c +++ /dev/null @@ -1,140 +0,0 @@ -/* Copyright 2022 The ChromiumOS Authors - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#include "chipset.h" -#include "common.h" -#include "console.h" -#include "fan.h" -#include "hooks.h" -#include "host_command.h" -#include "temp_sensor.h" -#include "thermal.h" -#include "util.h" - -/* Console output macros */ -#define CPUTS(outstr) cputs(CC_THERMAL, outstr) -#define CPRINTS(format, args...) cprints(CC_THERMAL, format, ##args) - -struct fan_step { - /* - * Sensor 1~4 trigger point, set -1 if we're not using this - * sensor to determine fan speed. - */ - int8_t on[TEMP_SENSOR_COUNT]; - /* - * Sensor 1~4 trigger point, set -1 if we're not using this - * sensor to determine fan speed. - */ - int8_t off[TEMP_SENSOR_COUNT]; - /* Fan rpm */ - int16_t rpm[FAN_CH_COUNT]; -}; - -static const struct fan_step fan_table[] = { - { - /* level 0 */ - .on = { 65, -1, -1, -1 }, - .off = { 0, -1, -1, -1 }, - .rpm = { 2350 }, - }, - { - /* level 1 */ - .on = { 80, -1, -1, -1 }, - .off = { 60, -1, -1, -1 }, - .rpm = { 2350 }, - }, - { - /* level 2 */ - .on = { 87, -1, -1, -1 }, - .off = { 75, -1, -1, -1 }, - .rpm = { 3250 }, - }, - { - /* level 3 */ - .on = { 91, -1, -1, -1 }, - .off = { 82, -1, -1, -1 }, - .rpm = { 3750 }, - }, - { - /* level 4 */ - .on = { 100, -1, -1, -1 }, - .off = { 86, -1, -1, -1 }, - .rpm = { 4100 }, - }, -}; -const int num_fan_levels = ARRAY_SIZE(fan_table); - -int fan_table_to_rpm(int fan, int *temp, enum temp_sensor_id temp_sensor) -{ - /* current fan level */ - static int current_level; - /* previous fan level */ - static int prev_current_level; - /* previous sensor temperature */ - static int prev_temp[TEMP_SENSOR_COUNT]; - int i; - int new_rpm = 0; - - /* - * Compare the current and previous temperature, we have - * the three paths: - * 1. decreasing path. (check the release point) - * 2. increasing path. (check the trigger point) - * 3. invariant path. (return the current RPM) - */ - if (temp[temp_sensor] < prev_temp[temp_sensor]) { - for (i = current_level; i > 0; i--) { - if (temp[temp_sensor] < fan_table[i].off[temp_sensor]) - current_level = i - 1; - else - break; - } - } else if (temp[temp_sensor] > prev_temp[temp_sensor]) { - for (i = current_level; i < num_fan_levels; i++) { - if (temp[temp_sensor] > fan_table[i].on[temp_sensor]) - current_level = i + 1; - else - break; - } - } - - if (current_level < 0) - current_level = 0; - if (current_level >= num_fan_levels) - current_level = num_fan_levels - 1; - - if (current_level != prev_current_level) { - CPRINTS("temp: %d, prev_temp: %d", temp[temp_sensor], - prev_temp[temp_sensor]); - CPRINTS("current_level: %d", current_level); - } - - prev_temp[temp_sensor] = temp[temp_sensor]; - prev_current_level = current_level; - - switch (fan) { - case FAN_CH_0: - new_rpm = fan_table[current_level].rpm[FAN_CH_0]; - break; - default: - break; - } - - return new_rpm; -} - -void board_override_fan_control(int fan, int *temp) -{ - if (chipset_in_state(CHIPSET_STATE_ON)) { - fan_set_rpm_mode(FAN_CH(fan), 1); - fan_set_rpm_target(FAN_CH(fan), - fan_table_to_rpm(FAN_CH(fan), temp, - TEMP_SENSOR_1_CPU)); - } else if (chipset_in_state(CHIPSET_STATE_ANY_SUSPEND)) { - /* Stop fan when enter S0ix */ - fan_set_rpm_mode(FAN_CH(fan), 1); - fan_set_rpm_target(FAN_CH(fan), 0); - } -} diff --git a/board/gaelin/usbc_config.c b/board/gaelin/usbc_config.c index 98595fc607..806ff2c4ee 100644 --- a/board/gaelin/usbc_config.c +++ b/board/gaelin/usbc_config.c @@ -10,13 +10,17 @@ #include "compile_time_macros.h" #include "console.h" #include "driver/bc12/pi3usb9201_public.h" -#include "driver/ppc/nx20p348x.h" -#include "driver/tcpm/ps8xxx_public.h" +#include "driver/ppc/syv682x_public.h" +#include "driver/retimer/bb_retimer_public.h" +#include "driver/retimer/kb800x.h" +#include "driver/tcpm/nct38xx.h" +#include "driver/tcpm/rt1715.h" #include "driver/tcpm/tcpci.h" #include "ec_commands.h" #include "gpio.h" #include "gpio_signal.h" #include "hooks.h" +#include "ioexpander.h" #include "system.h" #include "task.h" #include "task_id.h" @@ -36,22 +40,29 @@ const struct tcpc_config_t tcpc_config[] = { [USBC_PORT_C0] = { .bus_type = EC_BUS_TYPE_I2C, .i2c_info = { - .port = I2C_PORT_USB_C0_TCPC, - .addr_flags = PS8XXX_I2C_ADDR1_FLAGS, + .port = I2C_PORT_USB_C0_C2_TCPC, + .addr_flags = NCT38XX_I2C_ADDR1_1_FLAGS, }, - .drv = &ps8xxx_tcpm_drv, + .drv = &nct38xx_tcpm_drv, .flags = TCPC_FLAGS_TCPCI_REV2_0 | - TCPC_FLAGS_TCPCI_REV2_0_NO_VSAFE0V, + TCPC_FLAGS_NO_DEBUG_ACC_CONTROL, }, [USBC_PORT_C1] = { .bus_type = EC_BUS_TYPE_I2C, .i2c_info = { .port = I2C_PORT_USB_C1_TCPC, - .addr_flags = PS8XXX_I2C_ADDR2_FLAGS, + .addr_flags = RT1715_I2C_ADDR_FLAGS, }, - .drv = &ps8xxx_tcpm_drv, - .flags = TCPC_FLAGS_TCPCI_REV2_0 | - TCPC_FLAGS_TCPCI_REV2_0_NO_VSAFE0V, + .drv = &rt1715_tcpm_drv, + }, + [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); @@ -60,16 +71,19 @@ BUILD_ASSERT(CONFIG_USB_PD_PORT_MAX_COUNT == USBC_PORT_COUNT); /* USBC PPC configuration */ struct ppc_config_t ppc_chips[] = { [USBC_PORT_C0] = { - /* Compatible with Silicon Mitus SM5360A */ - .i2c_port = I2C_PORT_USB_C0_PPC, - .i2c_addr_flags = NX20P3483_ADDR2_FLAGS, - .drv = &nx20p348x_drv, + .i2c_port = I2C_PORT_USB_C0_C2_PPC, + .i2c_addr_flags = SYV682X_ADDR0_FLAGS, + .drv = &syv682x_drv, }, [USBC_PORT_C1] = { - /* Compatible with Silicon Mitus SM5360A */ .i2c_port = I2C_PORT_USB_C1_PPC, - .i2c_addr_flags = NX20P3483_ADDR3_FLAGS, - .drv = &nx20p348x_drv, + .i2c_addr_flags = SYV682X_ADDR0_FLAGS, + .drv = &syv682x_drv, + }, + [USBC_PORT_C2] = { + .i2c_port = I2C_PORT_USB_C0_C2_PPC, + .i2c_addr_flags = SYV682X_ADDR2_FLAGS, + .drv = &syv682x_drv, }, }; BUILD_ASSERT(ARRAY_SIZE(ppc_chips) == USBC_PORT_COUNT); @@ -81,100 +95,200 @@ static const struct usb_mux_chain usbc0_tcss_usb_mux = { .mux = &(const struct usb_mux){ .usb_port = USBC_PORT_C0, - .driver = &tcpci_tcpm_usb_mux_driver, - .hpd_update = &ps8xxx_tcpc_update_hpd_status, + .driver = &virtual_usb_mux_driver, + .hpd_update = &virtual_hpd_update, }, }; static const struct usb_mux_chain usbc1_tcss_usb_mux = { .mux = &(const struct usb_mux){ .usb_port = USBC_PORT_C1, - .driver = &tcpci_tcpm_usb_mux_driver, - .hpd_update = &ps8xxx_tcpc_update_hpd_status, + .driver = &virtual_usb_mux_driver, + .hpd_update = &virtual_hpd_update, }, }; +static const struct usb_mux_chain usbc2_tcss_usb_mux = { + .mux = + &(const struct usb_mux){ + .usb_port = USBC_PORT_C2, + .driver = &virtual_usb_mux_driver, + .hpd_update = &virtual_hpd_update, + }, +}; + +struct kb800x_control_t kb800x_control[] = { + [USBC_PORT_C0] = { + }, + [USBC_PORT_C1] = { + .retimer_rst_gpio = GPIO_USB_C1_RT_RST_R_L, + .ss_lanes = { + [KB800X_A0] = KB800X_TX0, [KB800X_A1] = KB800X_RX0, + [KB800X_B0] = KB800X_RX1, [KB800X_B1] = KB800X_TX1, + [KB800X_C0] = KB800X_RX0, [KB800X_C1] = KB800X_TX0, + [KB800X_D0] = KB800X_TX1, [KB800X_D1] = KB800X_RX1, + } + }, + [USBC_PORT_C2] = { + }, +}; +BUILD_ASSERT(ARRAY_SIZE(kb800x_control) == USBC_PORT_COUNT); const struct usb_mux_chain usb_muxes[] = { [USBC_PORT_C0] = { .mux = &(const struct usb_mux) { .usb_port = USBC_PORT_C0, - .driver = &virtual_usb_mux_driver, - .hpd_update = &virtual_hpd_update, + .driver = &bb_usb_retimer, + .hpd_update = bb_retimer_hpd_update, + .i2c_port = I2C_PORT_USB_C0_C2_MUX, + .i2c_addr_flags = USBC_PORT_C0_BB_RETIMER_I2C_ADDR, }, .next = &usbc0_tcss_usb_mux, }, [USBC_PORT_C1] = { .mux = &(const struct usb_mux) { .usb_port = USBC_PORT_C1, - .driver = &virtual_usb_mux_driver, - .hpd_update = &virtual_hpd_update, + .driver = &kb800x_usb_mux_driver, + .i2c_port = I2C_PORT_USB_C1_MUX, + .i2c_addr_flags = KB800X_I2C_ADDR0_FLAGS, }, .next = &usbc1_tcss_usb_mux, }, + [USBC_PORT_C2] = { + .mux = &(const struct usb_mux) { + .usb_port = USBC_PORT_C2, + .driver = &bb_usb_retimer, + .hpd_update = bb_retimer_hpd_update, + .i2c_port = I2C_PORT_USB_C0_C2_MUX, + .i2c_addr_flags = USBC_PORT_C2_BB_RETIMER_I2C_ADDR, + }, + .next = &usbc2_tcss_usb_mux, + }, }; BUILD_ASSERT(ARRAY_SIZE(usb_muxes) == USBC_PORT_COUNT); /* BC1.2 charger detect configuration */ const struct pi3usb9201_config_t pi3usb9201_bc12_chips[] = { [USBC_PORT_C0] = { - .i2c_port = I2C_PORT_USB_C0_BC12, + .i2c_port = I2C_PORT_USB_C0_C2_BC12, .i2c_addr_flags = PI3USB9201_I2C_ADDR_3_FLAGS, }, [USBC_PORT_C1] = { .i2c_port = I2C_PORT_USB_C1_BC12, - .i2c_addr_flags = PI3USB9201_I2C_ADDR_2_FLAGS, + .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); -static void ps8815_reset(int port) +/* + * USB C0 and C2 uses burnside bridge chips and have their reset + * controlled by their respective TCPC chips acting as GPIO expanders. + * + * ioex_init() is normally called before we take the TCPCs out of + * reset, so we need to start in disabled mode, then explicitly + * call ioex_init(). + */ + +struct ioexpander_config_t ioex_config[] = { + [IOEX_C0_NCT38XX] = { + .i2c_host_port = I2C_PORT_USB_C0_C2_TCPC, + .i2c_addr_flags = NCT38XX_I2C_ADDR1_1_FLAGS, + .drv = &nct38xx_ioexpander_drv, + .flags = IOEX_FLAGS_DEFAULT_INIT_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_DEFAULT_INIT_DISABLED, + }, +}; +BUILD_ASSERT(ARRAY_SIZE(ioex_config) == CONFIG_IO_EXPANDER_PORT_COUNT); + +__override int bb_retimer_power_enable(const struct usb_mux *me, bool enable) { - int val; - int i2c_port; - uint16_t i2c_addr_flags; - enum gpio_signal ps8xxx_rst_odl; - - if (port == USBC_PORT_C0) { - ps8xxx_rst_odl = GPIO_USB_C0_RT_RST_L; - i2c_port = I2C_PORT_USB_C0_TCPC; - i2c_addr_flags = PS8XXX_I2C_ADDR1_FLAGS; - } else if (port == USBC_PORT_C1) { - ps8xxx_rst_odl = GPIO_USB_C1_RT_RST_L; - i2c_port = I2C_PORT_USB_C1_TCPC; - i2c_addr_flags = PS8XXX_I2C_ADDR2_FLAGS; + enum ioex_signal rst_signal; + + if (me->usb_port == USBC_PORT_C0) { + rst_signal = IOEX_USB_C0_RT_RST_ODL; + } else if (me->usb_port == USBC_PORT_C2) { + rst_signal = IOEX_USB_C2_RT_RST_ODL; } else { - return; + return EC_ERROR_INVAL; } - gpio_set_level(ps8xxx_rst_odl, 0); - msleep(GENERIC_MAX(PS8XXX_RESET_DELAY_MS, PS8815_PWR_H_RST_H_DELAY_MS)); - gpio_set_level(ps8xxx_rst_odl, 1); - msleep(PS8815_FW_INIT_DELAY_MS); - - CPRINTS("[C%d] %s: patching ps8815 registers", port, __func__); + /* + * We do not have a load switch for the burnside bridge chips, + * so we only need to sequence reset. + */ - if (i2c_read8(i2c_port, i2c_addr_flags, 0x0f, &val) == EC_SUCCESS) - CPRINTS("ps8815: reg 0x0f was %02x", val); - else { - CPRINTS("delay 10ms to make sure ps8815 is waken from idle"); - msleep(10); + if (enable) { + /* + * Tpw, minimum time from VCC to RESET_N de-assertion is 100us. + * For boards that don't provide a load switch control, the + * retimer_init() function ensures power is up before calling + * this function. + */ + ioex_set_level(rst_signal, 1); + /* + * Allow 1ms time for the retimer to power up lc_domain + * which powers I2C controller within retimer + */ + msleep(1); + } else { + ioex_set_level(rst_signal, 0); + msleep(1); } + return EC_SUCCESS; +} - if (i2c_write8(i2c_port, i2c_addr_flags, 0x0f, 0x31) == EC_SUCCESS) - CPRINTS("ps8815: reg 0x0f set to 0x31"); +__override int bb_retimer_reset(const struct usb_mux *me) +{ + /* + * TODO(b/193402306, b/195375738): Remove this once transition to + * QS Silicon is complete + */ + bb_retimer_power_enable(me, false); + msleep(5); + bb_retimer_power_enable(me, true); + msleep(25); - if (i2c_read8(i2c_port, i2c_addr_flags, 0x0f, &val) == EC_SUCCESS) - CPRINTS("ps8815: reg 0x0f now %02x", val); + return EC_SUCCESS; } void board_reset_pd_mcu(void) { - ps8815_reset(USBC_PORT_C0); - usb_mux_hpd_update(USBC_PORT_C0, USB_PD_MUX_HPD_LVL_DEASSERTED | - USB_PD_MUX_HPD_IRQ_DEASSERTED); - ps8815_reset(USBC_PORT_C1); - usb_mux_hpd_update(USBC_PORT_C1, USB_PD_MUX_HPD_LVL_DEASSERTED | - USB_PD_MUX_HPD_IRQ_DEASSERTED); + enum gpio_signal tcpc_rst; + + tcpc_rst = GPIO_USB_C0_C2_TCPC_RST_ODL; + + /* + * TODO(b/179648104): figure out correct timing + */ + + gpio_set_level(tcpc_rst, 0); + gpio_set_level(GPIO_USB_C1_RT_RST_R_L, 0); + + /* + * delay for power-on to reset-off and min. assertion time + */ + + msleep(20); + + gpio_set_level(tcpc_rst, 1); + gpio_set_level(GPIO_USB_C1_RT_RST_R_L, 1); + + /* wait for chips to come up */ + + msleep(50); +} + +static void enable_ioex(int ioex) +{ + ioex_init(ioex); } static void board_tcpc_init(void) @@ -182,19 +296,25 @@ static void board_tcpc_init(void) /* Don't reset TCPCs after initial reset */ if (!system_jumped_late()) { board_reset_pd_mcu(); + + /* + * These IO expander pins are implemented using the + * C0/C2 TCPC, so they must be set up after the TCPC has + * been taken out of reset. + */ + enable_ioex(IOEX_C0_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_TCPC_INT_ODL); - gpio_enable_interrupt(GPIO_USB_C1_TCPC_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C0_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_C1_PPC_INT_ODL); + gpio_enable_interrupt(GPIO_USB_C1_TCPC_INT_ODL); } DECLARE_HOOK(HOOK_INIT, board_tcpc_init, HOOK_PRIO_INIT_CHIPSET); @@ -202,8 +322,8 @@ uint16_t tcpc_get_alert_status(void) { uint16_t status = 0; - if (gpio_get_level(GPIO_USB_C0_TCPC_INT_ODL) == 0) - status |= PD_STATUS_TCPC_ALERT_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_C1_TCPC_INT_ODL) == 0) status |= PD_STATUS_TCPC_ALERT_1; @@ -217,13 +337,15 @@ int ppc_get_alert_status(int port) return gpio_get_level(GPIO_USB_C0_PPC_INT_ODL) == 0; else if (port == USBC_PORT_C1) return gpio_get_level(GPIO_USB_C1_PPC_INT_ODL) == 0; + else if (port == USBC_PORT_C2) + return gpio_get_level(GPIO_USB_C2_PPC_INT_ODL) == 0; return 0; } void tcpc_alert_event(enum gpio_signal signal) { switch (signal) { - case GPIO_USB_C0_TCPC_INT_ODL: + case GPIO_USB_C0_C2_TCPC_INT_ODL: schedule_deferred_pd_interrupt(USBC_PORT_C0); break; case GPIO_USB_C1_TCPC_INT_ODL: @@ -243,6 +365,9 @@ void bc12_interrupt(enum gpio_signal signal) case GPIO_USB_C1_BC12_INT_ODL: usb_charger_task_set_event(1, USB_CHG_EVENT_BC12); break; + case GPIO_USB_C2_BC12_INT_ODL: + usb_charger_task_set_event(2, USB_CHG_EVENT_BC12); + break; default: break; } @@ -252,10 +377,13 @@ void ppc_interrupt(enum gpio_signal signal) { switch (signal) { case GPIO_USB_C0_PPC_INT_ODL: - nx20p348x_interrupt(USBC_PORT_C0); + syv682x_interrupt(USBC_PORT_C0); break; case GPIO_USB_C1_PPC_INT_ODL: - nx20p348x_interrupt(USBC_PORT_C1); + syv682x_interrupt(USBC_PORT_C1); + break; + case GPIO_USB_C2_PPC_INT_ODL: + syv682x_interrupt(USBC_PORT_C2); break; default: break; @@ -273,3 +401,16 @@ __override bool board_is_dts_port(int port) { return port == USBC_PORT_C0; } + +__override bool board_is_tbt_usb4_port(int port) +{ + return true; +} + +__override enum tbt_compat_cable_speed board_get_max_tbt_speed(int port) +{ + if (!board_is_tbt_usb4_port(port)) + return TBT_SS_RES_0; + + return TBT_SS_TBT_GEN3; +} diff --git a/board/gaelin/usbc_config.h b/board/gaelin/usbc_config.h index 219ad9a745..5e7beae21a 100644 --- a/board/gaelin/usbc_config.h +++ b/board/gaelin/usbc_config.h @@ -8,8 +8,13 @@ #ifndef __CROS_EC_USBC_CONFIG_H #define __CROS_EC_USBC_CONFIG_H -#define CONFIG_USB_PD_PORT_MAX_COUNT 2 +#define CONFIG_USB_PD_PORT_MAX_COUNT 3 -enum usbc_port { USBC_PORT_C0 = 0, USBC_PORT_C1, USBC_PORT_COUNT }; +enum usbc_port { + USBC_PORT_C0 = 0, + USBC_PORT_C1, + USBC_PORT_C2, + USBC_PORT_COUNT +}; #endif /* __CROS_EC_USBC_CONFIG_H */ |