Merge tag 'dmaengine-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw...
[linux-flexiantxendom0-3.2.10.git] / drivers / dma / iop-adma.c
index 9b1951d..79e3eba 100644 (file)
@@ -36,6 +36,8 @@
 
 #include <mach/adma.h>
 
+#include "dmaengine.h"
+
 #define to_iop_adma_chan(chan) container_of(chan, struct iop_adma_chan, common)
 #define to_iop_adma_device(dev) \
        container_of(dev, struct iop_adma_device, common)
@@ -317,7 +319,7 @@ static void __iop_adma_slot_cleanup(struct iop_adma_chan *iop_chan)
        }
 
        if (cookie > 0) {
-               iop_chan->completed_cookie = cookie;
+               iop_chan->common.completed_cookie = cookie;
                pr_debug("\tcompleted cookie %d\n", cookie);
        }
 }
@@ -438,18 +440,6 @@ retry:
        return NULL;
 }
 
-static dma_cookie_t
-iop_desc_assign_cookie(struct iop_adma_chan *iop_chan,
-       struct iop_adma_desc_slot *desc)
-{
-       dma_cookie_t cookie = iop_chan->common.cookie;
-       cookie++;
-       if (cookie < 0)
-               cookie = 1;
-       iop_chan->common.cookie = desc->async_tx.cookie = cookie;
-       return cookie;
-}
-
 static void iop_adma_check_threshold(struct iop_adma_chan *iop_chan)
 {
        dev_dbg(iop_chan->device->common.dev, "pending: %d\n",
@@ -477,7 +467,7 @@ iop_adma_tx_submit(struct dma_async_tx_descriptor *tx)
        slots_per_op = grp_start->slots_per_op;
 
        spin_lock_bh(&iop_chan->lock);
-       cookie = iop_desc_assign_cookie(iop_chan, sw_desc);
+       cookie = dma_cookie_assign(tx);
 
        old_chain_tail = list_entry(iop_chan->chain.prev,
                struct iop_adma_desc_slot, chain_node);
@@ -904,24 +894,15 @@ static enum dma_status iop_adma_status(struct dma_chan *chan,
                                        struct dma_tx_state *txstate)
 {
        struct iop_adma_chan *iop_chan = to_iop_adma_chan(chan);
-       dma_cookie_t last_used;
-       dma_cookie_t last_complete;
-       enum dma_status ret;
-
-       last_used = chan->cookie;
-       last_complete = iop_chan->completed_cookie;
-       dma_set_tx_state(txstate, last_complete, last_used, 0);
-       ret = dma_async_is_complete(cookie, last_complete, last_used);
+       int ret;
+
+       ret = dma_cookie_status(chan, cookie, txstate);
        if (ret == DMA_SUCCESS)
                return ret;
 
        iop_adma_slot_cleanup(iop_chan);
 
-       last_used = chan->cookie;
-       last_complete = iop_chan->completed_cookie;
-       dma_set_tx_state(txstate, last_complete, last_used, 0);
-
-       return dma_async_is_complete(cookie, last_complete, last_used);
+       return dma_cookie_status(chan, cookie, txstate);
 }
 
 static irqreturn_t iop_adma_eot_handler(int irq, void *data)
@@ -1482,7 +1463,7 @@ static int __devinit iop_adma_probe(struct platform_device *pdev)
                goto err_free_adev;
        }
 
-       dev_dbg(&pdev->dev, "%s: allocted descriptor pool virt %p phys %p\n",
+       dev_dbg(&pdev->dev, "%s: allocated descriptor pool virt %p phys %p\n",
                __func__, adev->dma_desc_pool_virt,
                (void *) adev->dma_desc_pool);
 
@@ -1565,6 +1546,7 @@ static int __devinit iop_adma_probe(struct platform_device *pdev)
        INIT_LIST_HEAD(&iop_chan->chain);
        INIT_LIST_HEAD(&iop_chan->all_slots);
        iop_chan->common.device = dma_dev;
+       dma_cookie_init(&iop_chan->common);
        list_add_tail(&iop_chan->common.device_node, &dma_dev->channels);
 
        if (dma_has_cap(DMA_MEMCPY, dma_dev->cap_mask)) {
@@ -1642,16 +1624,12 @@ static void iop_chan_start_null_memcpy(struct iop_adma_chan *iop_chan)
                iop_desc_set_dest_addr(grp_start, iop_chan, 0);
                iop_desc_set_memcpy_src_addr(grp_start, 0);
 
-               cookie = iop_chan->common.cookie;
-               cookie++;
-               if (cookie <= 1)
-                       cookie = 2;
+               cookie = dma_cookie_assign(&sw_desc->async_tx);
 
                /* initialize the completed cookie to be less than
                 * the most recently used cookie
                 */
-               iop_chan->completed_cookie = cookie - 1;
-               iop_chan->common.cookie = sw_desc->async_tx.cookie = cookie;
+               iop_chan->common.completed_cookie = cookie - 1;
 
                /* channel should not be busy */
                BUG_ON(iop_chan_is_busy(iop_chan));
@@ -1699,16 +1677,12 @@ static void iop_chan_start_null_xor(struct iop_adma_chan *iop_chan)
                iop_desc_set_xor_src_addr(grp_start, 0, 0);
                iop_desc_set_xor_src_addr(grp_start, 1, 0);
 
-               cookie = iop_chan->common.cookie;
-               cookie++;
-               if (cookie <= 1)
-                       cookie = 2;
+               cookie = dma_cookie_assign(&sw_desc->async_tx);
 
                /* initialize the completed cookie to be less than
                 * the most recently used cookie
                 */
-               iop_chan->completed_cookie = cookie - 1;
-               iop_chan->common.cookie = sw_desc->async_tx.cookie = cookie;
+               iop_chan->common.completed_cookie = cookie - 1;
 
                /* channel should not be busy */
                BUG_ON(iop_chan_is_busy(iop_chan));