* Ilkka Koskinen <ilkka.koski...@nokia.com> [101019 06:55]:
> In case of TX only with DMA, the driver assumes that the data
> has been transferred once DMA callback in invoked. However,
> SPI's shift register may still contain data. Thus, the driver
> is supposed to verify that the register is empty and the end of
> the SPI transfer has been reached.
> 
> Signed-off-by: Ilkka Koskinen <ilkka.koski...@nokia.com>
> Tested-by: Tuomas Katila <ext-tuomas.2.kat...@nokia.com>

Grant, can you please queue this one?

Acked-by: Tony Lindgren <t...@atomide.com>


> ---
>  drivers/spi/omap2_mcspi.c |   39 ++++++++++++++++++++++++++-------------
>  1 files changed, 26 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/spi/omap2_mcspi.c b/drivers/spi/omap2_mcspi.c
> index b3a94ca..a2e053c 100644
> --- a/drivers/spi/omap2_mcspi.c
> +++ b/drivers/spi/omap2_mcspi.c
> @@ -296,6 +296,19 @@ static int omap2_mcspi_enable_clocks(struct omap2_mcspi 
> *mcspi)
>       return 0;
>  }
>  
> +static int mcspi_wait_for_reg_bit(void __iomem *reg, unsigned long bit)
> +{
> +     unsigned long timeout;
> +
> +     timeout = jiffies + msecs_to_jiffies(1000);
> +     while (!(__raw_readl(reg) & bit)) {
> +             if (time_after(jiffies, timeout))
> +                     return -1;
> +             cpu_relax();
> +     }
> +     return 0;
> +}
> +
>  static unsigned
>  omap2_mcspi_txrx_dma(struct spi_device *spi, struct spi_transfer *xfer)
>  {
> @@ -309,11 +322,14 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct 
> spi_transfer *xfer)
>       u32                     l;
>       u8                      * rx;
>       const u8                * tx;
> +     void __iomem            *chstat_reg;
>  
>       mcspi = spi_master_get_devdata(spi->master);
>       mcspi_dma = &mcspi->dma_channels[spi->chip_select];
>       l = mcspi_cached_chconf0(spi);
>  
> +     chstat_reg = cs->base + OMAP2_MCSPI_CHSTAT0;
> +
>       count = xfer->len;
>       c = count;
>       word_len = cs->word_len;
> @@ -382,6 +398,16 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct 
> spi_transfer *xfer)
>       if (tx != NULL) {
>               wait_for_completion(&mcspi_dma->dma_tx_completion);
>               dma_unmap_single(NULL, xfer->tx_dma, count, DMA_TO_DEVICE);
> +
> +             /* for TX_ONLY mode, be sure all words have shifted out */
> +             if (rx == NULL) {
> +                     if (mcspi_wait_for_reg_bit(chstat_reg,
> +                                             OMAP2_MCSPI_CHSTAT_TXS) < 0)
> +                             dev_err(&spi->dev, "TXS timed out\n");
> +                     else if (mcspi_wait_for_reg_bit(chstat_reg,
> +                                             OMAP2_MCSPI_CHSTAT_EOT) < 0)
> +                             dev_err(&spi->dev, "EOT timed out\n");
> +             }
>       }
>  
>       if (rx != NULL) {
> @@ -435,19 +461,6 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct 
> spi_transfer *xfer)
>       return count;
>  }
>  
> -static int mcspi_wait_for_reg_bit(void __iomem *reg, unsigned long bit)
> -{
> -     unsigned long timeout;
> -
> -     timeout = jiffies + msecs_to_jiffies(1000);
> -     while (!(__raw_readl(reg) & bit)) {
> -             if (time_after(jiffies, timeout))
> -                     return -1;
> -             cpu_relax();
> -     }
> -     return 0;
> -}
> -
>  static unsigned
>  omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
>  {
> -- 
> 1.6.0.4
> 

------------------------------------------------------------------------------
Nokia and AT&T present the 2010 Calling All Innovators-North America contest
Create new apps & games for the Nokia N8 for consumers in  U.S. and Canada
$10 million total in prizes - $4M cash, 500 devices, nearly $6M in marketing
Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store 
http://p.sf.net/sfu/nokia-dev2dev
_______________________________________________
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general

Reply via email to