Merge branch 'fixes' of git://git.infradead.org/users/vkoul/slave-dma
Pull slave-dmaengine fixes from Vinod Koul: "A few fixes in pl330 and imx-sdma drivers." * 'fixes' of git://git.infradead.org/users/vkoul/slave-dma: DMA: PL330: Fix racy mutex unlock DMA: PL330: Add missing static storage class specifier dma: imx-sdma: buf_tail should be initialize in prepare function dmaengine: pl330: dont complete descriptor for cyclic dma
This commit is contained in:
commit
7940b2adb4
|
@ -815,8 +815,6 @@ static int sdma_request_channel(struct sdma_channel *sdmac)
|
||||||
|
|
||||||
init_completion(&sdmac->done);
|
init_completion(&sdmac->done);
|
||||||
|
|
||||||
sdmac->buf_tail = 0;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
out:
|
out:
|
||||||
|
|
||||||
|
@ -927,6 +925,8 @@ static struct dma_async_tx_descriptor *sdma_prep_slave_sg(
|
||||||
|
|
||||||
sdmac->flags = 0;
|
sdmac->flags = 0;
|
||||||
|
|
||||||
|
sdmac->buf_tail = 0;
|
||||||
|
|
||||||
dev_dbg(sdma->dev, "setting up %d entries for channel %d.\n",
|
dev_dbg(sdma->dev, "setting up %d entries for channel %d.\n",
|
||||||
sg_len, channel);
|
sg_len, channel);
|
||||||
|
|
||||||
|
@ -1027,6 +1027,8 @@ static struct dma_async_tx_descriptor *sdma_prep_dma_cyclic(
|
||||||
|
|
||||||
sdmac->status = DMA_IN_PROGRESS;
|
sdmac->status = DMA_IN_PROGRESS;
|
||||||
|
|
||||||
|
sdmac->buf_tail = 0;
|
||||||
|
|
||||||
sdmac->flags |= IMX_DMA_SG_LOOP;
|
sdmac->flags |= IMX_DMA_SG_LOOP;
|
||||||
sdmac->direction = direction;
|
sdmac->direction = direction;
|
||||||
ret = sdma_load_context(sdmac);
|
ret = sdma_load_context(sdmac);
|
||||||
|
|
|
@ -392,6 +392,8 @@ struct pl330_req {
|
||||||
struct pl330_reqcfg *cfg;
|
struct pl330_reqcfg *cfg;
|
||||||
/* Pointer to first xfer in the request. */
|
/* Pointer to first xfer in the request. */
|
||||||
struct pl330_xfer *x;
|
struct pl330_xfer *x;
|
||||||
|
/* Hook to attach to DMAC's list of reqs with due callback */
|
||||||
|
struct list_head rqd;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -461,8 +463,6 @@ struct _pl330_req {
|
||||||
/* Number of bytes taken to setup MC for the req */
|
/* Number of bytes taken to setup MC for the req */
|
||||||
u32 mc_len;
|
u32 mc_len;
|
||||||
struct pl330_req *r;
|
struct pl330_req *r;
|
||||||
/* Hook to attach to DMAC's list of reqs with due callback */
|
|
||||||
struct list_head rqd;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ToBeDone for tasklet */
|
/* ToBeDone for tasklet */
|
||||||
|
@ -1683,7 +1683,7 @@ static void pl330_dotask(unsigned long data)
|
||||||
/* Returns 1 if state was updated, 0 otherwise */
|
/* Returns 1 if state was updated, 0 otherwise */
|
||||||
static int pl330_update(const struct pl330_info *pi)
|
static int pl330_update(const struct pl330_info *pi)
|
||||||
{
|
{
|
||||||
struct _pl330_req *rqdone;
|
struct pl330_req *rqdone, *tmp;
|
||||||
struct pl330_dmac *pl330;
|
struct pl330_dmac *pl330;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
void __iomem *regs;
|
void __iomem *regs;
|
||||||
|
@ -1750,7 +1750,10 @@ static int pl330_update(const struct pl330_info *pi)
|
||||||
if (active == -1) /* Aborted */
|
if (active == -1) /* Aborted */
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
rqdone = &thrd->req[active];
|
/* Detach the req */
|
||||||
|
rqdone = thrd->req[active].r;
|
||||||
|
thrd->req[active].r = NULL;
|
||||||
|
|
||||||
mark_free(thrd, active);
|
mark_free(thrd, active);
|
||||||
|
|
||||||
/* Get going again ASAP */
|
/* Get going again ASAP */
|
||||||
|
@ -1762,20 +1765,11 @@ static int pl330_update(const struct pl330_info *pi)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now that we are in no hurry, do the callbacks */
|
/* Now that we are in no hurry, do the callbacks */
|
||||||
while (!list_empty(&pl330->req_done)) {
|
list_for_each_entry_safe(rqdone, tmp, &pl330->req_done, rqd) {
|
||||||
struct pl330_req *r;
|
list_del(&rqdone->rqd);
|
||||||
|
|
||||||
rqdone = container_of(pl330->req_done.next,
|
|
||||||
struct _pl330_req, rqd);
|
|
||||||
|
|
||||||
list_del_init(&rqdone->rqd);
|
|
||||||
|
|
||||||
/* Detach the req */
|
|
||||||
r = rqdone->r;
|
|
||||||
rqdone->r = NULL;
|
|
||||||
|
|
||||||
spin_unlock_irqrestore(&pl330->lock, flags);
|
spin_unlock_irqrestore(&pl330->lock, flags);
|
||||||
_callback(r, PL330_ERR_NONE);
|
_callback(rqdone, PL330_ERR_NONE);
|
||||||
spin_lock_irqsave(&pl330->lock, flags);
|
spin_lock_irqsave(&pl330->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2321,7 +2315,7 @@ static void pl330_tasklet(unsigned long data)
|
||||||
/* Pick up ripe tomatoes */
|
/* Pick up ripe tomatoes */
|
||||||
list_for_each_entry_safe(desc, _dt, &pch->work_list, node)
|
list_for_each_entry_safe(desc, _dt, &pch->work_list, node)
|
||||||
if (desc->status == DONE) {
|
if (desc->status == DONE) {
|
||||||
if (pch->cyclic)
|
if (!pch->cyclic)
|
||||||
dma_cookie_complete(&desc->txd);
|
dma_cookie_complete(&desc->txd);
|
||||||
list_move_tail(&desc->node, &list);
|
list_move_tail(&desc->node, &list);
|
||||||
}
|
}
|
||||||
|
@ -2539,7 +2533,7 @@ static inline void _init_desc(struct dma_pl330_desc *desc)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns the number of descriptors added to the DMAC pool */
|
/* Returns the number of descriptors added to the DMAC pool */
|
||||||
int add_desc(struct dma_pl330_dmac *pdmac, gfp_t flg, int count)
|
static int add_desc(struct dma_pl330_dmac *pdmac, gfp_t flg, int count)
|
||||||
{
|
{
|
||||||
struct dma_pl330_desc *desc;
|
struct dma_pl330_desc *desc;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
Loading…
Reference in New Issue