diff options
author | Christopher Freeman <cfreeman@nvidia.com> | 2015-03-04 01:16:58 -0800 |
---|---|---|
committer | Vinod Koul <vinod.koul@intel.com> | 2015-04-29 16:47:57 +0530 |
commit | 63f89caad0e32dcfa17b2d17919816253de48996 (patch) | |
tree | 28329a099239bd98a4c53e3f153b5c53083247f9 /drivers/dma/dmaengine.c | |
parent | 801661467fd50832191c81665d061ffabcc1c5de (diff) | |
download | linux-exynos-63f89caad0e32dcfa17b2d17919816253de48996.tar.gz linux-exynos-63f89caad0e32dcfa17b2d17919816253de48996.tar.bz2 linux-exynos-63f89caad0e32dcfa17b2d17919816253de48996.zip |
dmaengine: increment privatecnt when using dma_get_any_slave_channel
Channels allocated via dma_get_any_slave_channel were not increasing
the counter tracking private allocations. When these channels were
released, privatecnt may erroneously fall to zero. The DMA device
would then lose its DMA_PRIVATE cap and fail to allocate future private
channels (via private_candidate) as any allocations still outstanding
would incorrectly be seen as public allocations.
Signed-off-by: Christopher Freeman <cfreeman@nvidia.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Diffstat (limited to 'drivers/dma/dmaengine.c')
-rw-r--r-- | drivers/dma/dmaengine.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c index 0e035a8cf401..2890d744bb1b 100644 --- a/drivers/dma/dmaengine.c +++ b/drivers/dma/dmaengine.c @@ -571,11 +571,15 @@ struct dma_chan *dma_get_any_slave_channel(struct dma_device *device) chan = private_candidate(&mask, device, NULL, NULL); if (chan) { + dma_cap_set(DMA_PRIVATE, device->cap_mask); + device->privatecnt++; err = dma_chan_get(chan); if (err) { pr_debug("%s: failed to get %s: (%d)\n", __func__, dma_chan_name(chan), err); chan = NULL; + if (--device->privatecnt == 0) + dma_cap_clear(DMA_PRIVATE, device->cap_mask); } } |