12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- From d2f4f99db3e9ec8b063cf2e45704e2bb95428317 Mon Sep 17 00:00:00 2001
- From: Maxime Ripard <maxime.ripard@free-electrons.com>
- Date: Mon, 17 Nov 2014 14:41:58 +0100
- Subject: [PATCH] dmaengine: Rework dma_chan_get
- 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 | 36 +++++++++++++++++++-----------------
- 1 file changed, 19 insertions(+), 17 deletions(-)
- --- a/drivers/dma/dmaengine.c
- +++ b/drivers/dma/dmaengine.c
- @@ -222,31 +222,33 @@ static void balance_ref_count(struct dma
- */
- 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);
- - }
- -
- - return err;
- + ret = chan->device->device_alloc_chan_resources(chan);
- + if (ret < 0)
- + goto err_out;
- +
- + 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;
- }
-
- /**
|