[PATCH 2/9] dmaengine: move last completed cookie into generic dma_chan structure

H Hartley Sweeten hartleys at visionengravers.com
Tue Mar 6 19:38:11 EST 2012


On Tuesday, March 06, 2012 3:34 PM, Russell King wrote:
>
> Every DMA engine implementation declares a last completed dma cookie
> in their private dma channel structures.  This is pointless, and
> forces driver specific code.  Move this out into the common dma_chan
> structure.
>
> Signed-off-by: Russell King <rmk+kernel at arm.linux.org.uk>
> ---

<snip>

 drivers/dma/ep93xx_dma.c                 |    8 +++-----

<snip>

 include/linux/dmaengine.h                |    2 ++

<snip>

> diff --git a/drivers/dma/ep93xx_dma.c b/drivers/dma/ep93xx_dma.c
> index 59e7a96..bc45787 100644
> --- a/drivers/dma/ep93xx_dma.c
> +++ b/drivers/dma/ep93xx_dma.c
> @@ -122,7 +122,6 @@ struct ep93xx_dma_desc {
>   * @lock: lock protecting the fields following
>   * @flags: flags for the channel
>   * @buffer: which buffer to use next (0/1)
> - * @last_completed: last completed cookie value
>   * @active: flattened chain of descriptors currently being processed
>   * @queue: pending descriptors which are handled next
>   * @free_list: list of free descriptors which can be used
> @@ -157,7 +156,6 @@ struct ep93xx_dma_chan {
>  #define EP93XX_DMA_IS_CYCLIC		0
>  
>  	int				buffer;
> -	dma_cookie_t			last_completed;
>  	struct list_head		active;
>  	struct list_head		queue;
>  	struct list_head		free_list;
> @@ -703,7 +701,7 @@ static void ep93xx_dma_tasklet(unsigned long data)
>  	desc = ep93xx_dma_get_active(edmac);
>  	if (desc) {
>  		if (desc->complete) {
> -			edmac->last_completed = desc->txd.cookie;
> +			edmac->chan.completed_cookie = desc->txd.cookie;
>  			list_splice_init(&edmac->active, &list);
>  		}
>  		callback = desc->txd.callback;
> @@ -861,7 +859,7 @@ static int ep93xx_dma_alloc_chan_resources(struct dma_chan *chan)
>  		goto fail_clk_disable;
>  
>  	spin_lock_irq(&edmac->lock);
> -	edmac->last_completed = 1;
> +	edmac->chan.completed_cookie = 1;
>  	edmac->chan.cookie = 1;
>  	ret = edmac->edma->hw_setup(edmac);
>  	spin_unlock_irq(&edmac->lock);
> @@ -1254,7 +1252,7 @@ static enum dma_status ep93xx_dma_tx_status(struct dma_chan *chan,
>  
>  	spin_lock_irqsave(&edmac->lock, flags);
>  	last_used = chan->cookie;
> -	last_completed = edmac->last_completed;
> +	last_completed = chan->completed_cookie;
>  	spin_unlock_irqrestore(&edmac->lock, flags);
>  
>  	ret = dma_async_is_complete(cookie, last_completed, last_used);

<snip>

> diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h
> index 679b349..41d0f92 100644
> --- a/include/linux/dmaengine.h
> +++ b/include/linux/dmaengine.h
> @@ -257,6 +257,7 @@ struct dma_chan_percpu {
>   * struct dma_chan - devices supply DMA channels, clients use them
>   * @device: ptr to the dma device who supplies this channel, always !%NULL
>   * @cookie: last cookie value returned to client
> + * @completed_cookie: last completed cookie for this channel
>   * @chan_id: channel ID for sysfs
>   * @dev: class device for sysfs
>   * @device_node: used to add this to the device chan list
> @@ -268,6 +269,7 @@ struct dma_chan_percpu {
>  struct dma_chan {
>  	struct dma_device *device;
>  	dma_cookie_t cookie;
> +	dma_cookie_t completed_cookie;
>  
>  	/* sysfs */
>  	int chan_id;

For ep93xx:

Tested-by: H Hartley Sweeten <hsweeten at visionengravers.com>
Acked-by: H Hartley Sweeten <hsweeten at visionengravers.com>




More information about the linux-arm-kernel mailing list