summaryrefslogtreecommitdiff
path: root/chip/npcx/spi.c
diff options
context:
space:
mode:
authorShawn Nematbakhsh <shawnn@chromium.org>2016-10-03 12:24:17 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-10-04 16:33:21 -0700
commit03857a3b350717d4b1c12d3aa61b51ea5e4cffcf (patch)
tree391254352285ec0e8d72b8b2caa288e35861dd3d /chip/npcx/spi.c
parent9cd10a5a47544af10b0a4620130eaedd9c66eb42 (diff)
downloadchrome-ec-03857a3b350717d4b1c12d3aa61b51ea5e4cffcf.tar.gz
spi: Add lock around spi_transaction
spi_transaction() can be called from motionsense, hooks, hostcmd, console, and chipset tasks, so add a mutex to ensure an in-process transaction isn't preempted by another transaction. BUG=chrome-os-partner:57912 BRANCH=gru TEST=On kevin, run "while true; do ectool motionsense odr 0 0; sleep 1; ectool motionsense odr 0 1000000; sleep 1; done", verify watchdog crash not encountered after 20 minutes. Change-Id: I7ec495bab295dc03ce02372c20e5c7c5c196715d Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/391892 Reviewed-by: Aseda Aboagye <aaboagye@chromium.org> (cherry picked from commit eabdea443775fab834aaabbb7afae871306c7530) Reviewed-on: https://chromium-review.googlesource.com/392226 Commit-Ready: Shawn N <shawnn@chromium.org> Tested-by: Shawn N <shawnn@chromium.org> Reviewed-by: Shawn N <shawnn@chromium.org>
Diffstat (limited to 'chip/npcx/spi.c')
-rw-r--r--chip/npcx/spi.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/chip/npcx/spi.c b/chip/npcx/spi.c
index 790f4c1e47..3079c05b1a 100644
--- a/chip/npcx/spi.c
+++ b/chip/npcx/spi.c
@@ -131,7 +131,9 @@ int spi_transaction(const struct spi_device_t *spi_device,
{
int i = 0;
enum gpio_signal gpio = spi_device->gpio_cs;
+ static struct mutex spi_lock;
+ mutex_lock(&spi_lock);
/* Make sure CS# is a GPIO output mode. */
gpio_set_flags(gpio, GPIO_OUTPUT);
/* Make sure CS# is deselected */
@@ -174,6 +176,7 @@ int spi_transaction(const struct spi_device_t *spi_device,
}
/* Deassert CS# (high) to end transaction */
gpio_set_level(gpio, 1);
+ mutex_unlock(&spi_lock);
return EC_SUCCESS;
}