From 50c844cebd1b4ed18da981ee4c1e6b7dab0baddf Mon Sep 17 00:00:00 2001 From: Diana Z Date: Mon, 12 Apr 2021 09:36:56 -0600 Subject: Mancomb: Add USB-A fault inputs to fault output When we have an overcurrent, or when we have one of the USB-A fault interrupts asserted, we should in turn assert USB_FAULT_ODL to the SoC. BRANCH=None BUG=b:184884741 TEST=make -j buildall Signed-off-by: Diana Z Change-Id: Ib0861cc973813ba5c052fddde03ff2775ef2f24f Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2822812 Reviewed-by: Rob Barnes Commit-Queue: Rob Barnes --- baseboard/mancomb/base_gpio.inc | 12 ++++++------ baseboard/mancomb/baseboard.c | 40 +++++++++++++++++++++++++++++++++++++++- baseboard/mancomb/baseboard.h | 1 + 3 files changed, 46 insertions(+), 7 deletions(-) (limited to 'baseboard') diff --git a/baseboard/mancomb/base_gpio.inc b/baseboard/mancomb/base_gpio.inc index 2b23c922d5..b70eb19663 100644 --- a/baseboard/mancomb/base_gpio.inc +++ b/baseboard/mancomb/base_gpio.inc @@ -54,11 +54,16 @@ GPIO_INT(USB_C0_PPC_INT_ODL, PIN(7, 5), GPIO_INT_FALLING, ppc_interrupt) GPIO_INT(USB_C1_PPC_INT_ODL, PIN(D, 4), GPIO_INT_FALLING, ppc_interrupt) GPIO_INT(USB_C0_BC12_INT_ODL, PIN(A, 4), GPIO_INT_FALLING | GPIO_PULL_UP, bc12_interrupt) GPIO_INT(USB_C1_BC12_INT_ODL, PIN(9, 6), GPIO_INT_FALLING | GPIO_PULL_UP, bc12_interrupt) -GPIO(USB_C0_C1_FAULT_ODL, PIN(1, 4), GPIO_OUT_HIGH) /* C0/C1 Fault to SOC */ +GPIO(USB_FAULT_ODL, PIN(1, 4), GPIO_OUT_HIGH) /* C0/C1 Fault to SOC */ GPIO(USB_C0_TCPC_RST_L, PIN(1, 5), GPIO_OUT_HIGH) /* C0 TCPC Reset */ GPIO(USB_C1_TCPC_RST_L, PIN(1, 6), GPIO_OUT_HIGH) /* C1 TCPC Reset */ GPIO(USB_C0_HPD, PIN(F, 5), GPIO_OUT_LOW) /* C0 DP Hotplug Detect */ GPIO(USB_C1_HPD, PIN(F, 4), GPIO_OUT_LOW) /* C1 DP Hotplug Detect */ +GPIO_INT(USB_A4_FAULT_R_ODL, PIN(1, 1), GPIO_INT_BOTH, baseboard_usb_fault_alert) +GPIO_INT(USB_A3_FAULT_R_ODL, PIN(1, 0), GPIO_INT_BOTH, baseboard_usb_fault_alert) +GPIO_INT(USB_A2_FAULT_R_ODL, PIN(0, 7), GPIO_INT_BOTH, baseboard_usb_fault_alert) +GPIO_INT(USB_A1_FAULT_R_ODL, PIN(0, 6), GPIO_INT_BOTH, baseboard_usb_fault_alert) +GPIO_INT(USB_A0_FAULT_R_ODL, PIN(0, 5), GPIO_INT_BOTH, baseboard_usb_fault_alert) /* Sensor Signals */ ALTERNATE(/*TEMP_SOC|MEM*/ PIN_MASK(4, BIT(3) | BIT(5)), 0, MODULE_ADC, 0) /* SOC and Memory Temperature */ @@ -144,11 +149,6 @@ IOEX(USB_C1_SBU_FLIP, EXPIN(USBC_PORT_C1, 1, 7), GPIO_OUT_LOW) GPIO(EC_ADC_6, PIN(3, 4), GPIO_INPUT | GPIO_PULL_UP) GPIO(EC_FLPRG2, PIN(8, 6), GPIO_INPUT | GPIO_PULL_UP) GPIO(EC_GPIO04, PIN(0, 4), GPIO_INPUT | GPIO_PULL_UP) -GPIO(EC_GPIO05, PIN(0, 5), GPIO_INPUT | GPIO_PULL_UP) -GPIO(EC_GPIO06, PIN(0, 6), GPIO_INPUT | GPIO_PULL_UP) -GPIO(EC_GPIO07, PIN(0, 7), GPIO_INPUT | GPIO_PULL_UP) -GPIO(EC_GPIO10, PIN(1, 0), GPIO_INPUT | GPIO_PULL_UP) -GPIO(EC_GPIO11, PIN(1, 1), GPIO_INPUT | GPIO_PULL_UP) GPIO(EC_GPIO20, PIN(2, 0), GPIO_INPUT | GPIO_PULL_UP) GPIO(EC_GPIO22, PIN(2, 2), GPIO_INPUT | GPIO_PULL_UP) GPIO(EC_GPIO23, PIN(2, 3), GPIO_INPUT | GPIO_PULL_UP) diff --git a/baseboard/mancomb/baseboard.c b/baseboard/mancomb/baseboard.c index 4e3a642a46..083be3522f 100644 --- a/baseboard/mancomb/baseboard.c +++ b/baseboard/mancomb/baseboard.c @@ -283,6 +283,13 @@ static void baseboard_interrupt_init(void) /* Enable SBU fault interrupts */ ioex_enable_interrupt(IOEX_USB_C0_SBU_FAULT_ODL); ioex_enable_interrupt(IOEX_USB_C1_SBU_FAULT_ODL); + + /* Enable USB-A fault interrupts */ + gpio_enable_interrupt(GPIO_USB_A4_FAULT_R_ODL); + gpio_enable_interrupt(GPIO_USB_A3_FAULT_R_ODL); + gpio_enable_interrupt(GPIO_USB_A2_FAULT_R_ODL); + gpio_enable_interrupt(GPIO_USB_A1_FAULT_R_ODL); + gpio_enable_interrupt(GPIO_USB_A0_FAULT_R_ODL); } DECLARE_HOOK(HOOK_INIT, baseboard_interrupt_init, HOOK_PRIO_INIT_I2C + 1); @@ -718,12 +725,38 @@ static void baseboard_chipset_resume(void) } DECLARE_HOOK(HOOK_CHIPSET_RESUME, baseboard_chipset_resume, HOOK_PRIO_DEFAULT); +static bool ocp_tracker[CONFIG_USB_PD_PORT_MAX_COUNT]; + +static void set_usb_fault_output(void) +{ + bool fault_present = false; + int i; + + /* + * EC must OR all fault alerts and pass them to USB_FAULT_ODL, including + * overcurrents. + */ + for (i = 0; i < board_get_usb_pd_port_count(); i++) + if (ocp_tracker[i]) + fault_present = true; + + fault_present = fault_present || + !gpio_get_level(GPIO_USB_A4_FAULT_R_ODL) || + !gpio_get_level(GPIO_USB_A3_FAULT_R_ODL) || + !gpio_get_level(GPIO_USB_A2_FAULT_R_ODL) || + !gpio_get_level(GPIO_USB_A1_FAULT_R_ODL) || + !gpio_get_level(GPIO_USB_A0_FAULT_R_ODL); + + gpio_set_level(GPIO_USB_FAULT_ODL, !fault_present); +} + void board_overcurrent_event(int port, int is_overcurrented) { switch (port) { case USBC_PORT_C0: case USBC_PORT_C1: - gpio_set_level(GPIO_USB_C0_C1_FAULT_ODL, !is_overcurrented); + ocp_tracker[port] = is_overcurrented; + set_usb_fault_output(); break; default: @@ -731,6 +764,11 @@ void board_overcurrent_event(int port, int is_overcurrented) } } +void baseboard_usb_fault_alert(enum gpio_signal signal) +{ + set_usb_fault_output(); +} + void baseboard_en_pwr_pcore_s0(enum gpio_signal signal) { diff --git a/baseboard/mancomb/baseboard.h b/baseboard/mancomb/baseboard.h index f905e14586..66703fb317 100644 --- a/baseboard/mancomb/baseboard.h +++ b/baseboard/mancomb/baseboard.h @@ -307,6 +307,7 @@ enum mft_channel { /* Baseboard Interrupt handlers. */ void baseboard_en_pwr_pcore_s0(enum gpio_signal signal); void baseboard_en_pwr_s0(enum gpio_signal signal); +void baseboard_usb_fault_alert(enum gpio_signal signal); void bc12_interrupt(enum gpio_signal signal); void ext_charger_interrupt(enum gpio_signal signal); void dp_fault_interrupt(enum gpio_signal signal); -- cgit v1.2.1