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

While we're at it, remove the useless prep_sg callback.

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

index 38821cdf862b6c7473ced93c1a1f48f5db4fc42a..b891079a166d6f2ace7f30995bec227448c7a837 100644 (file)
@@ -941,37 +941,8 @@ fail:
        return NULL;
 }
 
-/**
- * fsl_dma_prep_slave_sg - prepare descriptors for a DMA_SLAVE transaction
- * @chan: DMA channel
- * @sgl: scatterlist to transfer to/from
- * @sg_len: number of entries in @scatterlist
- * @direction: DMA direction
- * @flags: DMAEngine flags
- * @context: transaction context (ignored)
- *
- * Prepare a set of descriptors for a DMA_SLAVE transaction. Following the
- * DMA_SLAVE API, this gets the device-specific information from the
- * chan->private variable.
- */
-static struct dma_async_tx_descriptor *fsl_dma_prep_slave_sg(
-       struct dma_chan *dchan, struct scatterlist *sgl, unsigned int sg_len,
-       enum dma_transfer_direction direction, unsigned long flags,
-       void *context)
-{
-       /*
-        * This operation is not supported on the Freescale DMA controller
-        *
-        * However, we need to provide the function pointer to allow the
-        * device_control() method to work.
-        */
-       return NULL;
-}
-
-static int fsl_dma_device_control(struct dma_chan *dchan,
-                                 enum dma_ctrl_cmd cmd, unsigned long arg)
+static int fsl_dma_device_terminate_all(struct dma_chan *dchan)
 {
-       struct dma_slave_config *config;
        struct fsldma_chan *chan;
        int size;
 
@@ -980,45 +951,47 @@ static int fsl_dma_device_control(struct dma_chan *dchan,
 
        chan = to_fsl_chan(dchan);
 
-       switch (cmd) {
-       case DMA_TERMINATE_ALL:
-               spin_lock_bh(&chan->desc_lock);
-
-               /* Halt the DMA engine */
-               dma_halt(chan);
+       spin_lock_bh(&chan->desc_lock);
 
-               /* Remove and free all of the descriptors in the LD queue */
-               fsldma_free_desc_list(chan, &chan->ld_pending);
-               fsldma_free_desc_list(chan, &chan->ld_running);
-               fsldma_free_desc_list(chan, &chan->ld_completed);
-               chan->idle = true;
+       /* Halt the DMA engine */
+       dma_halt(chan);
 
-               spin_unlock_bh(&chan->desc_lock);
-               return 0;
+       /* Remove and free all of the descriptors in the LD queue */
+       fsldma_free_desc_list(chan, &chan->ld_pending);
+       fsldma_free_desc_list(chan, &chan->ld_running);
+       fsldma_free_desc_list(chan, &chan->ld_completed);
+       chan->idle = true;
 
-       case DMA_SLAVE_CONFIG:
-               config = (struct dma_slave_config *)arg;
+       spin_unlock_bh(&chan->desc_lock);
+       return 0;
+}
 
-               /* make sure the channel supports setting burst size */
-               if (!chan->set_request_count)
-                       return -ENXIO;
+static int fsl_dma_device_config(struct dma_chan *dchan,
+                                struct dma_slave_config *config)
+{
+       struct fsldma_chan *chan;
+       int size;
 
-               /* we set the controller burst size depending on direction */
-               if (config->direction == DMA_MEM_TO_DEV)
-                       size = config->dst_addr_width * config->dst_maxburst;
-               else
-                       size = config->src_addr_width * config->src_maxburst;
+       if (!dchan)
+               return -EINVAL;
 
-               chan->set_request_count(chan, size);
-               return 0;
+       chan = to_fsl_chan(dchan);
 
-       default:
+       /* make sure the channel supports setting burst size */
+       if (!chan->set_request_count)
                return -ENXIO;
-       }
 
+       /* we set the controller burst size depending on direction */
+       if (config->direction == DMA_MEM_TO_DEV)
+               size = config->dst_addr_width * config->dst_maxburst;
+       else
+               size = config->src_addr_width * config->src_maxburst;
+
+       chan->set_request_count(chan, size);
        return 0;
 }
 
+
 /**
  * fsl_dma_memcpy_issue_pending - Issue the DMA start command
  * @chan : Freescale DMA channel
@@ -1395,8 +1368,8 @@ static int fsldma_of_probe(struct platform_device *op)
        fdev->common.device_prep_dma_sg = fsl_dma_prep_sg;
        fdev->common.device_tx_status = fsl_tx_status;
        fdev->common.device_issue_pending = fsl_dma_memcpy_issue_pending;
-       fdev->common.device_prep_slave_sg = fsl_dma_prep_slave_sg;
-       fdev->common.device_control = fsl_dma_device_control;
+       fdev->common.device_config = fsl_dma_device_config;
+       fdev->common.device_terminate_all = fsl_dma_device_terminate_all;
        fdev->common.dev = &op->dev;
 
        dma_set_mask(&(op->dev), DMA_BIT_MASK(36));