]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/dma/mv_xor.c
dma: mxs-dma: enable channel in device_issue_pending call
[mv-sheeva.git] / drivers / dma / mv_xor.c
index e779b434af450fedc9f11bfc4db753689cce1ee9..fa5d55fea46cc4829ba55b84a53cb42baafe81c9 100644 (file)
@@ -26,6 +26,8 @@
 #include <linux/platform_device.h>
 #include <linux/memory.h>
 #include <plat/mv_xor.h>
+
+#include "dmaengine.h"
 #include "mv_xor.h"
 
 static void mv_xor_issue_pending(struct dma_chan *chan);
@@ -435,7 +437,7 @@ static void __mv_xor_slot_cleanup(struct mv_xor_chan *mv_chan)
        }
 
        if (cookie > 0)
-               mv_chan->completed_cookie = cookie;
+               mv_chan->common.completed_cookie = cookie;
 }
 
 static void
@@ -534,18 +536,6 @@ retry:
        return NULL;
 }
 
-static dma_cookie_t
-mv_desc_assign_cookie(struct mv_xor_chan *mv_chan,
-                     struct mv_xor_desc_slot *desc)
-{
-       dma_cookie_t cookie = mv_chan->common.cookie;
-
-       if (++cookie < 0)
-               cookie = 1;
-       mv_chan->common.cookie = desc->async_tx.cookie = cookie;
-       return cookie;
-}
-
 /************************ DMA engine API functions ****************************/
 static dma_cookie_t
 mv_xor_tx_submit(struct dma_async_tx_descriptor *tx)
@@ -563,7 +553,7 @@ mv_xor_tx_submit(struct dma_async_tx_descriptor *tx)
        grp_start = sw_desc->group_head;
 
        spin_lock_bh(&mv_chan->lock);
-       cookie = mv_desc_assign_cookie(mv_chan, sw_desc);
+       cookie = dma_cookie_assign(tx);
 
        if (list_empty(&mv_chan->chain))
                list_splice_init(&sw_desc->tx_list, &mv_chan->chain);
@@ -820,27 +810,16 @@ static enum dma_status mv_xor_status(struct dma_chan *chan,
                                          struct dma_tx_state *txstate)
 {
        struct mv_xor_chan *mv_chan = to_mv_xor_chan(chan);
-       dma_cookie_t last_used;
-       dma_cookie_t last_complete;
        enum dma_status ret;
 
-       last_used = chan->cookie;
-       last_complete = mv_chan->completed_cookie;
-       mv_chan->is_complete_cookie = cookie;
-       dma_set_tx_state(txstate, last_complete, last_used, 0);
-
-       ret = dma_async_is_complete(cookie, last_complete, last_used);
+       ret = dma_cookie_status(chan, cookie, txstate);
        if (ret == DMA_SUCCESS) {
                mv_xor_clean_completed_slots(mv_chan);
                return ret;
        }
        mv_xor_slot_cleanup(mv_chan);
 
-       last_used = chan->cookie;
-       last_complete = mv_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 void mv_dump_xor_regs(struct mv_xor_chan *chan)
@@ -1214,6 +1193,7 @@ static int __devinit mv_xor_probe(struct platform_device *pdev)
        INIT_LIST_HEAD(&mv_chan->completed_slots);
        INIT_LIST_HEAD(&mv_chan->all_slots);
        mv_chan->common.device = dma_dev;
+       dma_cookie_init(&mv_chan->common);
 
        list_add_tail(&mv_chan->common.device_node, &dma_dev->channels);