diff options
author | Diana Z <dzigterman@chromium.org> | 2023-02-21 15:06:22 -0700 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2023-02-22 17:24:08 +0000 |
commit | a892f6d05eccd0995ac9ba76d44b3d4605641ceb (patch) | |
tree | ae1bc1fc9150618271a6fa7585e2a334f8e6a11b | |
parent | 70b7992a9d012c29c1e8e420afe3cda52a6c302f (diff) | |
download | chrome-ec-a892f6d05eccd0995ac9ba76d44b3d4605641ceb.tar.gz |
Skyrim: Remove i2c transactions from interrupt context
Calls to retrieve the status of GPIOs on the I/O expander require
running i2c commands, which should not be run from the interrupt
context. Instead, use a deferred call to schedule these to be
processed.
BRANCH=None
BUG=b:268491130
TEST=on frostflow, ensure overcurrent tool no longer causes a watchdog
reset
Change-Id: Ia7e3bd673ddc5a995cb846a0807cfaebcd43d36b
Signed-off-by: Diana Z <dzigterman@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4277882
Tested-by: SamSP Liu <samsp_liu2@compal.corp-partner.google.com>
Reviewed-by: Robert Zieba <robertzieba@google.com>
-rw-r--r-- | zephyr/program/skyrim/src/usbc_config.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/zephyr/program/skyrim/src/usbc_config.c b/zephyr/program/skyrim/src/usbc_config.c index e2983b2307..f3502ca8ea 100644 --- a/zephyr/program/skyrim/src/usbc_config.c +++ b/zephyr/program/skyrim/src/usbc_config.c @@ -197,17 +197,25 @@ void sbu_fault_interrupt(enum gpio_signal signal) pd_handle_overcurrent(port); } -void usb_fault_interrupt(enum gpio_signal signal) +static void usb_fault_alert(void) { int out; - CPRINTSUSB("USB fault(%d), alerting the SoC", signal); out = gpio_pin_get_dt( GPIO_DT_FROM_NODELABEL(gpio_usb_hub_fault_q_odl)) && gpio_pin_get_dt(GPIO_DT_FROM_NODELABEL(ioex_usb_a0_fault_odl)) && gpio_pin_get_dt(GPIO_DT_FROM_NODELABEL(ioex_usb_a1_fault_db_odl)); gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(gpio_usb_fault_odl), out); + + if (out == 0) + CPRINTSUSB("USB fault, alerting the SoC"); +} +DECLARE_DEFERRED(usb_fault_alert); + +void usb_fault_interrupt(enum gpio_signal signal) +{ + hook_call_deferred(&usb_fault_alert_data, 0); } void usb_pd_soc_interrupt(enum gpio_signal signal) |