diff options
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.patch | 85 |
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 + |