]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/dma/mxs-dma.c
Merge tag 'for-linus-3.4' of git://git.infradead.org/mtd-2.6
[mv-sheeva.git] / drivers / dma / mxs-dma.c
index 0ddfd30b56ad21e3ba5d8a127c89d401baf5e84b..c81ef7e10e08283ce8eaf4fadf6166b5d3ddc19c 100644 (file)
@@ -28,6 +28,8 @@
 #include <mach/mxs.h>
 #include <mach/common.h>
 
+#include "dmaengine.h"
+
 /*
  * NOTE: The term "PIO" throughout the mxs-dma implementation means
  * PIO mode of mxs apbh-dma and apbx-dma.  With this working mode,
@@ -111,7 +113,6 @@ struct mxs_dma_chan {
        struct mxs_dma_ccw              *ccw;
        dma_addr_t                      ccw_phys;
        int                             desc_count;
-       dma_cookie_t                    last_completed;
        enum dma_status                 status;
        unsigned int                    flags;
 #define MXS_DMA_SG_LOOP                        (1 << 0)
@@ -193,19 +194,6 @@ static void mxs_dma_resume_chan(struct mxs_dma_chan *mxs_chan)
        mxs_chan->status = DMA_IN_PROGRESS;
 }
 
-static dma_cookie_t mxs_dma_assign_cookie(struct mxs_dma_chan *mxs_chan)
-{
-       dma_cookie_t cookie = mxs_chan->chan.cookie;
-
-       if (++cookie < 0)
-               cookie = 1;
-
-       mxs_chan->chan.cookie = cookie;
-       mxs_chan->desc.cookie = cookie;
-
-       return cookie;
-}
-
 static struct mxs_dma_chan *to_mxs_dma_chan(struct dma_chan *chan)
 {
        return container_of(chan, struct mxs_dma_chan, chan);
@@ -217,7 +205,7 @@ static dma_cookie_t mxs_dma_tx_submit(struct dma_async_tx_descriptor *tx)
 
        mxs_dma_enable_chan(mxs_chan);
 
-       return mxs_dma_assign_cookie(mxs_chan);
+       return dma_cookie_assign(tx);
 }
 
 static void mxs_dma_tasklet(unsigned long data)
@@ -274,7 +262,7 @@ static irqreturn_t mxs_dma_int_handler(int irq, void *dev_id)
                stat1 &= ~(1 << channel);
 
                if (mxs_chan->status == DMA_SUCCESS)
-                       mxs_chan->last_completed = mxs_chan->desc.cookie;
+                       dma_cookie_complete(&mxs_chan->desc);
 
                /* schedule tasklet on this channel */
                tasklet_schedule(&mxs_chan->tasklet);
@@ -374,7 +362,7 @@ static void mxs_dma_free_chan_resources(struct dma_chan *chan)
 static struct dma_async_tx_descriptor *mxs_dma_prep_slave_sg(
                struct dma_chan *chan, struct scatterlist *sgl,
                unsigned int sg_len, enum dma_transfer_direction direction,
-               unsigned long flags)
+               unsigned long flags, void *context)
 {
        struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan);
        struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma;
@@ -471,7 +459,8 @@ err_out:
 
 static struct dma_async_tx_descriptor *mxs_dma_prep_dma_cyclic(
                struct dma_chan *chan, dma_addr_t dma_addr, size_t buf_len,
-               size_t period_len, enum dma_transfer_direction direction)
+               size_t period_len, enum dma_transfer_direction direction,
+               void *context)
 {
        struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan);
        struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma;
@@ -562,7 +551,7 @@ static enum dma_status mxs_dma_tx_status(struct dma_chan *chan,
        dma_cookie_t last_used;
 
        last_used = chan->cookie;
-       dma_set_tx_state(txstate, mxs_chan->last_completed, last_used, 0);
+       dma_set_tx_state(txstate, chan->completed_cookie, last_used, 0);
 
        return mxs_chan->status;
 }
@@ -654,6 +643,7 @@ static int __init mxs_dma_probe(struct platform_device *pdev)
 
                mxs_chan->mxs_dma = mxs_dma;
                mxs_chan->chan.device = &mxs_dma->dma_device;
+               dma_cookie_init(&mxs_chan->chan);
 
                tasklet_init(&mxs_chan->tasklet, mxs_dma_tasklet,
                             (unsigned long) mxs_chan);