summaryrefslogtreecommitdiff
path: root/patches.tizen/0792-dmaengine-add-interface-of-dma_get_slave_channel.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches.tizen/0792-dmaengine-add-interface-of-dma_get_slave_channel.patch')
-rw-r--r--patches.tizen/0792-dmaengine-add-interface-of-dma_get_slave_channel.patch85
1 files changed, 85 insertions, 0 deletions
diff --git a/patches.tizen/0792-dmaengine-add-interface-of-dma_get_slave_channel.patch b/patches.tizen/0792-dmaengine-add-interface-of-dma_get_slave_channel.patch
new file mode 100644
index 00000000000..dccc5a3aa39
--- /dev/null
+++ b/patches.tizen/0792-dmaengine-add-interface-of-dma_get_slave_channel.patch
@@ -0,0 +1,85 @@
+From 29ab5447cac6828d168346db5134ffa049e165f5 Mon Sep 17 00:00:00 2001
+From: Zhangfei Gao <zhangfei.gao@linaro.org>
+Date: Fri, 28 Jun 2013 20:39:12 +0800
+Subject: [PATCH 0792/1302] dmaengine: add interface of dma_get_slave_channel
+
+Suggested by Arnd, add dma_get_slave_channel interface
+Dma host driver could get specific channel specificied by request line, rather than filter.
+
+host example:
+static struct dma_chan *xx_of_dma_simple_xlate(struct of_phandle_args *dma_spec,
+ struct of_dma *ofdma)
+{
+ struct xx_dma_dev *d = ofdma->of_dma_data;
+ unsigned int request = dma_spec->args[0];
+
+ if (request > d->dma_requests)
+ return NULL;
+
+ return dma_get_slave_channel(&(d->chans[request].vc.chan));
+}
+
+probe:
+of_dma_controller_register((&op->dev)->of_node, xx_of_dma_simple_xlate, d);
+
+Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org>
+Acked-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Vinod Koul <vinod.koul@intel.com>
+Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
+---
+ drivers/dma/dmaengine.c | 26 ++++++++++++++++++++++++++
+ include/linux/dmaengine.h | 1 +
+ 2 files changed, 27 insertions(+)
+
+diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c
+index 93f7992..78dbbe0 100644
+--- a/drivers/dma/dmaengine.c
++++ b/drivers/dma/dmaengine.c
+@@ -504,6 +504,32 @@ static struct dma_chan *private_candidate(const dma_cap_mask_t *mask,
+ }
+
+ /**
++ * dma_request_channel - try to get specific channel exclusively
++ * @chan: target channel
++ */
++struct dma_chan *dma_get_slave_channel(struct dma_chan *chan)
++{
++ int err = -EBUSY;
++
++ /* lock against __dma_request_channel */
++ mutex_lock(&dma_list_mutex);
++
++ if (chan->client_count == 0)
++ err = dma_chan_get(chan);
++ else
++ chan = NULL;
++
++ mutex_unlock(&dma_list_mutex);
++
++ if (err)
++ pr_debug("%s: failed to get %s: (%d)\n",
++ __func__, dma_chan_name(chan), err);
++
++ return chan;
++}
++EXPORT_SYMBOL_GPL(dma_get_slave_channel);
++
++/**
+ * dma_request_channel - try to allocate an exclusive channel
+ * @mask: capabilities that the channel must satisfy
+ * @fn: optional callback to disposition available channels
+diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h
+index 5642335..99b4f59 100644
+--- a/include/linux/dmaengine.h
++++ b/include/linux/dmaengine.h
+@@ -1044,6 +1044,7 @@ int dma_async_device_register(struct dma_device *device);
+ void dma_async_device_unregister(struct dma_device *device);
+ void dma_run_dependencies(struct dma_async_tx_descriptor *tx);
+ struct dma_chan *dma_find_channel(enum dma_transaction_type tx_type);
++struct dma_chan *dma_get_slave_channel(struct dma_chan *chan);
+ struct dma_chan *net_dma_find_channel(void);
+ #define dma_request_channel(mask, x, y) __dma_request_channel(&(mask), x, y)
+ #define dma_request_slave_channel_compat(mask, x, y, dev, name) \
+--
+1.8.3.2
+