9
0
Fork 0

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>
This commit is contained in:
Jean-Christophe PLAGNIOL-VILLARD 2012-11-06 20:33:30 +01:00 committed by Sascha Hauer
parent d43b73ba83
commit b93dfd23c2
1 changed files with 48 additions and 39 deletions

View File

@ -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;