[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