aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2013-10-04 19:23:12 -0400
committerNitin Garg <nitin.garg@freescale.com>2014-04-16 09:05:55 -0400
commitde6a76d78ecf38eb77079e303c2c1b842737bd96 (patch)
treeadf3126adc01130b23c2b655ca9a41ea03b1c260 /drivers
parent7cc6a7af5d75f91c36125a93eecfd3d660585f70 (diff)
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> Signed-off-by: Huang Shijie <b32955@freescale.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/spi/spi.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 4a25ae1bc747..7efea5157880 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -620,6 +620,18 @@ static void spi_pump_messages(struct kthread_work *work)
620 620
621 trace_spi_message_start(master->cur_msg); 621 trace_spi_message_start(master->cur_msg);
622 622
623 if (master->prepare_message) {
624 ret = master->prepare_message(master, master->cur_msg);
625 if (ret) {
626 dev_err(&master->dev,
627 "failed to prepare message: %d\n", ret);
628 master->cur_msg->status = ret;
629 spi_finalize_current_message(master);
630 return;
631 }
632 master->cur_msg_prepared = true;
633 }
634
623 ret = master->transfer_one_message(master, master->cur_msg); 635 ret = master->transfer_one_message(master, master->cur_msg);
624 if (ret) { 636 if (ret) {
625 dev_err(&master->dev, 637 dev_err(&master->dev,
@@ -703,6 +715,7 @@ void spi_finalize_current_message(struct spi_master *master)
703{ 715{
704 struct spi_message *mesg; 716 struct spi_message *mesg;
705 unsigned long flags; 717 unsigned long flags;
718 int ret;
706 719
707 spin_lock_irqsave(&master->queue_lock, flags); 720 spin_lock_irqsave(&master->queue_lock, flags);
708 mesg = master->cur_msg; 721 mesg = master->cur_msg;
@@ -711,6 +724,15 @@ void spi_finalize_current_message(struct spi_master *master)
711 queue_kthread_work(&master->kworker, &master->pump_messages); 724 queue_kthread_work(&master->kworker, &master->pump_messages);
712 spin_unlock_irqrestore(&master->queue_lock, flags); 725 spin_unlock_irqrestore(&master->queue_lock, flags);
713 726
727 if (master->cur_msg_prepared && master->unprepare_message) {
728 ret = master->unprepare_message(master, mesg);
729 if (ret) {
730 dev_err(&master->dev,
731 "failed to unprepare message: %d\n", ret);
732 }
733 }
734 master->cur_msg_prepared = false;
735
714 mesg->state = NULL; 736 mesg->state = NULL;
715 if (mesg->complete) 737 if (mesg->complete)
716 mesg->complete(mesg->context); 738 mesg->complete(mesg->context);