lkml.org 
[lkml]   [2008]   [Jul]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 55/62] mpc52xx_psc_spi: fix block transfer
    2.6.26 -stable review patch.  If anyone has any objections, please let
    us know.

    ------------------
    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);
    - }
    }


    --


    \
     
     \ /
      Last update: 2008-07-31 02:29    [W:0.023 / U:121.032 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site