summaryrefslogtreecommitdiff
path: root/board/beadrix
diff options
context:
space:
mode:
authorTeddy Shih <teddyshih@ami.corp-partner.google.com>2022-01-13 20:32:21 +0800
committerCommit Bot <commit-bot@chromium.org>2022-01-20 17:25:00 +0000
commitc12f2212e2580bde4626711045db9d1dfd65f66d (patch)
treeb1b14fa426187d55338b61fd1404512de9891a60 /board/beadrix
parent002023fc03ec2e202d726fd1d81a37ee495add46 (diff)
downloadchrome-ec-c12f2212e2580bde4626711045db9d1dfd65f66d.tar.gz
Beadrix: Initial TCPC configuration
For project Beadrix, 1. Initial motherboard Type-C configurations. a. (TCPC + Changer) config to RAA489000ARGNP#HA0. b. MUX config to IT5205FN/BX c. No redriver on 2 .Initial daughterboard Type-C configurations. a. (TCPC + Changer) config to RAA489000ARGNP#HA0. b. MUX only config to ANX3447QN-AC-R (use anx7447 driver instead). c. Redriver config to NB7VPQ904M. BUG=b:204882915 BRANCH=main TEST=make -j BOARD=beadrix 1. Plug battery on motherboard side and check motherboard of PD USB Type C0 Display Port (DP) and external USB disk (USB C0 Data) have proper functionalities. 2 .Plug-AC and battery on motherboard side and check daughterboard of PD USB Type C1 Display Port (DP) and external USB disk (USB C1 Data) have proper functionalities. Signed-off-by: Teddy Shih <teddyshih@ami.corp-partner.google.com> Change-Id: I5bae7aacd2bf86707a060b73ba6cb90d6a25ef18 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3386494 Reviewed-by: Diana Z <dzigterman@chromium.org> Commit-Queue: Diana Z <dzigterman@chromium.org>
Diffstat (limited to 'board/beadrix')
-rw-r--r--board/beadrix/board.c297
-rw-r--r--board/beadrix/board.h49
-rw-r--r--board/beadrix/ec.tasklist7
-rw-r--r--board/beadrix/gpio.inc17
-rw-r--r--board/beadrix/usb_pd_policy.c59
5 files changed, 230 insertions, 199 deletions
diff --git a/board/beadrix/board.c b/board/beadrix/board.c
index 4312141fe7..e72238e14b 100644
--- a/board/beadrix/board.c
+++ b/board/beadrix/board.c
@@ -13,12 +13,15 @@
#include "driver/accel_kionix.h"
#include "driver/accelgyro_lsm6dsm.h"
#include "driver/bc12/pi3usb9201.h"
-#include "driver/charger/sm5803.h"
-#include "driver/retimer/tusb544.h"
+#include "driver/charger/isl923x.h"
+#include "driver/retimer/nb7v904m.h"
#include "driver/temp_sensor/thermistor.h"
#include "driver/tcpm/anx7447.h"
-#include "driver/tcpm/it83xx_pd.h"
+#include "driver/tcpm/raa489000.h"
+#include "driver/tcpm/tcpci.h"
+#include "driver/usb_mux/pi3usb3x532.h"
#include "driver/usb_mux/it5205.h"
+#include "extpower.h"
#include "gpio.h"
#include "hooks.h"
#include "intc.h"
@@ -32,7 +35,6 @@
#include "system.h"
#include "tablet_mode.h"
#include "task.h"
-#include "tcpm/tcpci.h"
#include "temp_sensor.h"
#include "uart.h"
#include "usb_charge.h"
@@ -40,21 +42,23 @@
#include "usb_pd.h"
#include "usb_pd_tcpm.h"
+#define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ## args)
#define CPRINTUSB(format, args...) cprints(CC_USBCHARGE, format, ## args)
#define INT_RECHECK_US 5000
-/* C1 interrupt line swapped between board versions, track it in a variable */
-static enum gpio_signal c1_int_line;
-
/* C0 interrupt line shared by BC 1.2 and charger */
static void check_c0_line(void);
DECLARE_DEFERRED(check_c0_line);
static void notify_c0_chips(void)
{
+ /*
+ * The interrupt line is shared between the TCPC and BC 1.2 detection
+ * chip. Therefore we'll need to check both ICs.
+ */
+ schedule_deferred_pd_interrupt(0);
task_set_event(TASK_ID_USB_CHG_P0, USB_CHG_EVENT_BC12);
- sm5803_interrupt(0);
}
static void check_c0_line(void)
@@ -89,7 +93,6 @@ static void notify_c1_chips(void)
{
schedule_deferred_pd_interrupt(1);
task_set_event(TASK_ID_USB_CHG_P1, USB_CHG_EVENT_BC12);
- sm5803_interrupt(1);
}
static void check_c1_line(void)
@@ -98,7 +101,7 @@ static void check_c1_line(void)
* If line is still being held low, see if there's more to process from
* one of the chips.
*/
- if (!gpio_get_level(c1_int_line)) {
+ if (!gpio_get_level(GPIO_USB_C1_INT_V1_ODL)) {
notify_c1_chips();
hook_call_deferred(&check_c1_line_data, INT_RECHECK_US);
}
@@ -174,32 +177,37 @@ const struct pi3usb9201_config_t pi3usb9201_bc12_chips[] = {
/* Charger chips */
const struct charger_config_t chg_chips[] = {
- [CHARGER_PRIMARY] = {
+ {
.i2c_port = I2C_PORT_USB_C0,
- .i2c_addr_flags = SM5803_ADDR_CHARGER_FLAGS,
- .drv = &sm5803_drv,
+ .i2c_addr_flags = ISL923X_ADDR_FLAGS,
+ .drv = &isl923x_drv,
},
- [CHARGER_SECONDARY] = {
+ {
.i2c_port = I2C_PORT_SUB_USB_C1,
- .i2c_addr_flags = SM5803_ADDR_CHARGER_FLAGS,
- .drv = &sm5803_drv,
+ .i2c_addr_flags = ISL923X_ADDR_FLAGS,
+ .drv = &isl923x_drv,
},
};
/* TCPCs */
const struct tcpc_config_t tcpc_config[CONFIG_USB_PD_PORT_MAX_COUNT] = {
{
- .bus_type = EC_BUS_TYPE_EMBEDDED,
- .drv = &it83xx_tcpm_drv,
+ .bus_type = EC_BUS_TYPE_I2C,
+ .i2c_info = {
+ .port = I2C_PORT_USB_C0,
+ .addr_flags = RAA489000_TCPC0_I2C_FLAGS,
+ },
+ .flags = TCPC_FLAGS_TCPCI_REV2_0,
+ .drv = &raa489000_tcpm_drv,
},
- {
+ { /* Used as TCPC + Charger */
.bus_type = EC_BUS_TYPE_I2C,
.i2c_info = {
.port = I2C_PORT_SUB_USB_C1,
- .addr_flags = AN7447_TCPC0_I2C_ADDR_FLAGS,
+ .addr_flags = RAA489000_TCPC0_I2C_FLAGS,
},
- .drv = &anx7447_tcpm_drv,
.flags = TCPC_FLAGS_TCPCI_REV2_0,
+ .drv = &raa489000_tcpm_drv,
},
};
@@ -207,22 +215,23 @@ const struct tcpc_config_t tcpc_config[CONFIG_USB_PD_PORT_MAX_COUNT] = {
const struct usb_mux usbc1_retimer = {
.usb_port = 1,
.i2c_port = I2C_PORT_SUB_USB_C1,
- .i2c_addr_flags = TUSB544_I2C_ADDR_FLAGS0,
- .driver = &tusb544_drv,
+ .i2c_addr_flags = NB7V904M_I2C_ADDR0,
+ .driver = &nb7v904m_usb_redriver_drv,
};
/* USB Muxes */
-const struct usb_mux usb_muxes[CONFIG_USB_PD_PORT_MAX_COUNT] = {
+struct usb_mux usb_muxes[CONFIG_USB_PD_PORT_MAX_COUNT] = {
{
.usb_port = 0,
.i2c_port = I2C_PORT_USB_C0,
.i2c_addr_flags = IT5205_I2C_ADDR1_FLAGS,
.driver = &it5205_usb_mux_driver,
},
- {
+ { /* Used as MUX only*/
.usb_port = 1,
.i2c_port = I2C_PORT_SUB_USB_C1,
.i2c_addr_flags = AN7447_TCPC0_I2C_ADDR_FLAGS,
+ .flags = USB_MUX_FLAG_NOT_TCPC,
.driver = &anx7447_usb_mux_driver,
.next_mux = &usbc1_retimer,
},
@@ -232,16 +241,11 @@ void board_init(void)
{
int on;
- if (system_get_board_version() <= 0) {
- pd_set_max_voltage(5000);
- c1_int_line = GPIO_USB_C1_INT_V0_ODL;
- } else {
- c1_int_line = GPIO_USB_C1_INT_V1_ODL;
- }
-
-
+ /* Enable C0 interrupt and check if it needs processing */
gpio_enable_interrupt(GPIO_USB_C0_INT_ODL);
- gpio_enable_interrupt(c1_int_line);
+
+ /* Enable C1 interrupt and check if it needs processing */
+ gpio_enable_interrupt(GPIO_USB_C1_INT_V1_ODL);
/*
* If interrupt lines are already low, schedule them to be processed
@@ -254,51 +258,22 @@ void board_init(void)
/* Enable Base Accel interrupt */
gpio_enable_interrupt(GPIO_BASE_SIXAXIS_INT_L);
- /* Charger on the MB will be outputting PROCHOT_ODL and OD CHG_DET */
- sm5803_configure_gpio0(CHARGER_PRIMARY, GPIO0_MODE_PROCHOT, 1);
- sm5803_configure_chg_det_od(CHARGER_PRIMARY, 1);
-
- /* Charger on the sub-board will be a push-pull GPIO */
- sm5803_configure_gpio0(CHARGER_SECONDARY, GPIO0_MODE_OUTPUT, 0);
-
- /* Turn on 5V if the system is on, otherwise turn it off */
+ /* Turn on 5V if the system is on, otherwise turn it off. */
on = chipset_in_state(CHIPSET_STATE_ON | CHIPSET_STATE_ANY_SUSPEND |
CHIPSET_STATE_SOFT_OFF);
board_power_5v_enable(on);
}
DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT);
-static void board_resume(void)
-{
- sm5803_disable_low_power_mode(CHARGER_PRIMARY);
- if (board_get_charger_chip_count() > 1)
- sm5803_disable_low_power_mode(CHARGER_SECONDARY);
-}
-DECLARE_HOOK(HOOK_CHIPSET_RESUME, board_resume, HOOK_PRIO_DEFAULT);
-
-static void board_suspend(void)
-{
- sm5803_enable_low_power_mode(CHARGER_PRIMARY);
- if (board_get_charger_chip_count() > 1)
- sm5803_enable_low_power_mode(CHARGER_SECONDARY);
-}
-DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, board_suspend, HOOK_PRIO_DEFAULT);
-
void board_hibernate(void)
{
/*
- * Put all charger ICs present into low power mode before entering
- * z-state.
+ * Both charger ICs need to be put into their "low power mode" before
+ * entering the Z-state.
*/
- sm5803_hibernate(CHARGER_PRIMARY);
if (board_get_charger_chip_count() > 1)
- sm5803_hibernate(CHARGER_SECONDARY);
-}
-
-__override void board_ocpc_init(struct ocpc_data *ocpc)
-{
- /* There's no provision to measure Isys */
- ocpc->chg_flags[CHARGER_SECONDARY] |= OCPC_NO_ISYS_MEAS_CAP;
+ raa489000_hibernate(1, true);
+ raa489000_hibernate(0, true);
}
void board_reset_pd_mcu(void)
@@ -317,116 +292,162 @@ __override void board_power_5v_enable(int enable)
*/
gpio_set_level(GPIO_EN_PP5000, !!enable);
gpio_set_level(GPIO_EN_USB_A0_VBUS, !!enable);
- if (sm5803_set_gpio0_level(1, !!enable))
- CPRINTUSB("Failed to %sable sub rails!", enable ? "en" : "dis");
-}
-
-uint16_t tcpc_get_alert_status(void)
-{
- /*
- * TCPC 0 is embedded in the EC and processes interrupts in the chip
- * code (it83xx/intc.c)
- */
-
- uint16_t status = 0;
- int regval;
-
- /* Check whether TCPC 1 pulled the shared interrupt line */
- if (!gpio_get_level(c1_int_line)) {
- if (!tcpc_read16(1, TCPC_REG_ALERT, &regval)) {
- if (regval)
- status = PD_STATUS_TCPC_ALERT_1;
- }
- }
- return status;
+ if (isl923x_set_comparator_inversion(1, !!enable))
+ CPRINTS("Failed to %sable sub rails!", enable ? "en" : "dis");
}
-void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma,
- int charge_mv)
+int board_is_sourcing_vbus(int port)
{
- int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT);
+ int regval;
- /*
- * TODO(b/151955431): Characterize the input current limit in case a
- * scaling needs to be applied here
- */
- charge_set_input_current_limit(icl, charge_mv);
+ tcpc_read(port, TCPC_REG_POWER_STATUS, &regval);
+ return !!(regval & TCPC_REG_POWER_STATUS_SOURCING_VBUS);
}
int board_set_active_charge_port(int port)
{
- int is_valid_port = (port >= 0 && port < board_get_usb_pd_port_count());
+ int is_real_port = (port >= 0 &&
+ port < board_get_usb_pd_port_count());
+ int i;
+ int old_port;
- if (!is_valid_port && port != CHARGE_PORT_NONE)
+ if (!is_real_port && port != CHARGE_PORT_NONE)
return EC_ERROR_INVAL;
- if (port == CHARGE_PORT_NONE) {
- CPRINTUSB("Disabling all charge ports");
+ old_port = charge_manager_get_active_charge_port();
- sm5803_vbus_sink_enable(CHARGER_PRIMARY, 0);
+ CPRINTS("Old chg p%d", old_port);
- if (board_get_charger_chip_count() > 1)
- sm5803_vbus_sink_enable(CHARGER_SECONDARY, 0);
+ /* Disable all ports. */
+ if (port == CHARGE_PORT_NONE) {
+ CPRINTS("Disabling all charge ports");
+
+ for (i = 0; i < board_get_usb_pd_port_count(); i++) {
+ tcpc_write(i, TCPC_REG_COMMAND,
+ TCPC_REG_COMMAND_SNK_CTRL_LOW);
+ raa489000_enable_asgate(i, false);
+ }
return EC_SUCCESS;
}
- CPRINTUSB("New chg p%d", port);
+ CPRINTS("New chg p%d", port);
+
+ /* Check if port is sourcing VBUS. */
+ if (board_is_sourcing_vbus(port)) {
+ CPRINTS("Skip enable p%d", port);
+ return EC_ERROR_INVAL;
+ }
/*
- * Ensure other port is turned off, then enable new charge port
+ * Turn off the other ports' sink path FETs, before enabling the
+ * requested charge port.
*/
- if (port == 0) {
- if (board_get_charger_chip_count() > 1)
- sm5803_vbus_sink_enable(CHARGER_SECONDARY, 0);
- sm5803_vbus_sink_enable(CHARGER_PRIMARY, 1);
+ for (i = 0; i < board_get_usb_pd_port_count(); i++) {
+ if (i == port)
+ continue;
+
+ if (tcpc_write(i, TCPC_REG_COMMAND,
+ TCPC_REG_COMMAND_SNK_CTRL_LOW))
+ CPRINTS("p%d: sink path disable failed.", i);
+ raa489000_enable_asgate(i, false);
+ }
- } else {
- sm5803_vbus_sink_enable(CHARGER_PRIMARY, 0);
- sm5803_vbus_sink_enable(CHARGER_SECONDARY, 1);
+ /*
+ * Stop the charger IC from switching while changing ports. Otherwise,
+ * we can overcurrent the adapter we're switching to. (crbug.com/926056)
+ */
+ if (old_port != CHARGE_PORT_NONE)
+ charger_discharge_on_ac(1);
+
+ /* Enable requested charge port. */
+ if (raa489000_enable_asgate(port, true) ||
+ tcpc_write(port, TCPC_REG_COMMAND,
+ TCPC_REG_COMMAND_SNK_CTRL_HIGH)) {
+ CPRINTS("p%d: sink path enable failed.", port);
+ charger_discharge_on_ac(0);
+ return EC_ERROR_UNKNOWN;
}
+ /* Allow the charger IC to begin/continue switching. */
+ charger_discharge_on_ac(0);
+
return EC_SUCCESS;
}
/* Vconn control for integrated ITE TCPC */
-void board_pd_vconn_ctrl(int port, enum usbpd_cc_pin cc_pin, int enabled)
+void board_set_charge_limit(int port, int supplier, int charge_ma,
+ int max_ma, int charge_mv)
{
- /* Vconn control is only for port 0 */
- if (port)
- return;
+ int icl = MAX(charge_ma, CONFIG_CHARGER_INPUT_CURRENT);
- if (cc_pin == USBPD_CC_PIN_1)
- gpio_set_level(GPIO_EN_USB_C0_CC1_VCONN, !!enabled);
- else
- gpio_set_level(GPIO_EN_USB_C0_CC2_VCONN, !!enabled);
+ /*
+ * TODO(b/151955431): Characterize the input current limit in case a
+ * scaling needs to be applied here
+ */
+ charge_set_input_current_limit(icl, charge_mv);
}
-__override void ocpc_get_pid_constants(int *kp, int *kp_div,
- int *ki, int *ki_div,
- int *kd, int *kd_div)
+__override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp)
{
- *kp = 3;
- *kp_div = 14;
-
- *ki = 3;
- *ki_div = 500;
+ if (port < 0 || port > CONFIG_USB_PD_PORT_MAX_COUNT)
+ return;
- *kd = 4;
- *kd_div = 40;
+ raa489000_set_output_current(port, rp);
}
-__override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp)
+uint16_t tcpc_get_alert_status(void)
{
- int current;
+ uint16_t status = 0;
+ int regval;
- if (port < 0 || port > CONFIG_USB_PD_PORT_MAX_COUNT)
- return;
+ /*
+ * The interrupt line is shared between the TCPC and BC1.2 detector IC.
+ * Therefore, go out and actually read the alert registers to report the
+ * alert status.
+ */
+ if (!gpio_get_level(GPIO_USB_C0_INT_ODL)) {
+ if (!tcpc_read16(0, TCPC_REG_ALERT, &regval)) {
+ /* The TCPCI Rev 1.0 spec says to ignore bits 14:12. */
+ if (!(tcpc_config[0].flags & TCPC_FLAGS_TCPCI_REV2_0))
+ regval &= ~((1 << 14) | (1 << 13) | (1 << 12));
+
+ if (regval)
+ status |= PD_STATUS_TCPC_ALERT_0;
+ }
+ }
+
+ if (board_get_usb_pd_port_count() > 1 &&
+ !gpio_get_level(GPIO_USB_C1_INT_V1_ODL)) {
+ if (!tcpc_read16(1, TCPC_REG_ALERT, &regval)) {
+ /* TCPCI spec Rev 1.0 says to ignore bits 14:12. */
+ if (!(tcpc_config[1].flags & TCPC_FLAGS_TCPCI_REV2_0))
+ regval &= ~((1 << 14) | (1 << 13) | (1 << 12));
- current = (rp == TYPEC_RP_3A0) ? 3000 : 1500;
+ if (regval)
+ status |= PD_STATUS_TCPC_ALERT_1;
+ }
+ }
- charger_set_otg_current_voltage(port, current, 5000);
+ return status;
+}
+
+__override void ocpc_get_pid_constants(int *kp, int *kp_div,
+ int *ki, int *ki_div,
+ int *kd, int *kd_div)
+{
+ *kp = 1;
+ *kp_div = 20;
+ *ki = 1;
+ *ki_div = 250;
+ *kd = 0;
+ *kd_div = 1;
+}
+
+int pd_snk_is_vbus_provided(int port)
+{
+ return pd_check_vbus_level(port, VBUS_PRESENT);
}
/* PWM channels. Must be in the exactly same order as in enum pwm_channel. */
diff --git a/board/beadrix/board.h b/board/beadrix/board.h
index e9787c9373..432f7c2b37 100644
--- a/board/beadrix/board.h
+++ b/board/beadrix/board.h
@@ -15,6 +15,7 @@
/* System unlocked in early development */
#define CONFIG_SYSTEM_UNLOCKED
+/* EC console commands */
#define CONFIG_CMD_CHARGER_DUMP
/* Battery */
@@ -24,13 +25,13 @@
#define CONFIG_BC12_DETECT_PI3USB9201
/* Charger */
-#define CONFIG_CHARGER_SM5803 /* C0 and C1: Charger */
-#define CONFIG_USB_PD_VBUS_DETECT_CHARGER
-#define CONFIG_USB_PD_5V_CHARGER_CTRL
-#define CONFIG_CHARGER_OTG
+#define CONFIG_CHARGER_RAA489000
+#define CONFIG_CHARGER_SENSE_RESISTOR_AC 10
+#define CONFIG_CHARGER_SENSE_RESISTOR 10
+#define CONFIG_CHARGE_RAMP_HW
#undef CONFIG_CHARGER_SINGLE_CHIP
#define CONFIG_OCPC
-#define CONFIG_OCPC_DEF_RBATT_MOHMS 21 /* R_DS(on) 10.7mOhm + 10mOhm sns rstr */
+#define CONFIG_OCPC_DEF_RBATT_MOHMS 22 /* R_DS(on) 11.6mOhm + 10mOhm sns rstr */
/*
* GPIO for C1 interrupts, for baseboard use
@@ -65,21 +66,45 @@
#define CONFIG_GMR_TABLET_MODE
/* TCPC */
-#define CONFIG_USB_PD_PORT_MAX_COUNT 2
-#define CONFIG_USB_PD_TCPM_ITE_ON_CHIP /* C0: ITE EC TCPC */
-#define CONFIG_USB_PD_TCPM_ANX7447 /* C1: ANX TCPC + Mux */
-#define CONFIG_USB_PD_ITE_ACTIVE_PORT_COUNT 1
+#define CONFIG_USB_PD_TCPM_ANX7447 /* C1: MUX only*/
+#define CONFIG_USB_PD_TCPM_MUX
+#define CONFIG_USB_PD_TCPM_ANX7447_AUX_PU_PD
/* Thermistors */
#define CONFIG_TEMP_SENSOR
#define CONFIG_THERMISTOR
#define CONFIG_STEINHART_HART_3V3_51K1_47K_4050B
+/* USB */
+#define CONFIG_BC12_DETECT_PI3USB9201
+#define CONFIG_USB_MUX_RUNTIME_CONFIG
+#define CONFIG_USB_MUX_IT5205 /* C0: ITE MUX */
+
+/* USB PD */
+#define CONFIG_USB_PD_PORT_MAX_COUNT 2
+#define CONFIG_USB_PD_TCPM_RAA489000 /* C1: TCPC + Charger */
+#undef CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE
+#define CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE (100 * MSEC)
+
/* USB Mux and Retimer */
+#define CONFIG_USB_MUX_RUNTIME_CONFIG
#define CONFIG_USB_MUX_IT5205 /* C1: ITE Mux */
-#define I2C_PORT_USB_MUX I2C_PORT_USB_C0 /* Required for ITE Mux */
-
-#define CONFIG_USBC_RETIMER_TUSB544 /* C1 Redriver: TUSB544 */
+#define CONFIG_USBC_RETIMER_NB7V904M
+
+/* USB defines specific to external TCPCs */
+#define CONFIG_USB_PD_DUAL_ROLE_AUTO_TOGGLE
+#define CONFIG_USB_PD_VBUS_DETECT_TCPC
+#define CONFIG_USB_PD_DISCHARGE_TCPC
+#define CONFIG_USB_PD_TCPC_LOW_POWER
+
+/* Variant references the TCPCs to determine Vbus sourcing */
+#define CONFIG_USB_PD_5V_EN_CUSTOM
+
+#undef PD_POWER_SUPPLY_TURN_ON_DELAY
+#undef PD_POWER_SUPPLY_TURN_OFF_DELAY
+/* 20% margin added for these timings */
+#define PD_POWER_SUPPLY_TURN_ON_DELAY 13080 /* us */
+#define PD_POWER_SUPPLY_TURN_OFF_DELAY 16080 /* us */
#ifndef __ASSEMBLER__
diff --git a/board/beadrix/ec.tasklist b/board/beadrix/ec.tasklist
index 5c9a2d1a01..e201fb0b1c 100644
--- a/board/beadrix/ec.tasklist
+++ b/board/beadrix/ec.tasklist
@@ -19,6 +19,7 @@
TASK_ALWAYS(CONSOLE, console_task, NULL, VENTI_TASK_STACK_SIZE) \
TASK_ALWAYS(POWERBTN, power_button_task, NULL, ULTRA_TASK_STACK_SIZE) \
TASK_NOTEST(KEYSCAN, keyboard_scan_task, NULL, ULTRA_TASK_STACK_SIZE) \
- TASK_ALWAYS(PD_C0, pd_task, NULL, ULTRA_TASK_STACK_SIZE) \
- TASK_ALWAYS(PD_C1, pd_task, NULL, ULTRA_TASK_STACK_SIZE) \
- TASK_ALWAYS(PD_INT_C1, pd_interrupt_handler_task, 1, ULTRA_TASK_STACK_SIZE)
+ TASK_ALWAYS(PD_C0, pd_task, NULL, ULTRA_TASK_STACK_SIZE) \
+ TASK_ALWAYS(PD_C1, pd_task, NULL, TRENTA_TASK_STACK_SIZE) \
+ TASK_ALWAYS(PD_INT_C0, pd_interrupt_handler_task, 0, ULTRA_TASK_STACK_SIZE) \
+ TASK_ALWAYS(PD_INT_C1, pd_interrupt_handler_task, 1, TRENTA_TASK_STACK_SIZE)
diff --git a/board/beadrix/gpio.inc b/board/beadrix/gpio.inc
index 7b14151e12..fdd0a3d16c 100644
--- a/board/beadrix/gpio.inc
+++ b/board/beadrix/gpio.inc
@@ -14,23 +14,22 @@ GPIO_INT(SLP_S3_L, PIN(H, 3), GPIO_INT_BOTH, baseboard_all_sys_pgood_interrupt)
GPIO_INT(SLP_S0_L, PIN(E, 4), GPIO_INT_BOTH, power_signal_interrupt)
GPIO_INT(SLP_SUS_L, PIN(G, 2), GPIO_INT_BOTH, power_signal_interrupt)
GPIO_INT(VCCIN_AUX_VID0, PIN(D, 0), GPIO_INT_BOTH, power_signal_interrupt)
-GPIO_INT(RSMRST_PWRGD_L, PIN(E, 1), GPIO_INT_BOTH, power_signal_interrupt)
+GPIO_INT(RSMRST_PWRGD_L, PIN(E, 1), GPIO_INT_BOTH | GPIO_PULL_UP, power_signal_interrupt)
GPIO_INT(CPU_C10_GATE_L, PIN(G, 1), GPIO_INT_BOTH, power_signal_interrupt)
GPIO_INT(PG_DRAM_OD, PIN(D, 3), GPIO_INT_BOTH, baseboard_all_sys_pgood_interrupt)
GPIO_INT(PG_PP1050_ST_OD, PIN(L, 1), GPIO_INT_BOTH, power_signal_interrupt)
GPIO_INT(VCCIN_AUX_VID1, PIN(K, 1), GPIO_INT_BOTH, power_signal_interrupt)
GPIO_INT(PG_VCCIO_EXT_OD, PIN(D, 7), GPIO_INT_BOTH, baseboard_all_sys_pgood_interrupt)
-GPIO_INT(ESPI_RESET_L, PIN(D, 2), GPIO_INT_FALLING | GPIO_SEL_1P8V, espi_reset_pin_asserted_interrupt)
+GPIO_INT(ESPI_RESET_L, PIN(D, 2), GPIO_INT_FALLING | GPIO_SEL_1P8V, espi_reset_pin_asserted_interrupt)
GPIO_INT(H1_EC_PWR_BTN_ODL, PIN(E, 2), GPIO_INT_BOTH | GPIO_PULL_UP, power_button_interrupt)
#ifdef CONFIG_LOW_POWER_IDLE
/* Used to wake up the EC from Deep Doze mode when writing to console */
-GPIO_INT(UART1_RX, PIN(B, 0), GPIO_INT_BOTH, uart_deepsleep_interrupt) /* UART_DBG_TX_EC_RX */
+GPIO_INT(UART1_RX, PIN(B, 0), GPIO_INT_BOTH, uart_deepsleep_interrupt) /* UART_DBG_TX_EC_RX */
#endif
/* USB-C interrupts */
GPIO_INT(USB_C0_INT_ODL, PIN(K, 0), GPIO_INT_FALLING | GPIO_PULL_UP, usb_c0_interrupt) /* BC12 and charger */
-GPIO_INT(USB_C1_INT_V0_ODL, PIN(B, 5), GPIO_INT_FALLING | GPIO_PULL_UP, usb_c1_interrupt) /* TCPC, charger, BC12 - board version 0 */
GPIO_INT(USB_C1_INT_V1_ODL, PIN(E, 6), GPIO_INT_FALLING | GPIO_PULL_UP, usb_c1_interrupt) /* TCPC, charger, BC12 - board version 1 */
GPIO_INT(USB_C0_CCSBU_OVP_ODL, PIN(K, 6), GPIO_INT_FALLING | GPIO_PULL_UP, c0_ccsbu_ovp_interrupt) /* Fault protection */
@@ -80,11 +79,8 @@ GPIO(EC_I2C_USB_C0_SCL, PIN(A, 4), GPIO_INPUT)
GPIO(EC_I2C_USB_C0_SDA, PIN(A, 5), GPIO_INPUT)
/* USB pins */
-GPIO(EN_USB_C0_CC1_VCONN, PIN(H, 4), GPIO_OUT_LOW)
-GPIO(EN_USB_C0_CC2_VCONN, PIN(H, 6), GPIO_OUT_LOW)
GPIO(EC_AP_USB_C0_HPD, PIN(L, 4), GPIO_OUT_LOW)
GPIO(EC_AP_USB_C1_HDMI_HPD, PIN(K, 7), GPIO_OUT_LOW)
-GPIO(USB_C0_FRS, PIN(C, 4), GPIO_OUT_LOW)
GPIO(HDMI_SEL_L, PIN(C, 6), GPIO_OUT_HIGH)
GPIO(EN_USB_A0_VBUS, PIN(L, 6), GPIO_OUT_LOW) /* Board rev 1, NC board rev 0 */
@@ -111,13 +107,20 @@ GPIO(EC_LED_R_ODL, PIN(A, 1), GPIO_OUT_LOW)
GPIO(EC_LED_B_ODL, PIN(A, 3), GPIO_OUT_LOW)
/* NC pins, enable internal pull-down to avoid floating state. */
+GPIO(GPIOA0_NC, PIN(A, 0), GPIO_INPUT | GPIO_PULL_DOWN)
+GPIO(GPIOA2_NC, PIN(A, 2), GPIO_INPUT | GPIO_PULL_DOWN)
+GPIO(GPIOB5_NC, PIN(B, 5), GPIO_INPUT | GPIO_PULL_DOWN)
GPIO(GPIOC0_NC, PIN(C, 0), GPIO_INPUT | GPIO_PULL_DOWN)
GPIO(GPIOC3_NC, PIN(C, 3), GPIO_INPUT | GPIO_PULL_DOWN)
+GPIO(GPIOF4_NC, PIN(F, 4), GPIO_INPUT | GPIO_PULL_DOWN)
+GPIO(GPIOF5_NC, PIN(F, 5), GPIO_INPUT | GPIO_PULL_DOWN)
GPIO(GPIOG3_NC, PIN(G, 3), GPIO_INPUT | GPIO_PULL_DOWN)
GPIO(GPIOG4_NC, PIN(G, 4), GPIO_INPUT | GPIO_PULL_DOWN)
GPIO(GPIOG5_NC, PIN(G, 5), GPIO_INPUT | GPIO_PULL_DOWN)
GPIO(GPIOG6_NC, PIN(G, 6), GPIO_INPUT | GPIO_PULL_DOWN)
GPIO(GPIOG7_NC, PIN(G, 7), GPIO_INPUT | GPIO_PULL_DOWN)
+GPIO(GPIOH4_NC, PIN(H, 4), GPIO_INPUT | GPIO_PULL_DOWN)
+GPIO(GPIOH6_NC, PIN(H, 6), GPIO_INPUT | GPIO_PULL_DOWN)
GPIO(GPIOJ4_NC, PIN(J, 4), GPIO_INPUT | GPIO_PULL_DOWN)
GPIO(GPIOJ5_NC, PIN(J, 5), GPIO_INPUT | GPIO_PULL_DOWN)
GPIO(GPIOJ6_NC, PIN(J, 6), GPIO_INPUT | GPIO_PULL_DOWN)
diff --git a/board/beadrix/usb_pd_policy.c b/board/beadrix/usb_pd_policy.c
index 3ff7152541..a50ef8cfa9 100644
--- a/board/beadrix/usb_pd_policy.c
+++ b/board/beadrix/usb_pd_policy.c
@@ -9,7 +9,7 @@
#include "chipset.h"
#include "common.h"
#include "console.h"
-#include "driver/charger/sm5803.h"
+#include "driver/charger/isl923x_public.h"
#include "driver/tcpm/tcpci.h"
#include "usb_pd.h"
@@ -24,19 +24,11 @@ int pd_check_vconn_swap(int port)
void pd_power_supply_reset(int port)
{
- int prev_en;
-
if (port < 0 || port >= board_get_usb_pd_port_count())
return;
- prev_en = charger_is_sourcing_otg_power(port);
-
- /* Disable Vbus */
- charger_enable_otg_power(port, 0);
-
- /* Discharge Vbus if previously enabled */
- if (prev_en)
- sm5803_set_vbus_disch(port, 1);
+ /* Disable VBUS */
+ tcpc_write(port, TCPC_REG_COMMAND, TCPC_REG_COMMAND_SRC_CTRL_LOW);
/* Notify host of power info change. */
pd_send_host_event(PD_EVENT_POWER_CHANGE);
@@ -44,42 +36,31 @@ void pd_power_supply_reset(int port)
int pd_set_power_supply_ready(int port)
{
- enum ec_error_list rv;
+ int rv;
- /* Disable sinking */
- rv = sm5803_vbus_sink_enable(port, 0);
+ if (port >= board_get_usb_pd_port_count())
+ return EC_ERROR_INVAL;
+
+ /* Disable charging. */
+ rv = tcpc_write(port, TCPC_REG_COMMAND, TCPC_REG_COMMAND_SNK_CTRL_LOW);
if (rv)
return rv;
- /* Disable Vbus discharge */
- sm5803_set_vbus_disch(port, 0);
+ /* Our policy is not to source VBUS when the AP is off. */
+ if (chipset_in_state(CHIPSET_STATE_ANY_OFF))
+ return EC_ERROR_NOT_POWERED;
- /* Provide Vbus */
- charger_enable_otg_power(port, 1);
+ /* Provide Vbus. */
+ rv = tcpc_write(port, TCPC_REG_COMMAND, TCPC_REG_COMMAND_SRC_CTRL_HIGH);
+ if (rv)
+ return rv;
+
+ rv = raa489000_enable_asgate(port, true);
+ if (rv)
+ return rv;
/* Notify host of power info change. */
pd_send_host_event(PD_EVENT_POWER_CHANGE);
return EC_SUCCESS;
}
-
-__override bool pd_check_vbus_level(int port, enum vbus_level level)
-{
- int vbus_voltage;
-
- /* If we're unable to speak to the charger, best to guess false */
- if (charger_get_vbus_voltage(port, &vbus_voltage))
- return false;
-
- if (level == VBUS_SAFE0V)
- return vbus_voltage < PD_V_SAFE0V_MAX;
- else if (level == VBUS_PRESENT)
- return vbus_voltage > PD_V_SAFE5V_MIN;
- else
- return vbus_voltage < PD_V_SINK_DISCONNECT_MAX;
-}
-
-int pd_snk_is_vbus_provided(int port)
-{
- return sm5803_is_vbus_present(port);
-}