diff options
| -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); |
