Oops, this patch wasn't supposed to be part of this set... On Wed, Apr 18, 2012 at 11:10:55AM +0100, Russell King wrote: > Ensure that physical channels are held while there are descriptors for > them to process. This is needed when we split the pending queue into > separate pending and issued queues. > > Signed-off-by: Russell King <rmk+kernel@xxxxxxxxxxxxxxxx> > --- > drivers/dma/amba-pl08x.c | 10 ++++++---- > 1 files changed, 6 insertions(+), 4 deletions(-) > > diff --git a/drivers/dma/amba-pl08x.c b/drivers/dma/amba-pl08x.c > index c301a8e..2e74cca 100644 > --- a/drivers/dma/amba-pl08x.c > +++ b/drivers/dma/amba-pl08x.c > @@ -855,6 +855,8 @@ static int prep_phy_channel(struct pl08x_dma_chan *plchan, > struct pl08x_phy_chan *ch; > int ret; > > + plchan->phychan_hold++; > + > /* Check if we already have a channel */ > if (plchan->phychan) { > ch = plchan->phychan; > @@ -863,6 +865,7 @@ static int prep_phy_channel(struct pl08x_dma_chan *plchan, > > ch = pl08x_get_phy_channel(pl08x, plchan); > if (!ch) { > + plchan->phychan_hold--; > /* No physical channel available, cope with it */ > dev_dbg(&pl08x->adev->dev, "no physical channel available for xfer on %s\n", plchan->name); > return -EBUSY; > @@ -876,6 +879,7 @@ static int prep_phy_channel(struct pl08x_dma_chan *plchan, > if (plchan->slave && pl08x->pd->get_signal) { > ret = pl08x->pd->get_signal(plchan); > if (ret < 0) { > + plchan->phychan_hold--; > dev_dbg(&pl08x->adev->dev, > "unable to use physical channel %d for transfer on %s due to platform restrictions\n", > ch->id, plchan->name); > @@ -899,8 +903,6 @@ static int prep_phy_channel(struct pl08x_dma_chan *plchan, > else if (txd->direction == DMA_DEV_TO_MEM) > txd->ccfg |= ch->signal << PL080_CONFIG_SRC_SEL_SHIFT; > > - plchan->phychan_hold++; > - > return 0; > } > > @@ -938,8 +940,6 @@ static dma_cookie_t pl08x_tx_submit(struct dma_async_tx_descriptor *tx) > /* Do this memcpy whenever there is a channel ready */ > plchan->state = PL08X_CHAN_WAITING; > plchan->waiting = txd; > - } else { > - plchan->phychan_hold--; > } > > spin_unlock_irqrestore(&plchan->lock, flags); > @@ -1428,6 +1428,7 @@ static int pl08x_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd, > * Mark physical channel as free and free any slave > * signal > */ > + plchan->phychan_hold = 0; > release_phy_channel(plchan); > } > /* Dequeue jobs and free LLIs */ > @@ -1529,6 +1530,7 @@ static void pl08x_tasklet(unsigned long data) > if (txd) { > /* Update last completed */ > dma_cookie_complete(&txd->tx); > + plchan->phychan_hold--; > } > > /* If a new descriptor is queued, set it up plchan->at is NULL here */ > -- > 1.7.4.4 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@xxxxxxxxxxxxxxxxxxx > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html