summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiana Z <dzigterman@chromium.org>2023-02-21 15:06:22 -0700
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2023-02-22 17:24:08 +0000
commita892f6d05eccd0995ac9ba76d44b3d4605641ceb (patch)
treeae1bc1fc9150618271a6fa7585e2a334f8e6a11b
parent70b7992a9d012c29c1e8e420afe3cda52a6c302f (diff)
downloadchrome-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.c12
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)