aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/spi/spi.c')
-rw-r--r--drivers/spi/spi.c45
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);