Skip to content

Commit 4bd6135

Browse files
author
Vinod Koul
committed
Merge branch 'fix/omap' into fixes
2 parents 09c505c + b96c033 commit 4bd6135

File tree

1 file changed

+17
-9
lines changed

1 file changed

+17
-9
lines changed

drivers/dma/omap-dma.c

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ struct omap_chan {
4848
unsigned dma_sig;
4949
bool cyclic;
5050
bool paused;
51+
bool running;
5152

5253
int dma_ch;
5354
struct omap_desc *desc;
@@ -294,6 +295,8 @@ static void omap_dma_start(struct omap_chan *c, struct omap_desc *d)
294295

295296
/* Enable channel */
296297
omap_dma_chan_write(c, CCR, d->ccr | CCR_ENABLE);
298+
299+
c->running = true;
297300
}
298301

299302
static void omap_dma_stop(struct omap_chan *c)
@@ -355,6 +358,8 @@ static void omap_dma_stop(struct omap_chan *c)
355358

356359
omap_dma_chan_write(c, CLNK_CTRL, val);
357360
}
361+
362+
c->running = false;
358363
}
359364

360365
static void omap_dma_start_sg(struct omap_chan *c, struct omap_desc *d,
@@ -673,15 +678,20 @@ static enum dma_status omap_dma_tx_status(struct dma_chan *chan,
673678
struct omap_chan *c = to_omap_dma_chan(chan);
674679
struct virt_dma_desc *vd;
675680
enum dma_status ret;
676-
uint32_t ccr;
677681
unsigned long flags;
678682

679-
ccr = omap_dma_chan_read(c, CCR);
680-
/* The channel is no longer active, handle the completion right away */
681-
if (!(ccr & CCR_ENABLE))
682-
omap_dma_callback(c->dma_ch, 0, c);
683-
684683
ret = dma_cookie_status(chan, cookie, txstate);
684+
685+
if (!c->paused && c->running) {
686+
uint32_t ccr = omap_dma_chan_read(c, CCR);
687+
/*
688+
* The channel is no longer active, set the return value
689+
* accordingly
690+
*/
691+
if (!(ccr & CCR_ENABLE))
692+
ret = DMA_COMPLETE;
693+
}
694+
685695
if (ret == DMA_COMPLETE || !txstate)
686696
return ret;
687697

@@ -945,9 +955,7 @@ static struct dma_async_tx_descriptor *omap_dma_prep_dma_memcpy(
945955
d->ccr = c->ccr;
946956
d->ccr |= CCR_DST_AMODE_POSTINC | CCR_SRC_AMODE_POSTINC;
947957

948-
d->cicr = CICR_DROP_IE;
949-
if (tx_flags & DMA_PREP_INTERRUPT)
950-
d->cicr |= CICR_FRAME_IE;
958+
d->cicr = CICR_DROP_IE | CICR_FRAME_IE;
951959

952960
d->csdp = data_type;
953961

0 commit comments

Comments
 (0)