diff options
Diffstat (limited to 'drivers/dma/pl330.c')
| -rw-r--r-- | drivers/dma/pl330.c | 30 | 
1 files changed, 12 insertions, 18 deletions
diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c index cbcc28e79be..e4feba6b03c 100644 --- a/drivers/dma/pl330.c +++ b/drivers/dma/pl330.c @@ -392,6 +392,8 @@ struct pl330_req {  	struct pl330_reqcfg *cfg;  	/* Pointer to first xfer in the request. */  	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 */  	u32 mc_len;  	struct pl330_req *r; -	/* Hook to attach to DMAC's list of reqs with due callback */ -	struct list_head rqd;  };  /* ToBeDone for tasklet */ @@ -1683,7 +1683,7 @@ static void pl330_dotask(unsigned long data)  /* Returns 1 if state was updated, 0 otherwise */  static int pl330_update(const struct pl330_info *pi)  { -	struct _pl330_req *rqdone; +	struct pl330_req *rqdone, *tmp;  	struct pl330_dmac *pl330;  	unsigned long flags;  	void __iomem *regs; @@ -1750,7 +1750,10 @@ static int pl330_update(const struct pl330_info *pi)  			if (active == -1) /* Aborted */  				continue; -			rqdone = &thrd->req[active]; +			/* Detach the req */ +			rqdone = thrd->req[active].r; +			thrd->req[active].r = NULL; +  			mark_free(thrd, active);  			/* 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 */ -	while (!list_empty(&pl330->req_done)) { -		struct pl330_req *r; - -		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; +	list_for_each_entry_safe(rqdone, tmp, &pl330->req_done, rqd) { +		list_del(&rqdone->rqd);  		spin_unlock_irqrestore(&pl330->lock, flags); -		_callback(r, PL330_ERR_NONE); +		_callback(rqdone, PL330_ERR_NONE);  		spin_lock_irqsave(&pl330->lock, flags);  	} @@ -2321,7 +2315,7 @@ static void pl330_tasklet(unsigned long data)  	/* Pick up ripe tomatoes */  	list_for_each_entry_safe(desc, _dt, &pch->work_list, node)  		if (desc->status == DONE) { -			if (pch->cyclic) +			if (!pch->cyclic)  				dma_cookie_complete(&desc->txd);  			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 */ -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;  	unsigned long flags;  |