diff options
author | Wai-Hong Tam <waihong@google.com> | 2020-11-18 09:53:41 -0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-11-18 22:05:47 +0000 |
commit | fac6e6f768d6525bf048d32d8e7a8a6c0c29c289 (patch) | |
tree | 3aeb8e71d2f1ab2133067c1bf2ec886565445b94 | |
parent | 9843eb21f89aae8bb71b1fe9f5390e7f709abf5b (diff) | |
download | chrome-ec-fac6e6f768d6525bf048d32d8e7a8a6c0c29c289.tar.gz |
Trogdor: Add the interrupt for USB-A overcurrent
The USB-A VBUS is through a load switch. The FAULT_L pin of
the load switch requires an external pull-up. Apply the pull-up
on EC side.
Add the interrupt of the FAULT_L pin. Route to the function
board_overcurrent_event(), which currently prints an error
message.
BRANCH=Trogdor
BUG=b:173154219
TEST=Plugged a USB load >1.5A to the USB-A port and checked
the error message was printed:
[73.738372 p2: overcurrent!]
Change-Id: I5f5f82de942eaf26a33051ad17f14b90d8024b89
Signed-off-by: Wai-Hong Tam <waihong@google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2547190
Reviewed-by: Alexandru M Stan <amstan@chromium.org>
-rw-r--r-- | board/lazor/board.c | 18 | ||||
-rw-r--r-- | board/lazor/gpio.inc | 4 | ||||
-rw-r--r-- | board/pompom/board.c | 18 | ||||
-rw-r--r-- | board/pompom/gpio.inc | 4 | ||||
-rw-r--r-- | board/trogdor/board.c | 18 | ||||
-rw-r--r-- | board/trogdor/gpio.inc | 5 |
6 files changed, 61 insertions, 6 deletions
diff --git a/board/lazor/board.c b/board/lazor/board.c index da6e3b25a5..6e0d60935a 100644 --- a/board/lazor/board.c +++ b/board/lazor/board.c @@ -30,6 +30,7 @@ #include "switch.h" #include "tablet_mode.h" #include "task.h" +#include "usbc_ocp.h" #include "usbc_ppc.h" #define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ## args) @@ -39,6 +40,7 @@ static void tcpc_alert_event(enum gpio_signal signal); static void usb0_evt(enum gpio_signal signal); static void usb1_evt(enum gpio_signal signal); +static void usba_oc_interrupt(enum gpio_signal signal); static void ppc_interrupt(enum gpio_signal signal); static void board_connect_c0_sbu(enum gpio_signal s); static void switchcap_interrupt(enum gpio_signal signal); @@ -76,6 +78,19 @@ static void usb1_evt(enum gpio_signal signal) task_set_event(TASK_ID_USB_CHG_P1, USB_CHG_EVENT_BC12, 0); } +static void usba_oc_deferred(void) +{ + /* Use next number after all USB-C ports to indicate the USB-A port */ + board_overcurrent_event(CONFIG_USB_PD_PORT_MAX_COUNT, + !gpio_get_level(GPIO_USB_A0_OC_ODL)); +} +DECLARE_DEFERRED(usba_oc_deferred); + +static void usba_oc_interrupt(enum gpio_signal signal) +{ + hook_call_deferred(&usba_oc_deferred_data, 0); +} + static void ppc_interrupt(enum gpio_signal signal) { switch (signal) { @@ -522,6 +537,9 @@ static void board_init(void) gpio_enable_interrupt(GPIO_USB_C0_BC12_INT_L); gpio_enable_interrupt(GPIO_USB_C1_BC12_INT_L); + /* Enable USB-A overcurrent interrupt */ + gpio_enable_interrupt(GPIO_USB_A0_OC_ODL); + /* * The H1 SBU line for CCD are behind PPC chip. The PPC internal FETs * for SBU may be disconnected after DP alt mode is off. Should enable diff --git a/board/lazor/gpio.inc b/board/lazor/gpio.inc index aa8f222b6d..aed9239885 100644 --- a/board/lazor/gpio.inc +++ b/board/lazor/gpio.inc @@ -8,13 +8,14 @@ /* Declare symbolic names for all the GPIOs that we care about. * Note: Those with interrupt handlers must be declared first. */ -/* USB-C interrupts */ +/* USB interrupts */ GPIO_INT(USB_C0_PD_INT_ODL, PIN(E, 0), GPIO_INT_FALLING, tcpc_alert_event) /* Interrupt from port-0 TCPC */ GPIO_INT(USB_C1_PD_INT_ODL, PIN(F, 5), GPIO_INT_FALLING, tcpc_alert_event) /* Interrupt from port-1 TCPC */ GPIO_INT(USB_C0_SWCTL_INT_ODL, PIN(0, 3), GPIO_INT_FALLING, ppc_interrupt) /* Interrupt from port-0 PPC */ GPIO_INT(USB_C1_SWCTL_INT_ODL, PIN(4, 0), GPIO_INT_FALLING, ppc_interrupt) /* Interrupt from port-1 PPC */ GPIO_INT(USB_C0_BC12_INT_L, PIN(6, 1), GPIO_INT_FALLING | GPIO_PULL_UP, usb0_evt) /* Interrupt from port-0 BC1.2 */ GPIO_INT(USB_C1_BC12_INT_L, PIN(8, 2), GPIO_INT_FALLING | GPIO_PULL_UP, usb1_evt) /* Interrupt from port-1 BC1.2 */ +GPIO_INT(USB_A0_OC_ODL, PIN(D, 1), GPIO_INT_BOTH | GPIO_PULL_UP, usba_oc_interrupt) /* System interrupts */ GPIO_INT(ACOK_OD, PIN(0, 0), GPIO_INT_BOTH, extpower_interrupt) /* ACOK */ @@ -88,7 +89,6 @@ GPIO(DP_HOT_PLUG_DET, PIN(9, 5), GPIO_OUT_LOW) /* DP HPD to AP */ /* USB-A */ GPIO(EN_USB_A_5V, PIN(8, 6), GPIO_OUT_LOW) GPIO(USB_A_CDP_ILIM_EN, PIN(7, 5), GPIO_OUT_HIGH) /* H: CDP, L:SDP. Only one USB-A port, always CDP */ -GPIO(USB_A0_OC_ODL, PIN(D, 1), GPIO_ODR_HIGH) /* LEDs */ GPIO(EC_CHG_LED_Y_C1, PIN(C, 3), GPIO_OUT_LOW) diff --git a/board/pompom/board.c b/board/pompom/board.c index afd801401e..062c8bc8ce 100644 --- a/board/pompom/board.c +++ b/board/pompom/board.c @@ -29,6 +29,7 @@ #include "switch.h" #include "tablet_mode.h" #include "task.h" +#include "usbc_ocp.h" #include "usbc_ppc.h" #define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ## args) @@ -37,6 +38,7 @@ /* Forward declaration */ static void tcpc_alert_event(enum gpio_signal signal); static void usb0_evt(enum gpio_signal signal); +static void usba_oc_interrupt(enum gpio_signal signal); static void ppc_interrupt(enum gpio_signal signal); static void board_connect_c0_sbu(enum gpio_signal s); @@ -63,6 +65,19 @@ static void usb0_evt(enum gpio_signal signal) task_set_event(TASK_ID_USB_CHG_P0, USB_CHG_EVENT_BC12, 0); } +static void usba_oc_deferred(void) +{ + /* Use next number after all USB-C ports to indicate the USB-A port */ + board_overcurrent_event(CONFIG_USB_PD_PORT_MAX_COUNT, + !gpio_get_level(GPIO_USB_A0_OC_ODL)); +} +DECLARE_DEFERRED(usba_oc_deferred); + +static void usba_oc_interrupt(enum gpio_signal signal) +{ + hook_call_deferred(&usba_oc_deferred_data, 0); +} + static void ppc_interrupt(enum gpio_signal signal) { switch (signal) { @@ -227,6 +242,9 @@ static void board_init(void) /* Enable BC1.2 interrupts */ gpio_enable_interrupt(GPIO_USB_C0_BC12_INT_L); + /* Enable USB-A overcurrent interrupt */ + gpio_enable_interrupt(GPIO_USB_A0_OC_ODL); + /* Enable interrupt for BMI160 sensor */ gpio_enable_interrupt(GPIO_ACCEL_GYRO_INT_L); diff --git a/board/pompom/gpio.inc b/board/pompom/gpio.inc index d53f56fbec..1a7492582f 100644 --- a/board/pompom/gpio.inc +++ b/board/pompom/gpio.inc @@ -8,10 +8,11 @@ /* Declare symbolic names for all the GPIOs that we care about. * Note: Those with interrupt handlers must be declared first. */ -/* USB-C interrupts */ +/* USB interrupts */ GPIO_INT(USB_C0_PD_INT_ODL, PIN(E, 0), GPIO_INT_FALLING, tcpc_alert_event) /* Interrupt from port-0 TCPC */ GPIO_INT(USB_C0_SWCTL_INT_ODL, PIN(0, 3), GPIO_INT_FALLING, ppc_interrupt) /* Interrupt from port-0 PPC */ GPIO_INT(USB_C0_BC12_INT_L, PIN(6, 1), GPIO_INT_FALLING | GPIO_PULL_UP, usb0_evt) /* Interrupt from port-0 BC1.2 */ +GPIO_INT(USB_A0_OC_ODL, PIN(D, 1), GPIO_INT_BOTH | GPIO_PULL_UP, usba_oc_interrupt) /* System interrupts */ GPIO_INT(ACOK_OD, PIN(0, 0), GPIO_INT_BOTH, extpower_interrupt) /* ACOK */ @@ -75,7 +76,6 @@ GPIO(DP_HOT_PLUG_DET, PIN(9, 5), GPIO_OUT_LOW) /* DP HPD to AP */ /* USB-A */ GPIO(EN_USB_A_5V, PIN(8, 6), GPIO_OUT_LOW) GPIO(USB_A_CDP_ILIM_EN, PIN(7, 5), GPIO_OUT_HIGH) /* H: CDP, L:SDP. Only one USB-A port, always CDP */ -GPIO(USB_A0_OC_ODL, PIN(D, 1), GPIO_ODR_HIGH) /* LEDs */ GPIO(EC_CHG_LED_Y_C0, PIN(C, 3), GPIO_OUT_LOW) diff --git a/board/trogdor/board.c b/board/trogdor/board.c index a17e961f60..9cf26f3e6a 100644 --- a/board/trogdor/board.c +++ b/board/trogdor/board.c @@ -31,6 +31,7 @@ #include "shi_chip.h" #include "switch.h" #include "task.h" +#include "usbc_ocp.h" #include "usbc_ppc.h" #define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ## args) @@ -40,6 +41,7 @@ static void tcpc_alert_event(enum gpio_signal signal); static void usb0_evt(enum gpio_signal signal); static void usb1_evt(enum gpio_signal signal); +static void usba_oc_interrupt(enum gpio_signal signal); static void ppc_interrupt(enum gpio_signal signal); static void board_connect_c0_sbu(enum gpio_signal s); @@ -74,6 +76,19 @@ static void usb1_evt(enum gpio_signal signal) task_set_event(TASK_ID_USB_CHG_P1, USB_CHG_EVENT_BC12, 0); } +static void usba_oc_deferred(void) +{ + /* Use next number after all USB-C ports to indicate the USB-A port */ + board_overcurrent_event(CONFIG_USB_PD_PORT_MAX_COUNT, + !gpio_get_level(GPIO_USB_A0_OC_ODL)); +} +DECLARE_DEFERRED(usba_oc_deferred); + +static void usba_oc_interrupt(enum gpio_signal signal) +{ + hook_call_deferred(&usba_oc_deferred_data, 0); +} + static void ppc_interrupt(enum gpio_signal signal) { switch (signal) { @@ -274,6 +289,9 @@ static void board_init(void) gpio_enable_interrupt(GPIO_USB_C0_BC12_INT_L); gpio_enable_interrupt(GPIO_USB_C1_BC12_INT_L); + /* Enable USB-A overcurrent interrupt */ + gpio_enable_interrupt(GPIO_USB_A0_OC_ODL); + /* Enable interrupt for BMI160 sensor */ gpio_enable_interrupt(GPIO_ACCEL_GYRO_INT_L); diff --git a/board/trogdor/gpio.inc b/board/trogdor/gpio.inc index 4d6ea0fcf2..8534e001f8 100644 --- a/board/trogdor/gpio.inc +++ b/board/trogdor/gpio.inc @@ -8,7 +8,7 @@ /* Declare symbolic names for all the GPIOs that we care about. * Note: Those with interrupt handlers must be declared first. */ -/* USB-C interrupts */ +/* USB interrupts */ GPIO_INT(USB_C0_PD_INT_ODL, PIN(E, 0), GPIO_INT_FALLING, tcpc_alert_event) /* Interrupt from port-0 TCPC */ GPIO_INT(USB_C1_PD_INT_ODL, PIN(F, 5), GPIO_INT_FALLING, tcpc_alert_event) /* Interrupt from port-1 TCPC */ GPIO_INT(USB_C0_SWCTL_INT_ODL, PIN(0, 3), GPIO_INT_FALLING, ppc_interrupt) /* Interrupt from port-0 PPC */ @@ -20,6 +20,8 @@ GPIO_INT(USB_C1_BC12_INT_L, PIN(8, 2), GPIO_INT_FALLING | GPIO_PULL_UP, usb1_ GPIO_INT(USB_C0_BC12_INT_L, PIN(6, 1), GPIO_INT_FALLING, usb0_evt) /* Interrupt from port-0 BC1.2 */ GPIO_INT(USB_C1_BC12_INT_L, PIN(8, 2), GPIO_INT_FALLING, usb1_evt) /* Interrupt from port-1 BC1.2 */ #endif /* BOARD_REV */ +GPIO_INT(USB_A0_OC_ODL, PIN(D, 1), GPIO_INT_BOTH | GPIO_PULL_UP, usba_oc_interrupt) + /* System interrupts */ GPIO_INT(ACOK_OD, PIN(0, 0), GPIO_INT_BOTH, extpower_interrupt) /* ACOK */ GPIO_INT(CCD_MODE_ODL, PIN(E, 3), GPIO_INT_FALLING, board_connect_c0_sbu) /* Case Closed Debug Mode */ @@ -89,7 +91,6 @@ GPIO(USB_C1_VBUS_DET_L, PIN(8, 3), GPIO_INPUT) /* Deprecated BC1.2 VBUS /* USB-A */ GPIO(EN_USB_A_5V, PIN(8, 6), GPIO_OUT_LOW) GPIO(USB_A_CDP_ILIM_EN_L, PIN(7, 5), GPIO_OUT_HIGH) /* H:CDP, L:SDP. Only one USB-A port, always CDP */ -GPIO(USB_A0_OC_ODL, PIN(D, 1), GPIO_ODR_HIGH) /* LEDs */ GPIO(EC_CHG_LED_Y_C0, PIN(C, 3), GPIO_OUT_LOW) |