diff options
author | Mark Brown <broonie@kernel.org> | 2014-10-20 12:55:07 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2014-10-20 13:27:32 -0400 |
commit | b7a40242c82cd73cfcea305f23e67d068dd8401a (patch) | |
tree | 251b49d19cd7c371847ae1f951e1b537ca0e1c15 /drivers/spi/spi.c | |
parent | d26833bfce5e56017bea9f1f50838f20e18e7b7e (diff) | |
parent | 9c6de47d53a3ce8df1642ae67823688eb98a190a (diff) |
Merge branch 'fix/dw' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi into spi-dw
Conflicts:
drivers/spi/spi-dw-mid.c
Diffstat (limited to 'drivers/spi/spi.c')
-rw-r--r-- | drivers/spi/spi.c | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index e0531baf2782..e19512ffc40e 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c | |||
@@ -552,6 +552,9 @@ int spi_register_board_info(struct spi_board_info const *info, unsigned n) | |||
552 | struct boardinfo *bi; | 552 | struct boardinfo *bi; |
553 | int i; | 553 | int i; |
554 | 554 | ||
555 | if (!n) | ||
556 | return -EINVAL; | ||
557 | |||
555 | bi = kzalloc(n * sizeof(*bi), GFP_KERNEL); | 558 | bi = kzalloc(n * sizeof(*bi), GFP_KERNEL); |
556 | if (!bi) | 559 | if (!bi) |
557 | return -ENOMEM; | 560 | return -ENOMEM; |
@@ -789,27 +792,35 @@ static int spi_transfer_one_message(struct spi_master *master, | |||
789 | list_for_each_entry(xfer, &msg->transfers, transfer_list) { | 792 | list_for_each_entry(xfer, &msg->transfers, transfer_list) { |
790 | trace_spi_transfer_start(msg, xfer); | 793 | trace_spi_transfer_start(msg, xfer); |
791 | 794 | ||
792 | reinit_completion(&master->xfer_completion); | 795 | if (xfer->tx_buf || xfer->rx_buf) { |
796 | reinit_completion(&master->xfer_completion); | ||
793 | 797 | ||
794 | ret = master->transfer_one(master, msg->spi, xfer); | 798 | ret = master->transfer_one(master, msg->spi, xfer); |
795 | if (ret < 0) { | 799 | if (ret < 0) { |
796 | dev_err(&msg->spi->dev, | 800 | dev_err(&msg->spi->dev, |
797 | "SPI transfer failed: %d\n", ret); | 801 | "SPI transfer failed: %d\n", ret); |
798 | goto out; | 802 | goto out; |
799 | } | 803 | } |
800 | 804 | ||
801 | if (ret > 0) { | 805 | if (ret > 0) { |
802 | ret = 0; | 806 | ret = 0; |
803 | ms = xfer->len * 8 * 1000 / xfer->speed_hz; | 807 | ms = xfer->len * 8 * 1000 / xfer->speed_hz; |
804 | ms += ms + 100; /* some tolerance */ | 808 | ms += ms + 100; /* some tolerance */ |
805 | 809 | ||
806 | ms = wait_for_completion_timeout(&master->xfer_completion, | 810 | ms = wait_for_completion_timeout(&master->xfer_completion, |
807 | msecs_to_jiffies(ms)); | 811 | msecs_to_jiffies(ms)); |
808 | } | 812 | } |
809 | 813 | ||
810 | if (ms == 0) { | 814 | if (ms == 0) { |
811 | dev_err(&msg->spi->dev, "SPI transfer timed out\n"); | 815 | dev_err(&msg->spi->dev, |
812 | msg->status = -ETIMEDOUT; | 816 | "SPI transfer timed out\n"); |
817 | msg->status = -ETIMEDOUT; | ||
818 | } | ||
819 | } else { | ||
820 | if (xfer->len) | ||
821 | dev_err(&msg->spi->dev, | ||
822 | "Bufferless transfer has length %u\n", | ||
823 | xfer->len); | ||
813 | } | 824 | } |
814 | 825 | ||
815 | trace_spi_transfer_stop(msg, xfer); | 826 | trace_spi_transfer_stop(msg, xfer); |
@@ -848,6 +859,7 @@ out: | |||
848 | 859 | ||
849 | /** | 860 | /** |
850 | * spi_finalize_current_transfer - report completion of a transfer | 861 | * spi_finalize_current_transfer - report completion of a transfer |
862 | * @master: the master reporting completion | ||
851 | * | 863 | * |
852 | * Called by SPI drivers using the core transfer_one_message() | 864 | * Called by SPI drivers using the core transfer_one_message() |
853 | * implementation to notify it that the current interrupt driven | 865 | * implementation to notify it that the current interrupt driven |