diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2016-10-03 12:24:17 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-10-04 16:33:21 -0700 |
commit | 03857a3b350717d4b1c12d3aa61b51ea5e4cffcf (patch) | |
tree | 391254352285ec0e8d72b8b2caa288e35861dd3d /chip/npcx/spi.c | |
parent | 9cd10a5a47544af10b0a4620130eaedd9c66eb42 (diff) | |
download | chrome-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.c | 3 |
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; } |