summaryrefslogtreecommitdiff
path: root/board/gaelin
diff options
context:
space:
mode:
authorYH Lin <yueherngl@chromium.org>2022-12-03 00:19:30 +0000
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-12-05 17:43:05 +0000
commitc8af732351cc5c7167f27e8390e26f0556f53a5a (patch)
treebdff671e5ad3e71e30ab56f4f084f34a2fd72e28 /board/gaelin
parentaf25602b15b22b9ef5821dcba9934311f2157c48 (diff)
downloadchrome-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.c50
-rw-r--r--board/gaelin/board.h61
-rw-r--r--board/gaelin/build.mk1
-rw-r--r--board/gaelin/ec.tasklist5
-rw-r--r--board/gaelin/fans.c12
-rw-r--r--board/gaelin/gpio.inc91
-rw-r--r--board/gaelin/i2c.c52
-rw-r--r--board/gaelin/led.c4
-rw-r--r--board/gaelin/pwm.c4
-rw-r--r--board/gaelin/thermal.c140
-rw-r--r--board/gaelin/usbc_config.c289
-rw-r--r--board/gaelin/usbc_config.h9
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 */