From: Marc Pignat Simplify spi_sync calling convention, eliminating the need to check both the return value AND the message->status. In consequence, this corrects misbehaviours of spi_read and spi_write (which only checked the former) and their callers. Signed-off-by: Marc Pignat Signed-off-by: David Brownell Signed-off-by: Andrew Morton --- drivers/spi/spi.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff -puN drivers/spi/spi.c~spi-simplify-spi_sync-calling-convention drivers/spi/spi.c --- a/drivers/spi/spi.c~spi-simplify-spi_sync-calling-convention +++ a/drivers/spi/spi.c @@ -540,10 +540,7 @@ static void spi_complete(void *arg) * Also, the caller is guaranteeing that the memory associated with the * message will not be freed before this call returns. * - * The return value is a negative error code if the message could not be - * submitted, else zero. When the value is zero, then message->status is - * also defined; it's the completion code for the transfer, either zero - * or a negative error code from the controller driver. + * It returns zero on success, else a negative error code. */ int spi_sync(struct spi_device *spi, struct spi_message *message) { @@ -553,8 +550,10 @@ int spi_sync(struct spi_device *spi, str message->complete = spi_complete; message->context = &done; status = spi_async(spi, message); - if (status == 0) + if (status == 0) { wait_for_completion(&done); + status = message->status; + } message->context = NULL; return status; } @@ -627,10 +626,8 @@ int spi_write_then_read(struct spi_devic /* do the i/o */ status = spi_sync(spi, &message); - if (status == 0) { + if (status == 0) memcpy(rxbuf, x[1].rx_buf, n_rx); - status = message.status; - } if (x[0].tx_buf == buf) mutex_unlock(&lock); _