aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVernon Sauder <vernoninhand@gmail.com>2008-10-15 22:02:40 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2008-10-16 11:21:38 -0700
commitf9b90e39cbc5c4d6ef60022fd1f25d541df0aad1 (patch)
treeaf043fc4e24a12447c7312ef9b246f24d619f6f7
parent62f9e8f15a95822e0a793090ff69b277690c6aa6 (diff)
spi: simplify spi_write_then_read()
Modify spi_write_then_read() to use one transfer. This speeds up all callers, and is a minor code shrink. Signed-off-by: Vernon Sauder <Vernon.Sauder@gmail.com> Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/spi/spi.c22
1 files changed, 8 insertions, 14 deletions
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 75e86865234..2de6b0e72f3 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -660,7 +660,7 @@ int spi_write_then_read(struct spi_device *spi,
int status;
struct spi_message message;
- struct spi_transfer x[2];
+ struct spi_transfer x;
u8 *local_buf;
/* Use preallocated DMA-safe buffer. We can't avoid copying here,
@@ -671,15 +671,9 @@ int spi_write_then_read(struct spi_device *spi,
return -EINVAL;
spi_message_init(&message);
- memset(x, 0, sizeof x);
- if (n_tx) {
- x[0].len = n_tx;
- spi_message_add_tail(&x[0], &message);
- }
- if (n_rx) {
- x[1].len = n_rx;
- spi_message_add_tail(&x[1], &message);
- }
+ memset(&x, 0, sizeof x);
+ x.len = n_tx + n_rx;
+ spi_message_add_tail(&x, &message);
/* ... unless someone else is using the pre-allocated buffer */
if (!mutex_trylock(&lock)) {
@@ -690,15 +684,15 @@ int spi_write_then_read(struct spi_device *spi,
local_buf = buf;
memcpy(local_buf, txbuf, n_tx);
- x[0].tx_buf = local_buf;
- x[1].rx_buf = local_buf + n_tx;
+ x.tx_buf = local_buf;
+ x.rx_buf = local_buf;
/* do the i/o */
status = spi_sync(spi, &message);
if (status == 0)
- memcpy(rxbuf, x[1].rx_buf, n_rx);
+ memcpy(rxbuf, x.rx_buf + n_tx, n_rx);
- if (x[0].tx_buf == buf)
+ if (x.tx_buf == buf)
mutex_unlock(&lock);
else
kfree(local_buf);