summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTing Shen <phoenixshen@google.com>2020-09-09 19:18:13 +0800
committerCommit Bot <commit-bot@chromium.org>2020-09-15 08:26:56 +0000
commit73430b61121309fbc783a725650cd6c6e77467ea (patch)
treec43cfaded23c51d616bbac261ebecbbd46de1639
parenta4fcebc675bea0f5d3911f03947ab940eb70020d (diff)
downloadchrome-ec-73430b61121309fbc783a725650cd6c6e77467ea.tar.gz
asurada: implement SBU OVP interrupt
This CL implemented over-voltage protection handler for Asurada. IT5205 fires an interrupt when over-voltage is detected, but not on recovered. After over-voltage happened, EC have to poll until the OVP state is cleared. To prevent heavy i2c transaction, this CL implements an asynchronous polling algorithm that doubling the polling interval each time, up to 1 minute. BUG=b:167499422 TEST=On reworked asurada, verify "OVP triggered / cleared" displayed when ovp happens. BRANCH=none Signed-off-by: Ting Shen <phoenixshen@google.com> Change-Id: I5e82e0ef8bc824e52e4c6b5cddf0e3d4d76c8ec2 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2402599 Reviewed-by: Eric Yilun Lin <yllin@chromium.org> Commit-Queue: Ting Shen <phoenixshen@chromium.org> Tested-by: Ting Shen <phoenixshen@chromium.org>
-rw-r--r--board/asurada/board.c8
-rw-r--r--board/asurada/board.h1
-rw-r--r--board/asurada/build.mk2
-rw-r--r--board/asurada/gpio.inc4
-rw-r--r--board/asurada/it5205_sbu.c68
-rw-r--r--board/asurada/it5205_sbu.h13
6 files changed, 92 insertions, 4 deletions
diff --git a/board/asurada/board.c b/board/asurada/board.c
index 828eb780df..075ec39128 100644
--- a/board/asurada/board.c
+++ b/board/asurada/board.c
@@ -6,6 +6,7 @@
#include "adc.h"
#include "adc_chip.h"
+#include "board/asurada/it5205_sbu.h"
#include "button.h"
#include "charge_manager.h"
#include "charge_state_v2.h"
@@ -148,6 +149,9 @@ static void board_init(void)
/* Enable motion sensor interrupt */
gpio_enable_interrupt(GPIO_BASE_IMU_INT_L);
gpio_enable_interrupt(GPIO_LID_ACCEL_INT_L);
+
+ /* Enable it5205h sbu ovp interrupt */
+ gpio_enable_interrupt(GPIO_USB_C0_MUX_INT_L);
}
DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT);
@@ -625,7 +629,7 @@ int board_regulator_get_voltage(uint32_t index, uint32_t *voltage_mv)
/* TODO(b/163098341): Remove these after rev0 deprecated. */
enum gpio_signal GPIO_AC_PRESENT = GPIO_AC_PRESENT_PLACEHOLDER;
-static void ac_present_init(void)
+static void board_gpio_init(void)
{
if (board_get_version() == 0)
GPIO_AC_PRESENT = GPIO_EC_GPM2;
@@ -639,7 +643,7 @@ static void ac_present_init(void)
gpio_enable_interrupt(GPIO_AC_PRESENT);
extpower_interrupt(GPIO_AC_PRESENT);
}
-DECLARE_HOOK(HOOK_INIT, ac_present_init, HOOK_PRIO_INIT_ADC + 1);
+DECLARE_HOOK(HOOK_INIT, board_gpio_init, HOOK_PRIO_INIT_ADC + 1);
/* Sensor */
static struct mutex g_base_mutex;
diff --git a/board/asurada/board.h b/board/asurada/board.h
index 9498b80370..d99de9f60a 100644
--- a/board/asurada/board.h
+++ b/board/asurada/board.h
@@ -96,6 +96,7 @@
#define CONFIG_USBC_VCONN_SWAP
#define CONFIG_USB_DRP_ACC_TRYSRC
#define CONFIG_USB_MUX_IT5205 /* C0 */
+#define CONFIG_USB_MUX_IT5205H_SBU_OVP
#define CONFIG_USB_MUX_PS8743 /* C1 */
#define CONFIG_USB_PD_ALT_MODE
#define CONFIG_USB_PD_ALT_MODE_DFP
diff --git a/board/asurada/build.mk b/board/asurada/build.mk
index 33f069093d..8c069e29bc 100644
--- a/board/asurada/build.mk
+++ b/board/asurada/build.mk
@@ -10,4 +10,4 @@ CHIP:=it83xx
CHIP_FAMILY:=it8xxx2
CHIP_VARIANT:=it81202ax_1024
-board-y=battery.o board.o board_id.o led.o usb_pd_policy.o
+board-y=battery.o board.o board_id.o it5205_sbu.o led.o usb_pd_policy.o
diff --git a/board/asurada/gpio.inc b/board/asurada/gpio.inc
index 967a3d5c98..ba380fc1b0 100644
--- a/board/asurada/gpio.inc
+++ b/board/asurada/gpio.inc
@@ -60,6 +60,8 @@ GPIO_INT(WP, PIN(I, 4), GPIO_INT_BOTH,
GPIO_INT(SPI0_CS, PIN(M, 5), GPIO_INT_FALLING,
spi_event) /* SPI slave Chip Select -- AP_SPI_EC_CS_L */
GPIO_INT(X_EC_GPIO2, PIN(B, 2), GPIO_ODR_HIGH, x_ec_interrupt)
+GPIO_INT(USB_C0_MUX_INT_L, PIN(M, 3), GPIO_INT_FALLING | GPIO_PULL_UP,
+ it5205h_sbu_interrupt)
/* Power Sequencing Signals */
GPIO(EC_PMIC_EN_ODL, PIN(D, 0), GPIO_ODR_HIGH | GPIO_SEL_1P8V)
@@ -85,6 +87,7 @@ GPIO(EC_BATT_PRES_ODL, PIN(C, 0), GPIO_INPUT)
GPIO(BC12_DET_EN, PIN(J, 5), GPIO_OUT_LOW) /* EN_USB_C0_BC12_DET */
GPIO(EN_EC_ID_ODL, PIN(H, 5), GPIO_ODR_LOW)
GPIO(ENTERING_RW, PIN(C, 5), GPIO_OUT_LOW) /* EC_ENTERING_RW */
+GPIO(EC_USB_C0_MUX_RESET_L, PIN(D, 7), GPIO_OUT_HIGH)
/* I2C pins - Alternate function below configures I2C module on these pins */
GPIO(I2C_A_SCL, PIN(B, 3), GPIO_INPUT) /* I2C_CHG_BATT_SCL */
@@ -146,7 +149,6 @@ UNIMPLEMENTED_GPIO(USB_A0_FAULT_ODL, PIN(A, 7))
UNIMPLEMENTED_GPIO(CHARGER_PROCHOT_ODL, PIN(C, 3))
UNIMPLEMENTED_GPIO(USB_C0_FRS_EN, PIN(H, 3))
UNIMPLEMENTED_GPIO(PG_MT6315_GPU_ODL, PIN(H, 6))
-UNIMPLEMENTED_GPIO(USB_C0_MUX_INT_L, PIN(G, 3))
UNIMPLEMENTED_GPIO(EN_PP3000_SD_U, PIN(G, 1))
/* reserved for future use */
UNIMPLEMENTED_GPIO(CCD_MODE_ODL, PIN(C, 4))
diff --git a/board/asurada/it5205_sbu.c b/board/asurada/it5205_sbu.c
new file mode 100644
index 0000000000..9ee59a5cc3
--- /dev/null
+++ b/board/asurada/it5205_sbu.c
@@ -0,0 +1,68 @@
+/* Copyright 2020 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * IT5205 Type-C SBU OVP handler
+ */
+
+#include "console.h"
+#include "hooks.h"
+#include "it5205.h"
+#include "stdbool.h"
+#include "timer.h"
+#include "usb_mux.h"
+
+#define CPRINTS(format, args...) cprints(CC_USB, format, ## args)
+#define CPRINTF(format, args...) cprintf(CC_USB, format, ## args)
+
+#define OVP_RETRY_DELAY_US_MIN (100 * MSEC)
+
+static unsigned int ovp_retry_delay_us = OVP_RETRY_DELAY_US_MIN;
+
+static void reset_retry_delay(void)
+{
+ CPRINTS("IT5205 SBU OVP cleared");
+ ovp_retry_delay_us = OVP_RETRY_DELAY_US_MIN;
+}
+DECLARE_DEFERRED(reset_retry_delay);
+
+static void reset_csbu(void)
+{
+ /* double the retry time up to 1 minute */
+ ovp_retry_delay_us = MIN(ovp_retry_delay_us * 2, MINUTE);
+ /* and reset it if interrupt not triggered in a short period */
+ hook_call_deferred(&reset_retry_delay_data, 500 * MSEC);
+
+ /* re-enable sbu interrupt */
+ it5205h_enable_csbu_switch(&usb_muxes[0], false);
+ it5205h_enable_csbu_switch(&usb_muxes[0], true);
+}
+DECLARE_DEFERRED(reset_csbu);
+
+static void it5205h_hook_ac_change(void)
+{
+ int reg;
+
+ /* Check if the board has IT5205H, and read its ovp status */
+ if (i2c_read8(I2C_PORT_USB_MUX0, IT5205H_SBU_I2C_ADDR_FLAGS,
+ IT5205H_REG_ISR, &reg))
+ return;
+
+ /*
+ * Re-poll ovp status immediately if AC detached, because ovp will
+ * likely be recovered.
+ *
+ * Always perform the re-poll even when this hook is triggered by
+ * unrelated events.
+ */
+ if (reg & IT5205H_ISR_CSBU_OVP)
+ hook_call_deferred(&reset_csbu_data, 0);
+}
+DECLARE_HOOK(HOOK_AC_CHANGE, it5205h_hook_ac_change, HOOK_PRIO_DEFAULT);
+
+void it5205h_sbu_interrupt(enum gpio_signal signal)
+{
+ CPRINTS("IT5205 SBU OVP triggered");
+ hook_call_deferred(&reset_csbu_data, ovp_retry_delay_us);
+ hook_call_deferred(&reset_retry_delay_data, -1);
+}
diff --git a/board/asurada/it5205_sbu.h b/board/asurada/it5205_sbu.h
new file mode 100644
index 0000000000..8dc59520dd
--- /dev/null
+++ b/board/asurada/it5205_sbu.h
@@ -0,0 +1,13 @@
+/* Copyright 2020 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * IT5205 Type-C SBU OVP handler
+ */
+
+#ifndef __CROS_EC_ASURADA_IT5205_SBU_H
+#define __CROS_EC_ASURADA_IT5205_SBU_H
+
+void it5205h_sbu_interrupt(enum gpio_signal signal);
+
+#endif /* __CROS_EC_ASURADA_IT5205_SBU_H */