]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
DMAENGINE: extend the control command to include an arg
authorLinus Walleij <linus.walleij@stericsson.com>
Mon, 17 May 2010 23:30:42 +0000 (16:30 -0700)
committerDan Williams <dan.j.williams@intel.com>
Mon, 17 May 2010 23:30:42 +0000 (16:30 -0700)
This adds an argument to the DMAengine control function, so that
we can later provide control commands that need some external data
passed in through an argument akin to the ioctl() operation
prototype.

[dan.j.williams@intel.com: fix up some missed conversions]
Signed-off-by: Linus Walleij <linus.walleij@stericsson.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
14 files changed:
drivers/dma/at_hdmac.c
drivers/dma/coh901318.c
drivers/dma/dw_dmac.c
drivers/dma/fsldma.c
drivers/dma/ipu/ipu_idmac.c
drivers/dma/shdma.c
drivers/dma/ste_dma40.c
drivers/dma/timb_dma.c
drivers/dma/txx9dmac.c
drivers/mmc/host/atmel-mci.c
drivers/serial/sh-sci.c
drivers/video/mx3fb.c
include/linux/dmaengine.h
sound/soc/txx9/txx9aclc.c

index 93ed99c84cf12c31703104edb6c3a9b27cf5eb1b..ee805a43f879bdc6307412e96c92e2b65fdbd5d4 100644 (file)
@@ -759,7 +759,8 @@ err_desc_get:
        return NULL;
 }
 
-static int atc_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd)
+static int atc_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
+                      unsigned long arg)
 {
        struct at_dma_chan      *atchan = to_at_dma_chan(chan);
        struct at_dma           *atdma = to_at_dma(chan->device);
index 4233440741a28ef2361778db2af4ddc6fb2eee3c..a724e6be1b4d990a391b768696ac78932ea53111 100644 (file)
@@ -942,7 +942,7 @@ coh901318_free_chan_resources(struct dma_chan *chan)
 
        spin_unlock_irqrestore(&cohc->lock, flags);
 
-       chan->device->device_control(chan, DMA_TERMINATE_ALL);
+       chan->device->device_control(chan, DMA_TERMINATE_ALL, 0);
 }
 
 
@@ -1176,7 +1176,8 @@ coh901318_issue_pending(struct dma_chan *chan)
 }
 
 static int
-coh901318_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd)
+coh901318_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
+                 unsigned long arg)
 {
        unsigned long flags;
        struct coh901318_chan *cohc = to_coh901318_chan(chan);
index 18fb5b41cedfc92fce6051af40c9768e73b80563..a3991ab0d67e06cf6e99d41d9a1a923109dc1a06 100644 (file)
@@ -781,7 +781,8 @@ err_desc_get:
        return NULL;
 }
 
-static int dwc_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd)
+static int dwc_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
+                      unsigned long arg)
 {
        struct dw_dma_chan      *dwc = to_dw_dma_chan(chan);
        struct dw_dma           *dw = to_dw_dma(chan->device);
index cb1924f46c9ebf0bbc003f8fbf1a758916b1752c..005329d496bd6d7f7bf95270d8c2463603fc71cf 100644 (file)
@@ -775,7 +775,7 @@ fail:
 }
 
 static int fsl_dma_device_control(struct dma_chan *dchan,
-                                 enum dma_ctrl_cmd cmd)
+                                 enum dma_ctrl_cmd cmd, unsigned long arg)
 {
        struct fsldma_chan *chan;
        unsigned long flags;
index 246a6143e4a7ed0dadaad342f697bd2a97a08d08..cb26ee9773d69cc8a612bce3af4deb878d59a157 100644 (file)
@@ -1472,7 +1472,8 @@ static void idmac_issue_pending(struct dma_chan *chan)
         */
 }
 
-static int __idmac_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd)
+static int __idmac_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
+                          unsigned long arg)
 {
        struct idmac_channel *ichan = to_idmac_chan(chan);
        struct idmac *idmac = to_idmac(chan->device);
@@ -1513,14 +1514,15 @@ static int __idmac_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd)
        return 0;
 }
 
-static int idmac_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd)
+static int idmac_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
+                        unsigned long arg)
 {
        struct idmac_channel *ichan = to_idmac_chan(chan);
        int ret;
 
        mutex_lock(&ichan->chan_mutex);
 
-       ret = __idmac_control(chan, cmd);
+       ret = __idmac_control(chan, cmd, arg);
 
        mutex_unlock(&ichan->chan_mutex);
 
@@ -1616,7 +1618,7 @@ static void idmac_free_chan_resources(struct dma_chan *chan)
 
        mutex_lock(&ichan->chan_mutex);
 
-       __idmac_control(chan, DMA_TERMINATE_ALL);
+       __idmac_control(chan, DMA_TERMINATE_ALL, 0);
 
        if (ichan->status > IPU_CHANNEL_FREE) {
 #ifdef DEBUG
@@ -1709,7 +1711,7 @@ static void __exit ipu_idmac_exit(struct ipu *ipu)
        for (i = 0; i < IPU_CHANNELS_NUM; i++) {
                struct idmac_channel *ichan = ipu->channel + i;
 
-               idmac_control(&ichan->dma_chan, DMA_TERMINATE_ALL);
+               idmac_control(&ichan->dma_chan, DMA_TERMINATE_ALL, 0);
                idmac_prep_slave_sg(&ichan->dma_chan, NULL, 0, DMA_NONE, 0);
        }
 
index 98f82cdb404cb0ce63b8a8863dfef7da4dd02bac..e9de1d35c20d901fac751b0a145683cc5a698d94 100644 (file)
@@ -580,7 +580,8 @@ static struct dma_async_tx_descriptor *sh_dmae_prep_slave_sg(
                               direction, flags);
 }
 
-static int sh_dmae_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd)
+static int sh_dmae_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
+                          unsigned long arg)
 {
        struct sh_dmae_chan *sh_chan = to_sh_chan(chan);
 
index 81fec95312b61c9dc8dc14f4de8a08741cd858b4..c426829f6ab84463b9cdb57422b5793af42634d4 100644 (file)
@@ -2065,7 +2065,8 @@ static void d40_issue_pending(struct dma_chan *chan)
        spin_unlock_irqrestore(&d40c->lock, flags);
 }
 
-static int d40_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd)
+static int d40_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
+                      unsigned long arg)
 {
        unsigned long flags;
        struct d40_chan *d40c = container_of(chan, struct d40_chan, chan);
index 44b346d8d31993f2f29699509e3dd3847dd5c9e0..0172fa3c7a2b176ffebb2c551354a448c2fe5fa6 100644 (file)
@@ -611,7 +611,8 @@ static struct dma_async_tx_descriptor *td_prep_slave_sg(struct dma_chan *chan,
        return &td_desc->txd;
 }
 
-static int td_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd)
+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);
index e523737639aa69cc3f96a93ce4c8d169fb2fc280..d02edb05910e089c360bfec34fc3e6dbc1bd1619 100644 (file)
@@ -938,7 +938,8 @@ txx9dmac_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
        return &first->txd;
 }
 
-static int txx9dmac_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd)
+static int txx9dmac_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
+                           unsigned long arg)
 {
        struct txx9dmac_chan *dc = to_txx9dmac_chan(chan);
        struct txx9dmac_desc *desc, *_desc;
index ae6d24ba4f081cd7a77cc3dc04f8df9016a8e19b..fd2d24f814783e33f4dea0898b304d2ccc029c97 100644 (file)
@@ -578,7 +578,7 @@ static void atmci_stop_dma(struct atmel_mci *host)
        struct dma_chan *chan = host->data_chan;
 
        if (chan) {
-               chan->device->device_control(chan, DMA_TERMINATE_ALL);
+         chan->device->device_control(chan, DMA_TERMINATE_ALL, 0);
                atmci_dma_cleanup(host);
        } else {
                /* Data transfer was stopped by the interrupt handler */
index 690988237971d7a01fbddb6c22b64dc60deaefda..882f3d5ed028fcd8f3cb7249de8f32f3abf4e3e5 100644 (file)
@@ -1087,7 +1087,7 @@ static void work_fn_rx(struct work_struct *work)
                unsigned long flags;
                int count;
 
-               chan->device->device_control(chan, DMA_TERMINATE_ALL);
+               chan->device->device_control(chan, DMA_TERMINATE_ALL, 0);
                dev_dbg(port->dev, "Read %u bytes with cookie %d\n",
                        sh_desc->partial, sh_desc->cookie);
 
index 3aa50bc276ebad7c30ab9710bce103af812a0d7a..7cfc170bce196d28492fd4f4bbc5d9aace16ce31 100644 (file)
@@ -388,7 +388,7 @@ static void sdc_disable_channel(struct mx3fb_info *mx3_fbi)
        spin_unlock_irqrestore(&mx3fb->lock, flags);
 
        mx3_fbi->txd->chan->device->device_control(mx3_fbi->txd->chan,
-                                                  DMA_TERMINATE_ALL);
+                                                  DMA_TERMINATE_ALL, 0);
        mx3_fbi->txd = NULL;
        mx3_fbi->cookie = -EINVAL;
 }
index 50b7b3e0d572aaac92d16da4934d8522896b198a..17456571ff7a66fd9b71f301b4f7a06f458d4ea9 100644 (file)
@@ -347,7 +347,8 @@ struct dma_device {
                struct dma_chan *chan, struct scatterlist *sgl,
                unsigned int sg_len, enum dma_data_direction direction,
                unsigned long flags);
-       int (*device_control)(struct dma_chan *chan, enum dma_ctrl_cmd cmd);
+       int (*device_control)(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
+               unsigned long arg);
 
        enum dma_status (*device_tx_status)(struct dma_chan *chan,
                                            dma_cookie_t cookie,
index b35d00706c0eb21bb40afd6857447d783e8b7557..9398f507f77f665b0744e7953836809349d338b7 100644 (file)
@@ -159,7 +159,7 @@ static void txx9aclc_dma_tasklet(unsigned long data)
                void __iomem *base = drvdata->base;
 
                spin_unlock_irqrestore(&dmadata->dma_lock, flags);
-               chan->device->device_control(chan, DMA_TERMINATE_ALL);
+               chan->device->device_control(chan, DMA_TERMINATE_ALL, 0);
                /* first time */
                for (i = 0; i < NR_DMA_CHAIN; i++) {
                        desc = txx9aclc_dma_submit(dmadata,
@@ -267,7 +267,7 @@ static int txx9aclc_pcm_close(struct snd_pcm_substream *substream)
        struct dma_chan *chan = dmadata->dma_chan;
 
        dmadata->frag_count = -1;
-       chan->device->device_control(chan, DMA_TERMINATE_ALL);
+       chan->device->device_control(chan, DMA_TERMINATE_ALL, 0);
        return 0;
 }
 
@@ -396,7 +396,8 @@ static int txx9aclc_pcm_remove(struct platform_device *pdev)
                struct dma_chan *chan = dmadata->dma_chan;
                if (chan) {
                        dmadata->frag_count = -1;
-                       chan->device->device_control(chan, DMA_TERMINATE_ALL);
+                       chan->device->device_control(chan,
+                                                    DMA_TERMINATE_ALL, 0);
                        dma_release_channel(chan);
                }
                dev->dmadata[i].dma_chan = NULL;