Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9b90e39 authored by Vernon Sauder's avatar Vernon Sauder Committed by Linus Torvalds
Browse files

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: default avatarVernon Sauder <Vernon.Sauder@gmail.com>
Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 62f9e8f1
Loading
Loading
Loading
Loading
+8 −14
Original line number Diff line number Diff line
@@ -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);