spi: sh-msiof: Refactor sh_msiof_transfer_one()
- Move buffer pointer and length setup to the top, - Make unsigned values unsigned, - Loop over words and increment pointers instead of recalculating them, which allows to kill bytes_done. Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> Signed-off-by: Mark Brown <broonie@linaro.org>
This commit is contained in:
Родитель
75b82e23a4
Коммит
0312d59130
|
@ -616,16 +616,17 @@ static int sh_msiof_transfer_one(struct spi_master *master,
|
|||
struct sh_msiof_spi_priv *p = spi_master_get_devdata(master);
|
||||
void (*tx_fifo)(struct sh_msiof_spi_priv *, const void *, int, int);
|
||||
void (*rx_fifo)(struct sh_msiof_spi_priv *, void *, int, int);
|
||||
int bits;
|
||||
int bytes_per_word;
|
||||
int bytes_done;
|
||||
int words;
|
||||
const void *tx_buf = t->tx_buf;
|
||||
void *rx_buf = t->rx_buf;
|
||||
unsigned int len = t->len;
|
||||
unsigned int bits = t->bits_per_word;
|
||||
unsigned int bytes_per_word;
|
||||
unsigned int words;
|
||||
int n;
|
||||
bool swab;
|
||||
|
||||
bits = t->bits_per_word;
|
||||
|
||||
if (bits <= 8 && t->len > 15 && !(t->len & 3)) {
|
||||
if (bits <= 8 && len > 15 && !(len & 3)) {
|
||||
bits = 32;
|
||||
swab = true;
|
||||
} else {
|
||||
|
@ -639,34 +640,34 @@ static int sh_msiof_transfer_one(struct spi_master *master,
|
|||
rx_fifo = sh_msiof_spi_read_fifo_8;
|
||||
} else if (bits <= 16) {
|
||||
bytes_per_word = 2;
|
||||
if ((unsigned long)t->tx_buf & 0x01)
|
||||
if ((unsigned long)tx_buf & 0x01)
|
||||
tx_fifo = sh_msiof_spi_write_fifo_16u;
|
||||
else
|
||||
tx_fifo = sh_msiof_spi_write_fifo_16;
|
||||
|
||||
if ((unsigned long)t->rx_buf & 0x01)
|
||||
if ((unsigned long)rx_buf & 0x01)
|
||||
rx_fifo = sh_msiof_spi_read_fifo_16u;
|
||||
else
|
||||
rx_fifo = sh_msiof_spi_read_fifo_16;
|
||||
} else if (swab) {
|
||||
bytes_per_word = 4;
|
||||
if ((unsigned long)t->tx_buf & 0x03)
|
||||
if ((unsigned long)tx_buf & 0x03)
|
||||
tx_fifo = sh_msiof_spi_write_fifo_s32u;
|
||||
else
|
||||
tx_fifo = sh_msiof_spi_write_fifo_s32;
|
||||
|
||||
if ((unsigned long)t->rx_buf & 0x03)
|
||||
if ((unsigned long)rx_buf & 0x03)
|
||||
rx_fifo = sh_msiof_spi_read_fifo_s32u;
|
||||
else
|
||||
rx_fifo = sh_msiof_spi_read_fifo_s32;
|
||||
} else {
|
||||
bytes_per_word = 4;
|
||||
if ((unsigned long)t->tx_buf & 0x03)
|
||||
if ((unsigned long)tx_buf & 0x03)
|
||||
tx_fifo = sh_msiof_spi_write_fifo_32u;
|
||||
else
|
||||
tx_fifo = sh_msiof_spi_write_fifo_32;
|
||||
|
||||
if ((unsigned long)t->rx_buf & 0x03)
|
||||
if ((unsigned long)rx_buf & 0x03)
|
||||
rx_fifo = sh_msiof_spi_read_fifo_32u;
|
||||
else
|
||||
rx_fifo = sh_msiof_spi_read_fifo_32;
|
||||
|
@ -676,20 +677,18 @@ static int sh_msiof_transfer_one(struct spi_master *master,
|
|||
sh_msiof_spi_set_clk_regs(p, clk_get_rate(p->clk), t->speed_hz);
|
||||
|
||||
/* transfer in fifo sized chunks */
|
||||
words = t->len / bytes_per_word;
|
||||
bytes_done = 0;
|
||||
words = len / bytes_per_word;
|
||||
|
||||
while (bytes_done < t->len) {
|
||||
void *rx_buf = t->rx_buf ? t->rx_buf + bytes_done : NULL;
|
||||
const void *tx_buf = t->tx_buf ? t->tx_buf + bytes_done : NULL;
|
||||
n = sh_msiof_spi_txrx_once(p, tx_fifo, rx_fifo,
|
||||
tx_buf,
|
||||
rx_buf,
|
||||
while (words > 0) {
|
||||
n = sh_msiof_spi_txrx_once(p, tx_fifo, rx_fifo, tx_buf, rx_buf,
|
||||
words, bits);
|
||||
if (n < 0)
|
||||
return n;
|
||||
|
||||
bytes_done += n * bytes_per_word;
|
||||
if (tx_buf)
|
||||
tx_buf += n * bytes_per_word;
|
||||
if (rx_buf)
|
||||
rx_buf += n * bytes_per_word;
|
||||
words -= n;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче