aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/spi
diff options
context:
space:
mode:
authorDavid Jander <david@protonic.nl>2022-06-21 08:12:33 +0200
committerMark Brown <broonie@kernel.org>2022-06-27 13:27:25 +0100
commit69fa95905d40846756d22402690ddf5361a9d13b (patch)
tree08eb639a0785fd1564e05e2664532164917d2f28 /include/linux/spi
parentspi: Set ctlr->cur_msg also in the sync transfer case (diff)
downloadlinux-dev-69fa95905d40846756d22402690ddf5361a9d13b.tar.xz
linux-dev-69fa95905d40846756d22402690ddf5361a9d13b.zip
spi: Ensure the io_mutex is held until spi_finalize_current_message()
This patch introduces a completion that is completed in spi_finalize_current_message() and waited for in __spi_pump_transfer_message(). This way all manipulation of ctlr->cur_msg is done with the io_mutex held and strictly ordered: __spi_pump_transfer_message() will not return until spi_finalize_current_message() is done using ctlr->cur_msg, and its calling context is only touching ctlr->cur_msg after returning. Due to this, we can safely drop the spin-locks around ctlr->cur_msg. Signed-off-by: David Jander <david@protonic.nl> Link: https://lore.kernel.org/r/20220621061234.3626638-11-david@protonic.nl Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'include/linux/spi')
-rw-r--r--include/linux/spi/spi.h6
1 files changed, 2 insertions, 4 deletions
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
index c58f46be762f..c56e0d240a58 100644
--- a/include/linux/spi/spi.h
+++ b/include/linux/spi/spi.h
@@ -384,6 +384,7 @@ extern struct spi_device *spi_new_ancillary_device(struct spi_device *spi, u8 ch
* @queue_lock: spinlock to syncronise access to message queue
* @queue: message queue
* @cur_msg: the currently in-flight message
+ * @cur_msg_completion: a completion for the current in-flight message
* @cur_msg_mapped: message has been mapped for DMA
* @last_cs: the last chip_select that is recorded by set_cs, -1 on non chip
* selected
@@ -615,6 +616,7 @@ struct spi_controller {
spinlock_t queue_lock;
struct list_head queue;
struct spi_message *cur_msg;
+ struct completion cur_msg_completion;
bool busy;
bool running;
bool rt;
@@ -989,7 +991,6 @@ struct spi_transfer {
* @state: for use by whichever driver currently owns the message
* @resources: for resource management when the spi message is processed
* @prepared: spi_prepare_message was called for the this message
- * @sync: this message took the direct sync path skipping the async queue
*
* A @spi_message is used to execute an atomic sequence of data transfers,
* each represented by a struct spi_transfer. The sequence is "atomic"
@@ -1042,9 +1043,6 @@ struct spi_message {
/* spi_prepare_message was called for this message */
bool prepared;
-
- /* this message is skipping the async queue */
- bool sync;
};
static inline void spi_message_init_no_memset(struct spi_message *m)