diff options
author | Mark Brown <broonie@kernel.org> | 2015-06-17 19:19:45 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-06-17 19:19:45 -0400 |
commit | 8757091bfa92579527ad2e7b22b22c7def0139ce (patch) | |
tree | cb5379731b233fc125b1f31117a0ed75d0ad2466 | |
parent | 0f57d86787d8b1076ea8f9cbdddda2a46d534a27 (diff) | |
parent | 4b786458ed99eae9e9d9984a1624a79e9bf6cebb (diff) |
Merge remote-tracking branch 'spi/fix/core' into spi-linus
-rw-r--r-- | drivers/spi/spi.c | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 50910d85df5a..cf8b91b23a76 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c | |||
@@ -571,7 +571,7 @@ static int __spi_map_msg(struct spi_master *master, struct spi_message *msg) | |||
571 | return 0; | 571 | return 0; |
572 | } | 572 | } |
573 | 573 | ||
574 | static int spi_unmap_msg(struct spi_master *master, struct spi_message *msg) | 574 | static int __spi_unmap_msg(struct spi_master *master, struct spi_message *msg) |
575 | { | 575 | { |
576 | struct spi_transfer *xfer; | 576 | struct spi_transfer *xfer; |
577 | struct device *tx_dev, *rx_dev; | 577 | struct device *tx_dev, *rx_dev; |
@@ -583,15 +583,6 @@ static int spi_unmap_msg(struct spi_master *master, struct spi_message *msg) | |||
583 | rx_dev = master->dma_rx->device->dev; | 583 | rx_dev = master->dma_rx->device->dev; |
584 | 584 | ||
585 | list_for_each_entry(xfer, &msg->transfers, transfer_list) { | 585 | list_for_each_entry(xfer, &msg->transfers, transfer_list) { |
586 | /* | ||
587 | * Restore the original value of tx_buf or rx_buf if they are | ||
588 | * NULL. | ||
589 | */ | ||
590 | if (xfer->tx_buf == master->dummy_tx) | ||
591 | xfer->tx_buf = NULL; | ||
592 | if (xfer->rx_buf == master->dummy_rx) | ||
593 | xfer->rx_buf = NULL; | ||
594 | |||
595 | if (!master->can_dma(master, msg->spi, xfer)) | 586 | if (!master->can_dma(master, msg->spi, xfer)) |
596 | continue; | 587 | continue; |
597 | 588 | ||
@@ -608,13 +599,32 @@ static inline int __spi_map_msg(struct spi_master *master, | |||
608 | return 0; | 599 | return 0; |
609 | } | 600 | } |
610 | 601 | ||
611 | static inline int spi_unmap_msg(struct spi_master *master, | 602 | static inline int __spi_unmap_msg(struct spi_master *master, |
612 | struct spi_message *msg) | 603 | struct spi_message *msg) |
613 | { | 604 | { |
614 | return 0; | 605 | return 0; |
615 | } | 606 | } |
616 | #endif /* !CONFIG_HAS_DMA */ | 607 | #endif /* !CONFIG_HAS_DMA */ |
617 | 608 | ||
609 | static inline int spi_unmap_msg(struct spi_master *master, | ||
610 | struct spi_message *msg) | ||
611 | { | ||
612 | struct spi_transfer *xfer; | ||
613 | |||
614 | list_for_each_entry(xfer, &msg->transfers, transfer_list) { | ||
615 | /* | ||
616 | * Restore the original value of tx_buf or rx_buf if they are | ||
617 | * NULL. | ||
618 | */ | ||
619 | if (xfer->tx_buf == master->dummy_tx) | ||
620 | xfer->tx_buf = NULL; | ||
621 | if (xfer->rx_buf == master->dummy_rx) | ||
622 | xfer->rx_buf = NULL; | ||
623 | } | ||
624 | |||
625 | return __spi_unmap_msg(master, msg); | ||
626 | } | ||
627 | |||
618 | static int spi_map_msg(struct spi_master *master, struct spi_message *msg) | 628 | static int spi_map_msg(struct spi_master *master, struct spi_message *msg) |
619 | { | 629 | { |
620 | struct spi_transfer *xfer; | 630 | struct spi_transfer *xfer; |
@@ -988,9 +998,6 @@ void spi_finalize_current_message(struct spi_master *master) | |||
988 | 998 | ||
989 | spin_lock_irqsave(&master->queue_lock, flags); | 999 | spin_lock_irqsave(&master->queue_lock, flags); |
990 | mesg = master->cur_msg; | 1000 | mesg = master->cur_msg; |
991 | master->cur_msg = NULL; | ||
992 | |||
993 | queue_kthread_work(&master->kworker, &master->pump_messages); | ||
994 | spin_unlock_irqrestore(&master->queue_lock, flags); | 1001 | spin_unlock_irqrestore(&master->queue_lock, flags); |
995 | 1002 | ||
996 | spi_unmap_msg(master, mesg); | 1003 | spi_unmap_msg(master, mesg); |
@@ -1003,9 +1010,13 @@ void spi_finalize_current_message(struct spi_master *master) | |||
1003 | } | 1010 | } |
1004 | } | 1011 | } |
1005 | 1012 | ||
1006 | trace_spi_message_done(mesg); | 1013 | spin_lock_irqsave(&master->queue_lock, flags); |
1007 | 1014 | master->cur_msg = NULL; | |
1008 | master->cur_msg_prepared = false; | 1015 | master->cur_msg_prepared = false; |
1016 | queue_kthread_work(&master->kworker, &master->pump_messages); | ||
1017 | spin_unlock_irqrestore(&master->queue_lock, flags); | ||
1018 | |||
1019 | trace_spi_message_done(mesg); | ||
1009 | 1020 | ||
1010 | mesg->state = NULL; | 1021 | mesg->state = NULL; |
1011 | if (mesg->complete) | 1022 | if (mesg->complete) |