diff options
author | Dan Williams <dan.j.williams@intel.com> | 2009-03-02 15:33:46 -0700 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2009-03-04 16:04:40 -0700 |
commit | 900325a6ce33995688b7a680a34e7698f16f4d72 (patch) | |
tree | 8684bc969f3c355307bec56a0c55ad50a1094c0e | |
parent | 0c33e1ca3d80647f2e72e44524fd21e79214da20 (diff) | |
download | op-kernel-dev-900325a6ce33995688b7a680a34e7698f16f4d72.zip op-kernel-dev-900325a6ce33995688b7a680a34e7698f16f4d72.tar.gz |
fsldma: fix off by one in dma_halt
Prevent dev_err from firing even if we successfully detected 'dma-idle'
before the full 1ms timeout has elapsed.
Acked-by: Roel Kluin <roel.kluin@gmail.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
-rw-r--r-- | drivers/dma/fsldma.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c index 70126a6..86d6da4 100644 --- a/drivers/dma/fsldma.c +++ b/drivers/dma/fsldma.c @@ -158,7 +158,8 @@ static void dma_start(struct fsl_dma_chan *fsl_chan) static void dma_halt(struct fsl_dma_chan *fsl_chan) { - int i = 0; + int i; + DMA_OUT(fsl_chan, &fsl_chan->reg_base->mr, DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32) | FSL_DMA_MR_CA, 32); @@ -166,8 +167,11 @@ static void dma_halt(struct fsl_dma_chan *fsl_chan) DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32) & ~(FSL_DMA_MR_CS | FSL_DMA_MR_EMS_EN | FSL_DMA_MR_CA), 32); - while (!dma_is_idle(fsl_chan) && (i++ < 100)) + for (i = 0; i < 100; i++) { + if (dma_is_idle(fsl_chan)) + break; udelay(10); + } if (i >= 100 && !dma_is_idle(fsl_chan)) dev_err(fsl_chan->dev, "DMA halt timeout!\n"); } |