fw-utils/tplink-safeloader.c: Add support for Archer C2600
[openwrt/staging/chunkeey.git] / target / linux / ipq806x / patches-3.18 / 153-dmaengine-Introduce-a-device_config-callback.patch
1 From 94a73e30dfe6722e9f4ef19f7892901d7d00eab1 Mon Sep 17 00:00:00 2001
2 From: Maxime Ripard <maxime.ripard@free-electrons.com>
3 Date: Mon, 17 Nov 2014 14:42:00 +0100
4 Subject: [PATCH] dmaengine: Introduce a device_config callback
5
6 The fact that the channel configuration is done in device_control is rather
7 misleading, since it's not really advertised as such, plus, the fact that the
8 framework exposes a function of its own makes it not really intuitive, while
9 we're losing the type checking whenever we pass that unsigned long argument.
10
11 Add a device_config callback to dma_device, with a fallback on the old
12 behaviour for now for existing drivers to opt in.
13
14 Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
15 Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
16 Signed-off-by: Vinod Koul <vinod.koul@intel.com>
17 ---
18 include/linux/dmaengine.h | 8 ++++++++
19 1 file changed, 8 insertions(+)
20
21 --- a/include/linux/dmaengine.h
22 +++ b/include/linux/dmaengine.h
23 @@ -607,6 +607,8 @@ struct dma_tx_state {
24 * The function takes a buffer of size buf_len. The callback function will
25 * be called after period_len bytes have been transferred.
26 * @device_prep_interleaved_dma: Transfer expression in a generic way.
27 + * @device_config: Pushes a new configuration to a channel, return 0 or an error
28 + * code
29 * @device_control: manipulate all pending operations on a channel, returns
30 * zero or error code
31 * @device_tx_status: poll for transaction completion, the optional
32 @@ -673,6 +675,9 @@ struct dma_device {
33 struct dma_async_tx_descriptor *(*device_prep_interleaved_dma)(
34 struct dma_chan *chan, struct dma_interleaved_template *xt,
35 unsigned long flags);
36 +
37 + int (*device_config)(struct dma_chan *chan,
38 + struct dma_slave_config *config);
39 int (*device_control)(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
40 unsigned long arg);
41
42 @@ -696,6 +701,9 @@ static inline int dmaengine_device_contr
43 static inline int dmaengine_slave_config(struct dma_chan *chan,
44 struct dma_slave_config *config)
45 {
46 + if (chan->device->device_config)
47 + return chan->device->device_config(chan, config);
48 +
49 return dmaengine_device_control(chan, DMA_SLAVE_CONFIG,
50 (unsigned long)config);
51 }