summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKirk Wang <kirk_wang@pegatron.corp-partner.google.com>2021-04-28 17:19:03 +0800
committerCommit Bot <commit-bot@chromium.org>2021-05-04 05:03:28 +0000
commit34b8c2a0aa2d28b35160114080cad049aebe8623 (patch)
treef1d956c49b38a247c0b8ae89fc63cc24a6381305
parent14dd51f4fcfeb1bbbdbf0dd9f9365c4072db44ef (diff)
downloadchrome-ec-34b8c2a0aa2d28b35160114080cad049aebe8623.tar.gz
Pirika: Modify Charger and TCPC configurations.
Base on schematics, update charger IC and TCPC setting. BUG=b:186613739 BRANCH=none TEST=make BOARD=pirika Signed-off-by: Kirk Wang <kirk_wang@pegatron.corp-partner.google.com> Change-Id: I3659a8f7b693f730e6cffc79edf9fe583779bb12 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2856061 Reviewed-by: Alex1 Kao <alex1_kao@pegatron.corp-partner.google.com> Reviewed-by: Shou-Chieh Hsu <shouchieh@chromium.org> Commit-Queue: Shou-Chieh Hsu <shouchieh@chromium.org>
-rw-r--r--board/pirika/board.c313
-rw-r--r--board/pirika/board.h28
-rw-r--r--board/pirika/ec.tasklist1
-rw-r--r--board/pirika/gpio.inc4
-rw-r--r--board/pirika/usb_pd_policy.c65
5 files changed, 246 insertions, 165 deletions
diff --git a/board/pirika/board.c b/board/pirika/board.c
index 18b97bd859..0582864dac 100644
--- a/board/pirika/board.c
+++ b/board/pirika/board.c
@@ -13,11 +13,10 @@
#include "driver/accel_kionix.h"
#include "driver/accelgyro_lsm6dsm.h"
#include "driver/bc12/pi3usb9201.h"
-#include "driver/charger/sm5803.h"
+#include "driver/charger/isl923x.h"
#include "driver/retimer/tusb544.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/usb_mux/it5205.h"
#include "gpio.h"
#include "hooks.h"
@@ -41,20 +40,18 @@
#include "usb_pd_tcpm.h"
#define CPRINTUSB(format, args...) cprints(CC_USBCHARGE, format, ## args)
+#define CPRINTS(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)
{
+ 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 +86,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 +94,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_ODL)) {
notify_c1_chips();
hook_call_deferred(&check_c1_line_data, INT_RECHECK_US);
}
@@ -172,43 +168,156 @@ const struct pi3usb9201_config_t pi3usb9201_bc12_chips[] = {
},
};
+int pd_snk_is_vbus_provided(int port)
+{
+ return pd_check_vbus_level(port, VBUS_PRESENT);
+}
+
/* 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,
},
{
.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,
},
};
/* USB Retimer */
+enum tusb544_conf {
+ USB_DP = 0,
+ USB_DP_INV,
+ USB,
+ USB_INV,
+ DP,
+ DP_INV
+};
+
+static int board_tusb544_set(const struct usb_mux *me,
+ mux_state_t mux_state)
+{
+ int rv = EC_SUCCESS;
+ enum tusb544_conf usb_mode = 0;
+ /* USB */
+ if (mux_state & USB_PD_MUX_USB_ENABLED) {
+ /* USB with DP */
+ if (mux_state & USB_PD_MUX_DP_ENABLED) {
+ usb_mode = (mux_state & USB_PD_MUX_POLARITY_INVERTED)
+ ? USB_DP_INV
+ : USB_DP;
+ }
+ /* USB without DP */
+ else {
+ usb_mode = (mux_state & USB_PD_MUX_POLARITY_INVERTED)
+ ? USB_INV
+ : USB;
+ }
+ }
+ /* DP without USB */
+ else if (mux_state & USB_PD_MUX_DP_ENABLED) {
+ usb_mode = (mux_state & USB_PD_MUX_POLARITY_INVERTED)
+ ? DP_INV
+ : DP;
+ }
+ /* Nothing enabled */
+ else
+ return EC_SUCCESS;
+ /* Write the retimer config byte */
+ if (usb_mode == USB_INV) {
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_GENERAL4, 0x15);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_DISPLAYPORT_1, 0x33);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_DISPLAYPORT_2, 0x33);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_USB3_1_1, 0x22);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_USB3_1_2, 0x22);
+ } else if (usb_mode == USB) {
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_GENERAL4, 0x11);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_DISPLAYPORT_1, 0x33);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_DISPLAYPORT_2, 0x33);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_USB3_1_1, 0x22);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_USB3_1_2, 0x22);
+ } else if (usb_mode == USB_DP_INV) {
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_GENERAL4, 0x1F);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_DISPLAYPORT_1, 0x33);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_DISPLAYPORT_2, 0x99);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_USB3_1_1, 0x22);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_USB3_1_2, 0x22);
+ } else if (usb_mode == USB_DP) {
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_GENERAL4, 0x1B);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_DISPLAYPORT_1, 0x99);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_DISPLAYPORT_2, 0x33);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_USB3_1_1, 0x22);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_USB3_1_2, 0x22);
+ } else if (usb_mode == DP_INV) {
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_GENERAL4, 0x1E);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_DISPLAYPORT_1, 0x99);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_DISPLAYPORT_2, 0x99);
+ } else if (usb_mode == DP) {
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_GENERAL4, 0x1A);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_DISPLAYPORT_1, 0x99);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags,
+ TUSB544_REG_DISPLAYPORT_2, 0x99);
+ }
+
+ return rv;
+}
+
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,
+ .board_set = &board_tusb544_set,
};
/* USB Muxes */
@@ -222,8 +331,8 @@ const struct usb_mux usb_muxes[CONFIG_USB_PD_PORT_MAX_COUNT] = {
{
.usb_port = 1,
.i2c_port = I2C_PORT_SUB_USB_C1,
- .i2c_addr_flags = AN7447_TCPC0_I2C_ADDR_FLAGS,
- .driver = &anx7447_usb_mux_driver,
+ .i2c_addr_flags = IT5205_I2C_ADDR1_FLAGS,
+ .driver = &it5205_usb_mux_driver,
.next_mux = &usbc1_retimer,
},
};
@@ -232,35 +341,22 @@ 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;
- }
-
-
gpio_enable_interrupt(GPIO_USB_C0_INT_ODL);
- gpio_enable_interrupt(c1_int_line);
+ gpio_enable_interrupt(GPIO_USB_C1_INT_ODL);
/*
* If interrupt lines are already low, schedule them to be processed
* after inits are completed.
*/
- check_c0_line();
- check_c1_line();
+ if (!gpio_get_level(GPIO_USB_C0_INT_ODL))
+ hook_call_deferred(&check_c0_line_data, 0);
+ if (!gpio_get_level(GPIO_USB_C1_INT_ODL))
+ hook_call_deferred(&check_c1_line_data, 0);
gpio_enable_interrupt(GPIO_USB_C0_CCSBU_OVP_ODL);
/* 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 */
on = chipset_in_state(CHIPSET_STATE_ON | CHIPSET_STATE_ANY_SUSPEND |
CHIPSET_STATE_SOFT_OFF);
@@ -268,31 +364,15 @@ void board_init(void)
}
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.
*/
- sm5803_hibernate(CHARGER_PRIMARY);
+ raa489000_hibernate(CHARGER_PRIMARY, true);
if (board_get_charger_chip_count() > 1)
- sm5803_hibernate(CHARGER_SECONDARY);
+ raa489000_hibernate(CHARGER_SECONDARY, true);
}
__override void board_ocpc_init(struct ocpc_data *ocpc)
@@ -317,22 +397,24 @@ __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");
+ if (isl923x_set_comparator_inversion(1, !!enable))
+ CPRINTS("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;
+ if (!gpio_get_level(GPIO_USB_C0_INT_ODL)) {
+ if (!tcpc_read16(0, TCPC_REG_ALERT, &regval)) {
+ if (regval)
+ status = PD_STATUS_TCPC_ALERT_0;
+ }
+ }
+
/* Check whether TCPC 1 pulled the shared interrupt line */
- if (!gpio_get_level(c1_int_line)) {
+ if (!gpio_get_level(GPIO_USB_C1_INT_ODL)) {
if (!tcpc_read16(1, TCPC_REG_ALERT, &regval)) {
if (regval)
status = PD_STATUS_TCPC_ALERT_1;
@@ -354,79 +436,100 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, int max_ma,
charge_set_input_current_limit(icl, charge_mv);
}
+int board_is_sourcing_vbus(int port)
+{
+ int regval;
+
+ 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("New chg p%d", port);
- if (board_get_charger_chip_count() > 1)
- sm5803_vbus_sink_enable(CHARGER_SECONDARY, 0);
+ /* Disable all ports. */
+ if (port == CHARGE_PORT_NONE) {
+ 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);
+ /* 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 (port == i)
+ 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;
}
- return EC_SUCCESS;
-}
+ /* Allow the charger IC to begin/continue switching. */
+ charger_discharge_on_ac(0);
-/* Vconn control for integrated ITE TCPC */
-void board_pd_vconn_ctrl(int port, enum usbpd_cc_pin cc_pin, int enabled)
-{
- /* Vconn control is only for port 0 */
- if (port)
- return;
+ return EC_SUCCESS;
- 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);
}
__override void ocpc_get_pid_constants(int *kp, int *kp_div,
int *ki, int *ki_div,
int *kd, int *kd_div)
{
- *kp = 3;
- *kp_div = 14;
-
- *ki = 3;
- *ki_div = 500;
-
- *kd = 4;
- *kd_div = 40;
+ *kp = 1;
+ *kp_div = 20;
+ *ki = 1;
+ *ki_div = 250;
+ *kd = 0;
+ *kd_div = 1;
}
__override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp)
{
- int current;
-
- if (port < 0 || port > CONFIG_USB_PD_PORT_MAX_COUNT)
+ if (port < 0 || port > board_get_usb_pd_port_count())
return;
- current = (rp == TYPEC_RP_3A0) ? 3000 : 1500;
-
- charger_set_otg_current_voltage(port, current, 5000);
+ raa489000_set_output_current(port, rp);
}
/* PWM channels. Must be in the exactly same order as in enum pwm_channel. */
diff --git a/board/pirika/board.h b/board/pirika/board.h
index fb2e38d771..d6add9680d 100644
--- a/board/pirika/board.h
+++ b/board/pirika/board.h
@@ -15,6 +15,7 @@
/* System unlocked in early development */
#define CONFIG_SYSTEM_UNLOCKED
+#define CONFIG_CMD_TCPC_DUMP
#define CONFIG_CMD_CHARGER_DUMP
/* Battery */
@@ -24,20 +25,16 @@
#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 /* C0 and C1: Charger */
+#define CONFIG_CHARGER_SENSE_RESISTOR_AC 10
+#define CONFIG_CHARGER_SENSE_RESISTOR 10
#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 */
+#undef CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE
+#define CONFIG_USB_PD_TCPC_LPM_EXIT_DEBOUNCE (100 * MSEC)
-/*
- * GPIO for C1 interrupts, for baseboard use
- *
- * Note this will only be valid for board revision 1
- */
-#define GPIO_USB_C1_INT_ODL GPIO_USB_C1_INT_V1_ODL
+#define GPIO_USB_C1_INT_ODL GPIO_SUB_USB_C1_INT_ODL
/* LED */
#define CONFIG_LED_PWM
@@ -70,9 +67,12 @@
/* 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_RAA489000
+#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
+#define CONFIG_USB_PD_5V_EN_CUSTOM
/* Thermistors */
#define CONFIG_TEMP_SENSOR
diff --git a/board/pirika/ec.tasklist b/board/pirika/ec.tasklist
index 5c9a2d1a01..d6fa610141 100644
--- a/board/pirika/ec.tasklist
+++ b/board/pirika/ec.tasklist
@@ -21,4 +21,5 @@
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_C0, pd_interrupt_handler_task, 0, ULTRA_TASK_STACK_SIZE) \
TASK_ALWAYS(PD_INT_C1, pd_interrupt_handler_task, 1, ULTRA_TASK_STACK_SIZE)
diff --git a/board/pirika/gpio.inc b/board/pirika/gpio.inc
index 6dd15a0069..8100fa9347 100644
--- a/board/pirika/gpio.inc
+++ b/board/pirika/gpio.inc
@@ -30,8 +30,7 @@ GPIO_INT(UART1_RX, PIN(B, 0), GPIO_INT_BOTH, uart_deepsleep_interrupt) /* UART_
/* 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(SUB_USB_C1_INT_ODL, PIN(E, 6), GPIO_INT_FALLING | GPIO_PULL_UP, usb_c1_interrupt)
GPIO_INT(USB_C0_CCSBU_OVP_ODL, PIN(K, 6), GPIO_INT_FALLING | GPIO_PULL_UP, c0_ccsbu_ovp_interrupt) /* Fault protection */
/* Other interrupts */
@@ -107,6 +106,7 @@ GPIO(EN_KB_BL, PIN(J, 3), GPIO_OUT_LOW) /* Currently unused */
GPIO(ECH1_PACKET_MODE, PIN(H, 1), GPIO_OUT_LOW)
/* NC pins, enable internal pull-down to avoid floating state. */
+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(GPIOG3_NC, PIN(G, 3), GPIO_INPUT | GPIO_PULL_DOWN)
diff --git a/board/pirika/usb_pd_policy.c b/board/pirika/usb_pd_policy.c
index 3ff7152541..b0e1098e4d 100644
--- a/board/pirika/usb_pd_policy.c
+++ b/board/pirika/usb_pd_policy.c
@@ -3,13 +3,11 @@
* found in the LICENSE file.
*/
-#include "battery_smart.h"
#include "charge_manager.h"
-#include "charger.h"
#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"
@@ -18,25 +16,14 @@
int pd_check_vconn_swap(int port)
{
- /* Allow VCONN swaps if the AP is on */
+ /* Allow VCONN swaps if the AP is on. */
return chipset_in_state(CHIPSET_STATE_ANY_SUSPEND | CHIPSET_STATE_ON);
}
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,18 +31,28 @@ void pd_power_supply_reset(int port)
int pd_set_power_supply_ready(int port)
{
- enum ec_error_list rv;
+ int rv;
+
+ if (port >= board_get_usb_pd_port_count())
+ return EC_ERROR_INVAL;
- /* Disable sinking */
- rv = sm5803_vbus_sink_enable(port, 0);
+ /* 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);
@@ -63,23 +60,3 @@ int pd_set_power_supply_ready(int port)
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);
-}