diff options
author | Marco Chen <marcochen@google.com> | 2020-07-21 14:45:56 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-07-23 09:28:49 +0000 |
commit | f8229b2b9c2a49d9b69765e946e00c0ce90048a4 (patch) | |
tree | f8d8e01f6d994ec555a3d8381258ed81ef957a2c /board/bobba | |
parent | 0f982a35e978febfc1bab45d1afc048e0c78968a (diff) | |
download | chrome-ec-f8229b2b9c2a49d9b69765e946e00c0ce90048a4.tar.gz |
bobba: fix triggering condition for PPC interrupt of SYV682A
The ALERT_L of SYV682A will be kept low when there are any pending bits
waited for host to process and the driver itself will maintain the
flags like OCP and 5V_OC by monitoring the the CONTROL_4 and STATUS
registers. As a result
1. we need to enable both GPIO_INT_[FALLING|RISING] in order to set
/ clear self maintained flags.
2. CONFIG_USBC_PPC_DEDICATED_INT is defined to monitor ALERT_L
status by reading the GPIO state directly.
BUG=b:154772847, b:161762373
TEST=Check the interrupt handler is triggered twice for OC_5V set
and cleared by PPC.
Change-Id: I8640e4db878921be753eb6bd8d928a2702e73eeb
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2309522
Tested-by: Marco Chen <marcochen@chromium.org>
Commit-Queue: Marco Chen <marcochen@chromium.org>
Reviewed-by: Eric Herrmann <eherrmann@chromium.org>
Reviewed-by: Diana Z <dzigterman@chromium.org>
Diffstat (limited to 'board/bobba')
-rw-r--r-- | board/bobba/board.c | 55 | ||||
-rw-r--r-- | board/bobba/board.h | 1 |
2 files changed, 35 insertions, 21 deletions
diff --git a/board/bobba/board.c b/board/bobba/board.c index 90bfaf74ce..c0902ec9ee 100644 --- a/board/bobba/board.c +++ b/board/bobba/board.c @@ -386,6 +386,35 @@ __override uint32_t board_override_feature_flags0(uint32_t flags0) return (flags0 & ~EC_FEATURE_MASK_0(EC_FEATURE_PWM_KEYB)); } +static const struct ppc_config_t ppc_syv682x_port0 = { + .i2c_port = I2C_PORT_TCPC0, + .i2c_addr_flags = SYV682X_ADDR0_FLAGS, + .drv = &syv682x_drv, +}; + +static const struct ppc_config_t ppc_syv682x_port1 = { + .i2c_port = I2C_PORT_TCPC1, + .i2c_addr_flags = SYV682X_ADDR0_FLAGS, + .drv = &syv682x_drv, +}; + +static void board_setup_ppc(void) +{ + if (!support_syv_ppc()) + return; + + memcpy(&ppc_chips[USB_PD_PORT_TCPC_0], + &ppc_syv682x_port0, + sizeof(struct ppc_config_t)); + memcpy(&ppc_chips[USB_PD_PORT_TCPC_1], + &ppc_syv682x_port1, + sizeof(struct ppc_config_t)); + + gpio_set_flags(GPIO_USB_PD_C0_INT_ODL, GPIO_INT_BOTH); + gpio_set_flags(GPIO_USB_PD_C1_INT_ODL, GPIO_INT_BOTH); +} +DECLARE_HOOK(HOOK_INIT, board_setup_ppc, HOOK_PRIO_INIT_I2C + 2); + void board_hibernate_late(void) { int i; @@ -426,27 +455,11 @@ void board_overcurrent_event(int port, int is_overcurrented) gpio_set_level(GPIO_USB_C_OC, !is_overcurrented); } -const struct ppc_config_t ppc_syv682x_port0 = { - .i2c_port = I2C_PORT_TCPC0, - .i2c_addr_flags = SYV682X_ADDR0_FLAGS, - .drv = &syv682x_drv, -}; -const struct ppc_config_t ppc_syv682x_port1 = { - .i2c_port = I2C_PORT_TCPC1, - .i2c_addr_flags = SYV682X_ADDR0_FLAGS, - .drv = &syv682x_drv, -}; - -static void board_setup_ppc(void) +int ppc_get_alert_status(int port) { - if (support_syv_ppc()) { - memcpy(&ppc_chips[USB_PD_PORT_TCPC_0], - &ppc_syv682x_port0, - sizeof(struct ppc_config_t)); - memcpy(&ppc_chips[USB_PD_PORT_TCPC_1], - &ppc_syv682x_port1, - sizeof(struct ppc_config_t)); - } + if (port == 0) + return gpio_get_level(GPIO_USB_PD_C0_INT_ODL) == 0; + + return gpio_get_level(GPIO_USB_PD_C1_INT_ODL) == 0; } -DECLARE_HOOK(HOOK_INIT, board_setup_ppc, HOOK_PRIO_INIT_I2C + 2); diff --git a/board/bobba/board.h b/board/bobba/board.h index c16422ba9c..3284c00876 100644 --- a/board/bobba/board.h +++ b/board/bobba/board.h @@ -68,6 +68,7 @@ /* Additional PPC second source */ #define CONFIG_USBC_PPC_SYV682X +#define CONFIG_USBC_PPC_DEDICATED_INT #ifndef __ASSEMBLER__ |