| From jejb@kernel.org Wed Jul 30 14:11:31 2008 |
| From: Luotao Fu <l.fu@pengutronix.de> |
| Date: Tue, 29 Jul 2008 02:50:14 GMT |
| Subject: mpc52xx_psc_spi: fix block transfer |
| To: jejb@kernel.org, stable@kernel.org |
| Message-ID: <200807290250.m6T2oEGC016751@hera.kernel.org> |
| |
| From: Luotao Fu <l.fu@pengutronix.de> |
| |
| commit 9a7867e1b34c3575e7e76a05c0c54c6edbdae2a4 upstream |
| |
| 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: Luotao Fu <l.fu@pengutronix.de> |
| Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/spi/mpc52xx_psc_spi.c | 22 +++++++--------------- |
| 1 file changed, 7 insertions(+), 15 deletions(-) |
| |
| --- a/drivers/spi/mpc52xx_psc_spi.c |
| +++ b/drivers/spi/mpc52xx_psc_spi.c |
| @@ -148,7 +148,6 @@ static int mpc52xx_psc_spi_transfer_rxtx |
| unsigned rfalarm; |
| unsigned send_at_once = MPC52xx_PSC_BUFSIZE; |
| unsigned recv_at_once; |
| - unsigned bpw = mps->bits_per_word / 8; |
| |
| if (!t->tx_buf && !t->rx_buf && t->len) |
| return -EINVAL; |
| @@ -164,22 +163,15 @@ static int mpc52xx_psc_spi_transfer_rxtx |
| } |
| |
| dev_dbg(&spi->dev, "send %d bytes...\n", send_at_once); |
| - if (tx_buf) { |
| - 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); |
| + for (; send_at_once; sb++, send_at_once--) { |
| + /* set EOF flag before the last word is sent */ |
| + if (send_at_once == 1) |
| + out_8(&psc->ircr2, 0x01); |
| + |
| + if (tx_buf) |
| out_8(&psc->mpc52xx_psc_buffer_8, tx_buf[sb]); |
| - } |
| - } 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); |
| + else |
| out_8(&psc->mpc52xx_psc_buffer_8, 0); |
| - } |
| } |
| |
| |