Merge git://git.infradead.org/users/cbou/battery-2.6.35
[pandora-kernel.git] / drivers / dma / timb_dma.c
index 145f1c2..a1bf77c 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/io.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
+#include <linux/slab.h>
 
 #include <linux/timb_dma.h>
 
@@ -187,7 +188,7 @@ static void __td_unmap_descs(struct timb_dma_desc *td_desc, bool single)
 static int td_fill_desc(struct timb_dma_chan *td_chan, u8 *dma_desc,
        struct scatterlist *sg, bool last)
 {
-       if (sg_dma_len(sg) > USHORT_MAX) {
+       if (sg_dma_len(sg) > USHRT_MAX) {
                dev_err(chan2dev(&td_chan->chan), "Too big sg element\n");
                return -EINVAL;
        }
@@ -511,8 +512,8 @@ static void td_free_chan_resources(struct dma_chan *chan)
        }
 }
 
-static enum dma_status td_is_tx_complete(struct dma_chan *chan,
-       dma_cookie_t cookie, dma_cookie_t *done, dma_cookie_t *used)
+static enum dma_status td_tx_status(struct dma_chan *chan, dma_cookie_t cookie,
+                                   struct dma_tx_state *txstate)
 {
        struct timb_dma_chan *td_chan =
                container_of(chan, struct timb_dma_chan, chan);
@@ -527,10 +528,7 @@ static enum dma_status td_is_tx_complete(struct dma_chan *chan,
 
        ret = dma_async_is_complete(cookie, last_complete, last_used);
 
-       if (done)
-               *done = last_complete;
-       if (used)
-               *used = last_used;
+       dma_set_tx_state(txstate, last_complete, last_used, 0);
 
        dev_dbg(chan2dev(chan),
                "%s: exit, ret: %d, last_complete: %d, last_used: %d\n",
@@ -613,7 +611,8 @@ static struct dma_async_tx_descriptor *td_prep_slave_sg(struct dma_chan *chan,
        return &td_desc->txd;
 }
 
-static void td_terminate_all(struct dma_chan *chan)
+static int td_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
+                     unsigned long arg)
 {
        struct timb_dma_chan *td_chan =
                container_of(chan, struct timb_dma_chan, chan);
@@ -621,6 +620,9 @@ static void td_terminate_all(struct dma_chan *chan)
 
        dev_dbg(chan2dev(chan), "%s: Entry\n", __func__);
 
+       if (cmd != DMA_TERMINATE_ALL)
+               return -ENXIO;
+
        /* first the easy part, put the queue into the free list */
        spin_lock_bh(&td_chan->lock);
        list_for_each_entry_safe(td_desc, _td_desc, &td_chan->queue,
@@ -630,6 +632,8 @@ static void td_terminate_all(struct dma_chan *chan)
        /* now tear down the runnning */
        __td_finish(td_chan);
        spin_unlock_bh(&td_chan->lock);
+
+       return 0;
 }
 
 static void td_tasklet(unsigned long data)
@@ -737,13 +741,13 @@ static int __devinit td_probe(struct platform_device *pdev)
 
        td->dma.device_alloc_chan_resources     = td_alloc_chan_resources;
        td->dma.device_free_chan_resources      = td_free_chan_resources;
-       td->dma.device_is_tx_complete           = td_is_tx_complete;
+       td->dma.device_tx_status                = td_tx_status;
        td->dma.device_issue_pending            = td_issue_pending;
 
        dma_cap_set(DMA_SLAVE, td->dma.cap_mask);
        dma_cap_set(DMA_PRIVATE, td->dma.cap_mask);
        td->dma.device_prep_slave_sg = td_prep_slave_sg;
-       td->dma.device_terminate_all = td_terminate_all;
+       td->dma.device_control = td_control;
 
        td->dma.dev = &pdev->dev;