Commit 9a7867e1 authored by Luotao Fu's avatar Luotao Fu Committed by Linus Torvalds

mpc52xx_psc_spi: fix block transfer

The block transfer routine in the mpc52xx psc spi driver misinterpret
the datasheet.  According to the processor datasheet the chipselect is
held as long as the EOF is not written.

Theoretically blocks of any sizes can be transferred in this way.  The
old routine however writes an EOF after every word, which has the size
of size_of_word.  This makes the transfer slow.

Also fixed some duplicate code.
Signed-off-by: default avatarLuotao Fu <l.fu@pengutronix.de>
Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Cc: <stable@kernel.org>		[2.6.25.x, 2.6.26.x]
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 78a34ae2
...@@ -148,7 +148,6 @@ static int mpc52xx_psc_spi_transfer_rxtx(struct spi_device *spi, ...@@ -148,7 +148,6 @@ static int mpc52xx_psc_spi_transfer_rxtx(struct spi_device *spi,
unsigned rfalarm; unsigned rfalarm;
unsigned send_at_once = MPC52xx_PSC_BUFSIZE; unsigned send_at_once = MPC52xx_PSC_BUFSIZE;
unsigned recv_at_once; unsigned recv_at_once;
unsigned bpw = mps->bits_per_word / 8;
if (!t->tx_buf && !t->rx_buf && t->len) if (!t->tx_buf && !t->rx_buf && t->len)
return -EINVAL; return -EINVAL;
...@@ -164,23 +163,16 @@ static int mpc52xx_psc_spi_transfer_rxtx(struct spi_device *spi, ...@@ -164,23 +163,16 @@ static int mpc52xx_psc_spi_transfer_rxtx(struct spi_device *spi,
} }
dev_dbg(&spi->dev, "send %d bytes...\n", send_at_once); dev_dbg(&spi->dev, "send %d bytes...\n", send_at_once);
if (tx_buf) {
for (; send_at_once; sb++, send_at_once--) { for (; send_at_once; sb++, send_at_once--) {
/* set EOF flag */ /* set EOF flag before the last word is sent */
if (mps->bits_per_word if (send_at_once == 1)
&& (sb + 1) % bpw == 0)
out_8(&psc->ircr2, 0x01); out_8(&psc->ircr2, 0x01);
if (tx_buf)
out_8(&psc->mpc52xx_psc_buffer_8, tx_buf[sb]); out_8(&psc->mpc52xx_psc_buffer_8, tx_buf[sb]);
} else
} else {
for (; send_at_once; sb++, send_at_once--) {
/* set EOF flag */
if (mps->bits_per_word
&& ((sb + 1) % bpw) == 0)
out_8(&psc->ircr2, 0x01);
out_8(&psc->mpc52xx_psc_buffer_8, 0); out_8(&psc->mpc52xx_psc_buffer_8, 0);
} }
}
/* enable interrupts and wait for wake up /* enable interrupts and wait for wake up
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment