summaryrefslogtreecommitdiffstats
path: root/drivers/spi/atmel_spi.c
diff options
context:
space:
mode:
authorJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>2012-11-06 20:33:30 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2012-11-12 08:35:18 +0100
commitb93dfd23c2449d3b4c886d3f5d51a53aa6a906b4 (patch)
treea15af1c6e5de820da1dd264eacc614b413fc3abd /drivers/spi/atmel_spi.c
parentd43b73ba83e6dee8fad27077531788744b0bcf5b (diff)
downloadbarebox-b93dfd23c2449d3b4c886d3f5d51a53aa6a906b4.tar.gz
barebox-b93dfd23c2449d3b4c886d3f5d51a53aa6a906b4.tar.xz
atmel_spi: split transfer to atmel_spi_do_xfer
This makes the code mre readable Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/spi/atmel_spi.c')
-rw-r--r--drivers/spi/atmel_spi.c89
1 files changed, 49 insertions, 40 deletions
diff --git a/drivers/spi/atmel_spi.c b/drivers/spi/atmel_spi.c
index 3375f815c0..afbca9fb1b 100644
--- a/drivers/spi/atmel_spi.c
+++ b/drivers/spi/atmel_spi.c
@@ -178,13 +178,54 @@ static int atmel_spi_xchg(struct atmel_spi *as, u32 tx_val)
return spi_readl(as, RDR) & 0xffff;
}
+static int atmel_spi_do_xfer(struct spi_device *spi, struct atmel_spi *as,
+ struct spi_transfer *t)
+{
+ unsigned int bits = spi->bits_per_word;
+ u32 tx_val;
+ int i = 0, rx_val;
+
+ if (bits <= 8) {
+ const u8 *txbuf = t->tx_buf;
+ u8 *rxbuf = t->rx_buf;
+
+ while (i < t->len) {
+ tx_val = txbuf ? txbuf[i] : 0;
+
+ rx_val = atmel_spi_xchg(as, tx_val);
+ if (rx_val < 0)
+ return rx_val;
+
+ if (rxbuf)
+ rxbuf[i] = rx_val;
+ i++;
+ }
+ } else if (bits <= 16) {
+ const u16 *txbuf = t->tx_buf;
+ u16 *rxbuf = t->rx_buf;
+
+ while (i < t->len >> 1) {
+ tx_val = txbuf ? txbuf[i] : 0;
+
+ rx_val = atmel_spi_xchg(as, tx_val);
+ if (rx_val < 0)
+ return rx_val;
+
+ if (rxbuf)
+ rxbuf[i] = rx_val;
+ i++;
+ }
+ }
+
+ return t->len;
+}
+
static int atmel_spi_transfer(struct spi_device *spi, struct spi_message *mesg)
{
int ret;
struct spi_master *master = spi->master;
struct atmel_spi *as = to_atmel_spi(master);
struct spi_transfer *t = NULL;
- unsigned int bits = spi->bits_per_word;
mesg->actual_length = 0;
ret = master->setup(spi);
@@ -203,47 +244,15 @@ static int atmel_spi_transfer(struct spi_device *spi, struct spi_message *mesg)
}
#endif
atmel_spi_chipselect(spi, as, 1);
+
list_for_each_entry(t, &mesg->transfers, transfer_list) {
- u32 tx_val;
- int i = 0, rx_val;
-
- mesg->actual_length += t->len;
- if (bits <= 8) {
- const u8 *txbuf = t->tx_buf;
- u8 *rxbuf = t->rx_buf;
-
- while (i < t->len) {
- tx_val = txbuf ? txbuf[i] : 0;
-
- rx_val = atmel_spi_xchg(as, tx_val);
- if (rx_val < 0) {
- ret = rx_val;
- goto out;
- }
-
- if (rxbuf)
- rxbuf[i] = rx_val;
- i++;
- }
- } else if (bits <= 16) {
- const u16 *txbuf = t->tx_buf;
- u16 *rxbuf = t->rx_buf;
-
- while (i < t->len >> 1) {
- tx_val = txbuf ? txbuf[i] : 0;
-
- rx_val = atmel_spi_xchg(as, tx_val);
- if (rx_val < 0) {
- ret = rx_val;
- goto out;
- }
-
- if (rxbuf)
- rxbuf[i] = rx_val;
- i++;
- }
- }
+
+ ret = atmel_spi_do_xfer(spi, as, t);
+ if (ret < 0)
+ goto out;
+ mesg->actual_length += ret;
}
+
out:
atmel_spi_chipselect(spi, as, 0);
return ret;