|
@@ -658,7 +658,7 @@ int spi_write_then_read(struct spi_device *spi,
|
|
|
|
|
|
int status;
|
|
int status;
|
|
struct spi_message message;
|
|
struct spi_message message;
|
|
- struct spi_transfer x;
|
|
|
|
|
|
+ struct spi_transfer x[2];
|
|
u8 *local_buf;
|
|
u8 *local_buf;
|
|
|
|
|
|
/* Use preallocated DMA-safe buffer. We can't avoid copying here,
|
|
/* Use preallocated DMA-safe buffer. We can't avoid copying here,
|
|
@@ -669,9 +669,15 @@ int spi_write_then_read(struct spi_device *spi,
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
spi_message_init(&message);
|
|
spi_message_init(&message);
|
|
- memset(&x, 0, sizeof x);
|
|
|
|
- x.len = n_tx + n_rx;
|
|
|
|
- spi_message_add_tail(&x, &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);
|
|
|
|
+ }
|
|
|
|
|
|
/* ... unless someone else is using the pre-allocated buffer */
|
|
/* ... unless someone else is using the pre-allocated buffer */
|
|
if (!mutex_trylock(&lock)) {
|
|
if (!mutex_trylock(&lock)) {
|
|
@@ -682,15 +688,15 @@ int spi_write_then_read(struct spi_device *spi,
|
|
local_buf = buf;
|
|
local_buf = buf;
|
|
|
|
|
|
memcpy(local_buf, txbuf, n_tx);
|
|
memcpy(local_buf, txbuf, n_tx);
|
|
- x.tx_buf = local_buf;
|
|
|
|
- x.rx_buf = local_buf;
|
|
|
|
|
|
+ x[0].tx_buf = local_buf;
|
|
|
|
+ x[1].rx_buf = local_buf + n_tx;
|
|
|
|
|
|
/* do the i/o */
|
|
/* do the i/o */
|
|
status = spi_sync(spi, &message);
|
|
status = spi_sync(spi, &message);
|
|
if (status == 0)
|
|
if (status == 0)
|
|
- memcpy(rxbuf, x.rx_buf + n_tx, n_rx);
|
|
|
|
|
|
+ memcpy(rxbuf, x[1].rx_buf, n_rx);
|
|
|
|
|
|
- if (x.tx_buf == buf)
|
|
|
|
|
|
+ if (x[0].tx_buf == buf)
|
|
mutex_unlock(&lock);
|
|
mutex_unlock(&lock);
|
|
else
|
|
else
|
|
kfree(local_buf);
|
|
kfree(local_buf);
|