OSDN Git Service

dmaengine: mmp-pdma: Split device_control
authorMaxime Ripard <maxime.ripard@free-electrons.com>
Mon, 17 Nov 2014 13:42:21 +0000 (14:42 +0100)
committerVinod Koul <vinod.koul@intel.com>
Mon, 22 Dec 2014 06:59:00 +0000 (12:29 +0530)
Split the device_control callback of the Marvell MMP PDMA driver to make use
of the newly introduced callbacks, that will eventually be used to retrieve
slave capabilities.

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
drivers/dma/mmp_pdma.c

index 8b8952f..8926f27 100644 (file)
@@ -683,68 +683,70 @@ fail:
        return NULL;
 }
 
-static int mmp_pdma_control(struct dma_chan *dchan, enum dma_ctrl_cmd cmd,
-                           unsigned long arg)
+static int mmp_pdma_config(struct dma_chan *dchan,
+                          struct dma_slave_config *cfg)
 {
        struct mmp_pdma_chan *chan = to_mmp_pdma_chan(dchan);
-       struct dma_slave_config *cfg = (void *)arg;
-       unsigned long flags;
        u32 maxburst = 0, addr = 0;
        enum dma_slave_buswidth width = DMA_SLAVE_BUSWIDTH_UNDEFINED;
 
        if (!dchan)
                return -EINVAL;
 
-       switch (cmd) {
-       case DMA_TERMINATE_ALL:
-               disable_chan(chan->phy);
-               mmp_pdma_free_phy(chan);
-               spin_lock_irqsave(&chan->desc_lock, flags);
-               mmp_pdma_free_desc_list(chan, &chan->chain_pending);
-               mmp_pdma_free_desc_list(chan, &chan->chain_running);
-               spin_unlock_irqrestore(&chan->desc_lock, flags);
-               chan->idle = true;
-               break;
-       case DMA_SLAVE_CONFIG:
-               if (cfg->direction == DMA_DEV_TO_MEM) {
-                       chan->dcmd = DCMD_INCTRGADDR | DCMD_FLOWSRC;
-                       maxburst = cfg->src_maxburst;
-                       width = cfg->src_addr_width;
-                       addr = cfg->src_addr;
-               } else if (cfg->direction == DMA_MEM_TO_DEV) {
-                       chan->dcmd = DCMD_INCSRCADDR | DCMD_FLOWTRG;
-                       maxburst = cfg->dst_maxburst;
-                       width = cfg->dst_addr_width;
-                       addr = cfg->dst_addr;
-               }
-
-               if (width == DMA_SLAVE_BUSWIDTH_1_BYTE)
-                       chan->dcmd |= DCMD_WIDTH1;
-               else if (width == DMA_SLAVE_BUSWIDTH_2_BYTES)
-                       chan->dcmd |= DCMD_WIDTH2;
-               else if (width == DMA_SLAVE_BUSWIDTH_4_BYTES)
-                       chan->dcmd |= DCMD_WIDTH4;
-
-               if (maxburst == 8)
-                       chan->dcmd |= DCMD_BURST8;
-               else if (maxburst == 16)
-                       chan->dcmd |= DCMD_BURST16;
-               else if (maxburst == 32)
-                       chan->dcmd |= DCMD_BURST32;
-
-               chan->dir = cfg->direction;
-               chan->dev_addr = addr;
-               /* FIXME: drivers should be ported over to use the filter
-                * function. Once that's done, the following two lines can
-                * be removed.
-                */
-               if (cfg->slave_id)
-                       chan->drcmr = cfg->slave_id;
-               break;
-       default:
-               return -ENOSYS;
+       if (cfg->direction == DMA_DEV_TO_MEM) {
+               chan->dcmd = DCMD_INCTRGADDR | DCMD_FLOWSRC;
+               maxburst = cfg->src_maxburst;
+               width = cfg->src_addr_width;
+               addr = cfg->src_addr;
+       } else if (cfg->direction == DMA_MEM_TO_DEV) {
+               chan->dcmd = DCMD_INCSRCADDR | DCMD_FLOWTRG;
+               maxburst = cfg->dst_maxburst;
+               width = cfg->dst_addr_width;
+               addr = cfg->dst_addr;
        }
 
+       if (width == DMA_SLAVE_BUSWIDTH_1_BYTE)
+               chan->dcmd |= DCMD_WIDTH1;
+       else if (width == DMA_SLAVE_BUSWIDTH_2_BYTES)
+               chan->dcmd |= DCMD_WIDTH2;
+       else if (width == DMA_SLAVE_BUSWIDTH_4_BYTES)
+               chan->dcmd |= DCMD_WIDTH4;
+
+       if (maxburst == 8)
+               chan->dcmd |= DCMD_BURST8;
+       else if (maxburst == 16)
+               chan->dcmd |= DCMD_BURST16;
+       else if (maxburst == 32)
+               chan->dcmd |= DCMD_BURST32;
+
+       chan->dir = cfg->direction;
+       chan->dev_addr = addr;
+       /* FIXME: drivers should be ported over to use the filter
+        * function. Once that's done, the following two lines can
+        * be removed.
+        */
+       if (cfg->slave_id)
+               chan->drcmr = cfg->slave_id;
+
+       return 0;
+}
+
+static int mmp_pdma_terminate_all(struct dma_chan *dchan)
+{
+       struct mmp_pdma_chan *chan = to_mmp_pdma_chan(dchan);
+       unsigned long flags;
+
+       if (!dchan)
+               return -EINVAL;
+
+       disable_chan(chan->phy);
+       mmp_pdma_free_phy(chan);
+       spin_lock_irqsave(&chan->desc_lock, flags);
+       mmp_pdma_free_desc_list(chan, &chan->chain_pending);
+       mmp_pdma_free_desc_list(chan, &chan->chain_running);
+       spin_unlock_irqrestore(&chan->desc_lock, flags);
+       chan->idle = true;
+
        return 0;
 }
 
@@ -1061,7 +1063,8 @@ static int mmp_pdma_probe(struct platform_device *op)
        pdev->device.device_prep_slave_sg = mmp_pdma_prep_slave_sg;
        pdev->device.device_prep_dma_cyclic = mmp_pdma_prep_dma_cyclic;
        pdev->device.device_issue_pending = mmp_pdma_issue_pending;
-       pdev->device.device_control = mmp_pdma_control;
+       pdev->device.device_config = mmp_pdma_config;
+       pdev->device.device_terminate_all = mmp_pdma_terminate_all;
        pdev->device.copy_align = PDMA_ALIGNMENT;
 
        if (pdev->dev->coherent_dma_mask)