Message ID | CAM=Q2ctLtGneTfuALDQBk68mEnOxHseZ1fkvcoTks-0j+VyTxQ@mail.gmail.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
On Wed, Oct 31, 2012 at 8:59 PM, Shubhrajyoti Datta <omaplinuxkernel@gmail.com> wrote: [...] Mark, let me know if you want me to resubmit it as a patch. > > From 07a59cb82955c37eff6fe06ba25958dc1b5c5f56 Mon Sep 17 00:00:00 2001 > From: Shubhrajyoti D <shubhrajyoti@ti.com> > Date: Wed, 31 Oct 2012 19:15:25 +0530 > Subject: [PATCH] spi: omap2-mcspi: Reorder the wait_for_completion for tx > > The commit d7b4394e[Cleanup the omap2_mcspi_txrx_dma function] > changed the wait_for_completion order. Move the wait so that the > rx doesnot wait for the tx to complete. > > Reported-by: Sørensen, Stefan <Sorensen@polycom.com> > Signed-off-by: Shubhrajyoti D <shubhrajyoti@ti.com> > --- > drivers/spi/spi-omap2-mcspi.c | 39 +++++++++++++++++++-------------------- > 1 files changed, 19 insertions(+), 20 deletions(-) > > diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c > index bcfd062..251f6d0 100644 > --- a/drivers/spi/spi-omap2-mcspi.c > +++ b/drivers/spi/spi-omap2-mcspi.c > @@ -323,18 +323,13 @@ static void omap2_mcspi_tx_dma(struct spi_device *spi, > struct omap2_mcspi *mcspi; > struct omap2_mcspi_dma *mcspi_dma; > unsigned int count; > - u8 * rx; > const u8 * tx; > - void __iomem *chstat_reg; > - struct omap2_mcspi_cs *cs = spi->controller_state; > > mcspi = spi_master_get_devdata(spi->master); > mcspi_dma = &mcspi->dma_channels[spi->chip_select]; > count = xfer->len; > > - rx = xfer->rx_buf; > tx = xfer->tx_buf; > - chstat_reg = cs->base + OMAP2_MCSPI_CHSTAT0; > > if (mcspi_dma->dma_tx) { > struct dma_async_tx_descriptor *tx; > @@ -359,19 +354,6 @@ static void omap2_mcspi_tx_dma(struct spi_device *spi, > dma_async_issue_pending(mcspi_dma->dma_tx); > omap2_mcspi_set_dma_req(spi, 0, 1); > > - wait_for_completion(&mcspi_dma->dma_tx_completion); > - dma_unmap_single(mcspi->dev, 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"); > - } > } > > static unsigned > @@ -492,6 +474,7 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, > struct spi_transfer *xfer) > struct dma_slave_config cfg; > enum dma_slave_buswidth width; > unsigned es; > + void __iomem *chstat_reg; > > mcspi = spi_master_get_devdata(spi->master); > mcspi_dma = &mcspi->dma_channels[spi->chip_select]; > @@ -526,8 +509,24 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, > struct spi_transfer *xfer) > omap2_mcspi_tx_dma(spi, xfer, cfg); > > if (rx != NULL) > - return omap2_mcspi_rx_dma(spi, xfer, cfg, es); > - > + count = omap2_mcspi_rx_dma(spi, xfer, cfg, es); > + > + if (tx != NULL) { > + chstat_reg = cs->base + OMAP2_MCSPI_CHSTAT0; > + wait_for_completion(&mcspi_dma->dma_tx_completion); > + dma_unmap_single(mcspi->dev, xfer->tx_dma, xfer->len, > + 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"); > + } > + } > return count; > } > > -- > 1.7.5.4 ------------------------------------------------------------------------------ LogMeIn Central: Instant, anywhere, Remote PC access and management. Stay in control, update software, and manage PCs from one command center Diagnose problems and improve visibility into emerging IT issues Automate, monitor and manage. Do more in less time with Central http://p.sf.net/sfu/logmein12331_d2d
diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c index bcfd062..251f6d0 100644 --- a/drivers/spi/spi-omap2-mcspi.c +++ b/drivers/spi/spi-omap2-mcspi.c @@ -323,18 +323,13 @@ static void omap2_mcspi_tx_dma(struct spi_device *spi, struct omap2_mcspi *mcspi; struct omap2_mcspi_dma *mcspi_dma; unsigned int count; - u8 * rx; const u8 * tx; - void __iomem *chstat_reg; - struct omap2_mcspi_cs *cs = spi->controller_state; mcspi = spi_master_get_devdata(spi->master); mcspi_dma = &mcspi->dma_channels[spi->chip_select]; count = xfer->len; - rx = xfer->rx_buf; tx = xfer->tx_buf; - chstat_reg = cs->base + OMAP2_MCSPI_CHSTAT0; if (mcspi_dma->dma_tx) { struct dma_async_tx_descriptor *tx; @@ -359,19 +354,6 @@ static void omap2_mcspi_tx_dma(struct spi_device *spi, dma_async_issue_pending(mcspi_dma->dma_tx); omap2_mcspi_set_dma_req(spi, 0, 1); - wait_for_completion(&mcspi_dma->dma_tx_completion); - dma_unmap_single(mcspi->dev, 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"); - } } static unsigned @@ -492,6 +474,7 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct spi_transfer *xfer) struct dma_slave_config cfg; enum dma_slave_buswidth width; unsigned es; + void __iomem *chstat_reg; mcspi = spi_master_get_devdata(spi->master);