dmaengine: d40: Split device_control
authorMaxime Ripard <maxime.ripard@free-electrons.com>
Mon, 17 Nov 2014 13:42:36 +0000 (14:42 +0100)
committerVinod Koul <vinod.koul@intel.com>
Mon, 22 Dec 2014 07:03:21 +0000 (12:33 +0530)
Split the device_control callback of the ST-Ericsson DMA 40 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>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
drivers/dma/ste_dma40.c

index 15d49461c0d2c4b32eddc650ccfb8c1ceb78308b..e5a284865e9270e4e022449fdfa5dbdb63f7d346 100644 (file)
@@ -1429,11 +1429,17 @@ static bool d40_tx_is_linked(struct d40_chan *d40c)
        return is_link;
 }
 
-static int d40_pause(struct d40_chan *d40c)
+static int d40_pause(struct dma_chan *chan)
 {
+       struct d40_chan *d40c = container_of(chan, struct d40_chan, chan);
        int res = 0;
        unsigned long flags;
 
+       if (d40c->phy_chan == NULL) {
+               chan_err(d40c, "Channel is not allocated!\n");
+               return -EINVAL;
+       }
+
        if (!d40c->busy)
                return 0;
 
@@ -1448,11 +1454,17 @@ static int d40_pause(struct d40_chan *d40c)
        return res;
 }
 
-static int d40_resume(struct d40_chan *d40c)
+static int d40_resume(struct dma_chan *chan)
 {
+       struct d40_chan *d40c = container_of(chan, struct d40_chan, chan);
        int res = 0;
        unsigned long flags;
 
+       if (d40c->phy_chan == NULL) {
+               chan_err(d40c, "Channel is not allocated!\n");
+               return -EINVAL;
+       }
+
        if (!d40c->busy)
                return 0;
 
@@ -2610,6 +2622,11 @@ static void d40_terminate_all(struct dma_chan *chan)
        struct d40_chan *d40c = container_of(chan, struct d40_chan, chan);
        int ret;
 
+       if (d40c->phy_chan == NULL) {
+               chan_err(d40c, "Channel is not allocated!\n");
+               return -EINVAL;
+       }
+
        spin_lock_irqsave(&d40c->lock, flags);
 
        pm_runtime_get_sync(d40c->base->dev);
@@ -2673,6 +2690,11 @@ static int d40_set_runtime_config(struct dma_chan *chan,
        u32 src_maxburst, dst_maxburst;
        int ret;
 
+       if (d40c->phy_chan == NULL) {
+               chan_err(d40c, "Channel is not allocated!\n");
+               return -EINVAL;
+       }
+
        src_addr_width = config->src_addr_width;
        src_maxburst = config->src_maxburst;
        dst_addr_width = config->dst_addr_width;
@@ -2781,35 +2803,6 @@ static int d40_set_runtime_config(struct dma_chan *chan,
        return 0;
 }
 
-static int d40_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
-                      unsigned long arg)
-{
-       struct d40_chan *d40c = container_of(chan, struct d40_chan, chan);
-
-       if (d40c->phy_chan == NULL) {
-               chan_err(d40c, "Channel is not allocated!\n");
-               return -EINVAL;
-       }
-
-       switch (cmd) {
-       case DMA_TERMINATE_ALL:
-               d40_terminate_all(chan);
-               return 0;
-       case DMA_PAUSE:
-               return d40_pause(d40c);
-       case DMA_RESUME:
-               return d40_resume(d40c);
-       case DMA_SLAVE_CONFIG:
-               return d40_set_runtime_config(chan,
-                       (struct dma_slave_config *) arg);
-       default:
-               break;
-       }
-
-       /* Other commands are unimplemented */
-       return -ENXIO;
-}
-
 /* Initialization functions */
 
 static void __init d40_chan_init(struct d40_base *base, struct dma_device *dma,
@@ -2870,7 +2863,10 @@ static void d40_ops_init(struct d40_base *base, struct dma_device *dev)
        dev->device_free_chan_resources = d40_free_chan_resources;
        dev->device_issue_pending = d40_issue_pending;
        dev->device_tx_status = d40_tx_status;
-       dev->device_control = d40_control;
+       dev->device_config = d40_set_runtime_config;
+       dev->device_pause = d40_pause;
+       dev->device_resume = d40_resume;
+       dev->device_terminate_all = d40_terminate_all;
        dev->dev = base->dev;
 }