diff options
Diffstat (limited to 'drivers/spi/spi.c')
-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 ca935df80c88..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); |