dmaengine: Rework dma_chan_get
authorMaxime Ripard <maxime.ripard@free-electrons.com>
Mon, 17 Nov 2014 13:41:58 +0000 (14:41 +0100)
committerVinod Koul <vinod.koul@intel.com>
Mon, 22 Dec 2014 06:58:55 +0000 (12:28 +0530)
dma_chan_get uses a rather interesting error handling and code path.

Change it to something more usual in the kernel.

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
drivers/dma/dmaengine.c

index e057935e3023194a108d4ab69c53796a5bc4605b..a5da0e147560c5bada91b3f7dae1a9d038001eaf 100644 (file)
@@ -222,31 +222,33 @@ static void balance_ref_count(struct dma_chan *chan)
  */
 static int dma_chan_get(struct dma_chan *chan)
 {
-       int err = -ENODEV;
        struct module *owner = dma_chan_to_owner(chan);
+       int ret;
 
+       /* The channel is already in use, update client count */
        if (chan->client_count) {
                __module_get(owner);
-               err = 0;
-       } else if (try_module_get(owner))
-               err = 0;
+               goto out;
+       }
 
-       if (err == 0)
-               chan->client_count++;
+       if (!try_module_get(owner))
+               return -ENODEV;
 
        /* allocate upon first client reference */
-       if (chan->client_count == 1 && err == 0) {
-               int desc_cnt = chan->device->device_alloc_chan_resources(chan);
-
-               if (desc_cnt < 0) {
-                       err = desc_cnt;
-                       chan->client_count = 0;
-                       module_put(owner);
-               } else if (!dma_has_cap(DMA_PRIVATE, chan->device->cap_mask))
-                       balance_ref_count(chan);
-       }
+       ret = chan->device->device_alloc_chan_resources(chan);
+       if (ret < 0)
+               goto err_out;
 
-       return err;
+       if (!dma_has_cap(DMA_PRIVATE, chan->device->cap_mask))
+               balance_ref_count(chan);
+
+out:
+       chan->client_count++;
+       return 0;
+
+err_out:
+       module_put(owner);
+       return ret;
 }
 
 /**