mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
spi: Provide per-message prepare and unprepare operations
Many SPI drivers perform setup and tear down on every message, usually doing things like DMA mapping the message. Provide hooks for them to use to provide such operations. This is of limited value for drivers that implement transfer_one_message() but will be of much greater utility with future factoring out of standard implementations of that function. Signed-off-by: Mark Brown <broonie@linaro.org>
This commit is contained in:
parent
31a2c46cd9
commit
2841a5fc37
2 changed files with 33 additions and 0 deletions
|
@ -606,6 +606,18 @@ static void spi_pump_messages(struct kthread_work *work)
|
|||
|
||||
trace_spi_message_start(master->cur_msg);
|
||||
|
||||
if (master->prepare_message) {
|
||||
ret = master->prepare_message(master, master->cur_msg);
|
||||
if (ret) {
|
||||
dev_err(&master->dev,
|
||||
"failed to prepare message: %d\n", ret);
|
||||
master->cur_msg->status = ret;
|
||||
spi_finalize_current_message(master);
|
||||
return;
|
||||
}
|
||||
master->cur_msg_prepared = true;
|
||||
}
|
||||
|
||||
ret = master->transfer_one_message(master, master->cur_msg);
|
||||
if (ret) {
|
||||
dev_err(&master->dev,
|
||||
|
@ -687,6 +699,7 @@ void spi_finalize_current_message(struct spi_master *master)
|
|||
{
|
||||
struct spi_message *mesg;
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(&master->queue_lock, flags);
|
||||
mesg = master->cur_msg;
|
||||
|
@ -695,6 +708,15 @@ void spi_finalize_current_message(struct spi_master *master)
|
|||
queue_kthread_work(&master->kworker, &master->pump_messages);
|
||||
spin_unlock_irqrestore(&master->queue_lock, flags);
|
||||
|
||||
if (master->cur_msg_prepared && master->unprepare_message) {
|
||||
ret = master->unprepare_message(master, mesg);
|
||||
if (ret) {
|
||||
dev_err(&master->dev,
|
||||
"failed to unprepare message: %d\n", ret);
|
||||
}
|
||||
}
|
||||
master->cur_msg_prepared = false;
|
||||
|
||||
mesg->state = NULL;
|
||||
if (mesg->complete)
|
||||
mesg->complete(mesg->context);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue