aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi.c
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2014-12-09 19:46:56 +0000
committerMark Brown <broonie@kernel.org>2014-12-11 12:23:23 +0000
commit983aee5d7090cf12b624f18533777caa09d067b1 (patch)
tree1067f7f977d4771707a2c1a4f2f1e3af1d3dd93d /drivers/spi/spi.c
parentspi: Move queue data structure initialisation to main master init (diff)
downloadlinux-dev-983aee5d7090cf12b624f18533777caa09d067b1.tar.xz
linux-dev-983aee5d7090cf12b624f18533777caa09d067b1.zip
spi: Check to see if the device is processing a message before we idle
cur_msg is updated under the queue lock and holds the message we are currently processing. Since currently we only ever do removals in the pump kthread it doesn't matter in what order we do things but we want to be able to push things out from the submitting thread so pull the check to see if we're currently handling a message before we check to see if the queue is idle. Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/spi/spi.c')
-rw-r--r--drivers/spi/spi.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index b81ccdb1bc16..0bc752d17be5 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -891,8 +891,16 @@ static void spi_pump_messages(struct kthread_work *work)
bool was_busy = false;
int ret;
- /* Lock queue and check for queue work */
+ /* Lock queue */
spin_lock_irqsave(&master->queue_lock, flags);
+
+ /* Make sure we are not already running a message */
+ if (master->cur_msg) {
+ spin_unlock_irqrestore(&master->queue_lock, flags);
+ return;
+ }
+
+ /* Check if the queue is idle */
if (list_empty(&master->queue) || !master->running) {
if (!master->busy) {
spin_unlock_irqrestore(&master->queue_lock, flags);
@@ -916,11 +924,6 @@ static void spi_pump_messages(struct kthread_work *work)
return;
}
- /* Make sure we are not already running a message */
- if (master->cur_msg) {
- spin_unlock_irqrestore(&master->queue_lock, flags);
- return;
- }
/* Extract head of queue */
master->cur_msg =
list_first_entry(&master->queue, struct spi_message, queue);