diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-27 22:04:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-27 22:04:36 -0400 |
commit | e3e1288e86a07cdeb0aee5860a2dff111c6eff79 (patch) | |
tree | cd22f8051a456c9d2b95698b6fe402776a67469b /arch/arm/plat-nomadik | |
parent | 9ae6d039224def926656206725ae6e89d1331417 (diff) | |
parent | 964dc256bb91e990277010a3f6dc66daa130be8b (diff) |
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx
* 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx: (48 commits)
DMAENGINE: move COH901318 to arch_initcall
dma: imx-dma: fix signedness bug
dma/timberdale: simplify conditional
ste_dma40: remove channel_type
ste_dma40: remove enum for endianess
ste_dma40: remove TIM_FOR_LINK option
ste_dma40: move mode_opt to separate config
ste_dma40: move channel mode to a separate field
ste_dma40: move priority to separate field
ste_dma40: add variable to indicate valid dma_cfg
async_tx: make async_tx channel switching opt-in
move async raid6 test to lib/Kconfig.debug
dmaengine: Add Freescale i.MX1/21/27 DMA driver
intel_mid_dma: change the slave interface
intel_mid_dma: fix the WARN_ONs
intel_mid_dma: Add sg list support to DMA driver
intel_mid_dma: Allow DMAC2 to share interrupt
intel_mid_dma: Allow IRQ sharing
intel_mid_dma: Add runtime PM support
DMAENGINE: define a dummy filter function for ste_dma40
...
Diffstat (limited to 'arch/arm/plat-nomadik')
-rw-r--r-- | arch/arm/plat-nomadik/include/plat/ste_dma40.h | 134 |
1 files changed, 60 insertions, 74 deletions
diff --git a/arch/arm/plat-nomadik/include/plat/ste_dma40.h b/arch/arm/plat-nomadik/include/plat/ste_dma40.h index 93a812672d9a..74b62f10d07f 100644 --- a/arch/arm/plat-nomadik/include/plat/ste_dma40.h +++ b/arch/arm/plat-nomadik/include/plat/ste_dma40.h | |||
@@ -1,10 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * arch/arm/plat-nomadik/include/plat/ste_dma40.h | 2 | * Copyright (C) ST-Ericsson SA 2007-2010 |
3 | * | 3 | * Author: Per Forlin <per.forlin@stericsson.com> for ST-Ericsson |
4 | * Copyright (C) ST-Ericsson 2007-2010 | 4 | * Author: Jonas Aaberg <jonas.aberg@stericsson.com> for ST-Ericsson |
5 | * License terms: GNU General Public License (GPL) version 2 | 5 | * License terms: GNU General Public License (GPL) version 2 |
6 | * Author: Per Friden <per.friden@stericsson.com> | ||
7 | * Author: Jonas Aaberg <jonas.aberg@stericsson.com> | ||
8 | */ | 6 | */ |
9 | 7 | ||
10 | 8 | ||
@@ -19,37 +17,20 @@ | |||
19 | #define STEDMA40_DEV_DST_MEMORY (-1) | 17 | #define STEDMA40_DEV_DST_MEMORY (-1) |
20 | #define STEDMA40_DEV_SRC_MEMORY (-1) | 18 | #define STEDMA40_DEV_SRC_MEMORY (-1) |
21 | 19 | ||
22 | /* | 20 | enum stedma40_mode { |
23 | * Description of bitfields of channel_type variable is available in | 21 | STEDMA40_MODE_LOGICAL = 0, |
24 | * the info structure. | 22 | STEDMA40_MODE_PHYSICAL, |
25 | */ | 23 | STEDMA40_MODE_OPERATION, |
24 | }; | ||
26 | 25 | ||
27 | /* Priority */ | 26 | enum stedma40_mode_opt { |
28 | #define STEDMA40_INFO_PRIO_TYPE_POS 2 | 27 | STEDMA40_PCHAN_BASIC_MODE = 0, |
29 | #define STEDMA40_HIGH_PRIORITY_CHANNEL (0x1 << STEDMA40_INFO_PRIO_TYPE_POS) | 28 | STEDMA40_LCHAN_SRC_LOG_DST_LOG = 0, |
30 | #define STEDMA40_LOW_PRIORITY_CHANNEL (0x2 << STEDMA40_INFO_PRIO_TYPE_POS) | 29 | STEDMA40_PCHAN_MODULO_MODE, |
31 | 30 | STEDMA40_PCHAN_DOUBLE_DST_MODE, | |
32 | /* Mode */ | 31 | STEDMA40_LCHAN_SRC_PHY_DST_LOG, |
33 | #define STEDMA40_INFO_CH_MODE_TYPE_POS 6 | 32 | STEDMA40_LCHAN_SRC_LOG_DST_PHY, |
34 | #define STEDMA40_CHANNEL_IN_PHY_MODE (0x1 << STEDMA40_INFO_CH_MODE_TYPE_POS) | 33 | }; |
35 | #define STEDMA40_CHANNEL_IN_LOG_MODE (0x2 << STEDMA40_INFO_CH_MODE_TYPE_POS) | ||
36 | #define STEDMA40_CHANNEL_IN_OPER_MODE (0x3 << STEDMA40_INFO_CH_MODE_TYPE_POS) | ||
37 | |||
38 | /* Mode options */ | ||
39 | #define STEDMA40_INFO_CH_MODE_OPT_POS 8 | ||
40 | #define STEDMA40_PCHAN_BASIC_MODE (0x1 << STEDMA40_INFO_CH_MODE_OPT_POS) | ||
41 | #define STEDMA40_PCHAN_MODULO_MODE (0x2 << STEDMA40_INFO_CH_MODE_OPT_POS) | ||
42 | #define STEDMA40_PCHAN_DOUBLE_DST_MODE (0x3 << STEDMA40_INFO_CH_MODE_OPT_POS) | ||
43 | #define STEDMA40_LCHAN_SRC_PHY_DST_LOG (0x1 << STEDMA40_INFO_CH_MODE_OPT_POS) | ||
44 | #define STEDMA40_LCHAN_SRC_LOG_DST_PHS (0x2 << STEDMA40_INFO_CH_MODE_OPT_POS) | ||
45 | #define STEDMA40_LCHAN_SRC_LOG_DST_LOG (0x3 << STEDMA40_INFO_CH_MODE_OPT_POS) | ||
46 | |||
47 | /* Interrupt */ | ||
48 | #define STEDMA40_INFO_TIM_POS 10 | ||
49 | #define STEDMA40_NO_TIM_FOR_LINK (0x0 << STEDMA40_INFO_TIM_POS) | ||
50 | #define STEDMA40_TIM_FOR_LINK (0x1 << STEDMA40_INFO_TIM_POS) | ||
51 | |||
52 | /* End of channel_type configuration */ | ||
53 | 34 | ||
54 | #define STEDMA40_ESIZE_8_BIT 0x0 | 35 | #define STEDMA40_ESIZE_8_BIT 0x0 |
55 | #define STEDMA40_ESIZE_16_BIT 0x1 | 36 | #define STEDMA40_ESIZE_16_BIT 0x1 |
@@ -72,16 +53,14 @@ | |||
72 | #define STEDMA40_PSIZE_LOG_8 STEDMA40_PSIZE_PHY_8 | 53 | #define STEDMA40_PSIZE_LOG_8 STEDMA40_PSIZE_PHY_8 |
73 | #define STEDMA40_PSIZE_LOG_16 STEDMA40_PSIZE_PHY_16 | 54 | #define STEDMA40_PSIZE_LOG_16 STEDMA40_PSIZE_PHY_16 |
74 | 55 | ||
56 | /* Maximum number of possible physical channels */ | ||
57 | #define STEDMA40_MAX_PHYS 32 | ||
58 | |||
75 | enum stedma40_flow_ctrl { | 59 | enum stedma40_flow_ctrl { |
76 | STEDMA40_NO_FLOW_CTRL, | 60 | STEDMA40_NO_FLOW_CTRL, |
77 | STEDMA40_FLOW_CTRL, | 61 | STEDMA40_FLOW_CTRL, |
78 | }; | 62 | }; |
79 | 63 | ||
80 | enum stedma40_endianess { | ||
81 | STEDMA40_LITTLE_ENDIAN, | ||
82 | STEDMA40_BIG_ENDIAN | ||
83 | }; | ||
84 | |||
85 | enum stedma40_periph_data_width { | 64 | enum stedma40_periph_data_width { |
86 | STEDMA40_BYTE_WIDTH = STEDMA40_ESIZE_8_BIT, | 65 | STEDMA40_BYTE_WIDTH = STEDMA40_ESIZE_8_BIT, |
87 | STEDMA40_HALFWORD_WIDTH = STEDMA40_ESIZE_16_BIT, | 66 | STEDMA40_HALFWORD_WIDTH = STEDMA40_ESIZE_16_BIT, |
@@ -89,15 +68,8 @@ enum stedma40_periph_data_width { | |||
89 | STEDMA40_DOUBLEWORD_WIDTH = STEDMA40_ESIZE_64_BIT | 68 | STEDMA40_DOUBLEWORD_WIDTH = STEDMA40_ESIZE_64_BIT |
90 | }; | 69 | }; |
91 | 70 | ||
92 | struct stedma40_half_channel_info { | ||
93 | enum stedma40_endianess endianess; | ||
94 | enum stedma40_periph_data_width data_width; | ||
95 | int psize; | ||
96 | enum stedma40_flow_ctrl flow_ctrl; | ||
97 | }; | ||
98 | |||
99 | enum stedma40_xfer_dir { | 71 | enum stedma40_xfer_dir { |
100 | STEDMA40_MEM_TO_MEM, | 72 | STEDMA40_MEM_TO_MEM = 1, |
101 | STEDMA40_MEM_TO_PERIPH, | 73 | STEDMA40_MEM_TO_PERIPH, |
102 | STEDMA40_PERIPH_TO_MEM, | 74 | STEDMA40_PERIPH_TO_MEM, |
103 | STEDMA40_PERIPH_TO_PERIPH | 75 | STEDMA40_PERIPH_TO_PERIPH |
@@ -105,18 +77,31 @@ enum stedma40_xfer_dir { | |||
105 | 77 | ||
106 | 78 | ||
107 | /** | 79 | /** |
80 | * struct stedma40_chan_cfg - dst/src channel configuration | ||
81 | * | ||
82 | * @big_endian: true if the src/dst should be read as big endian | ||
83 | * @data_width: Data width of the src/dst hardware | ||
84 | * @p_size: Burst size | ||
85 | * @flow_ctrl: Flow control on/off. | ||
86 | */ | ||
87 | struct stedma40_half_channel_info { | ||
88 | bool big_endian; | ||
89 | enum stedma40_periph_data_width data_width; | ||
90 | int psize; | ||
91 | enum stedma40_flow_ctrl flow_ctrl; | ||
92 | }; | ||
93 | |||
94 | /** | ||
108 | * struct stedma40_chan_cfg - Structure to be filled by client drivers. | 95 | * struct stedma40_chan_cfg - Structure to be filled by client drivers. |
109 | * | 96 | * |
110 | * @dir: MEM 2 MEM, PERIPH 2 MEM , MEM 2 PERIPH, PERIPH 2 PERIPH | 97 | * @dir: MEM 2 MEM, PERIPH 2 MEM , MEM 2 PERIPH, PERIPH 2 PERIPH |
111 | * @channel_type: priority, mode, mode options and interrupt configuration. | 98 | * @high_priority: true if high-priority |
99 | * @mode: channel mode: physical, logical, or operation | ||
100 | * @mode_opt: options for the chosen channel mode | ||
112 | * @src_dev_type: Src device type | 101 | * @src_dev_type: Src device type |
113 | * @dst_dev_type: Dst device type | 102 | * @dst_dev_type: Dst device type |
114 | * @src_info: Parameters for dst half channel | 103 | * @src_info: Parameters for dst half channel |
115 | * @dst_info: Parameters for dst half channel | 104 | * @dst_info: Parameters for dst half channel |
116 | * @pre_transfer_data: Data to be passed on to the pre_transfer() function. | ||
117 | * @pre_transfer: Callback used if needed before preparation of transfer. | ||
118 | * Only called if device is set. size of bytes to transfer | ||
119 | * (in case of multiple element transfer size is size of the first element). | ||
120 | * | 105 | * |
121 | * | 106 | * |
122 | * This structure has to be filled by the client drivers. | 107 | * This structure has to be filled by the client drivers. |
@@ -125,15 +110,13 @@ enum stedma40_xfer_dir { | |||
125 | */ | 110 | */ |
126 | struct stedma40_chan_cfg { | 111 | struct stedma40_chan_cfg { |
127 | enum stedma40_xfer_dir dir; | 112 | enum stedma40_xfer_dir dir; |
128 | unsigned int channel_type; | 113 | bool high_priority; |
114 | enum stedma40_mode mode; | ||
115 | enum stedma40_mode_opt mode_opt; | ||
129 | int src_dev_type; | 116 | int src_dev_type; |
130 | int dst_dev_type; | 117 | int dst_dev_type; |
131 | struct stedma40_half_channel_info src_info; | 118 | struct stedma40_half_channel_info src_info; |
132 | struct stedma40_half_channel_info dst_info; | 119 | struct stedma40_half_channel_info dst_info; |
133 | void *pre_transfer_data; | ||
134 | int (*pre_transfer) (struct dma_chan *chan, | ||
135 | void *data, | ||
136 | int size); | ||
137 | }; | 120 | }; |
138 | 121 | ||
139 | /** | 122 | /** |
@@ -146,7 +129,6 @@ struct stedma40_chan_cfg { | |||
146 | * @memcpy_len: length of memcpy | 129 | * @memcpy_len: length of memcpy |
147 | * @memcpy_conf_phy: default configuration of physical channel memcpy | 130 | * @memcpy_conf_phy: default configuration of physical channel memcpy |
148 | * @memcpy_conf_log: default configuration of logical channel memcpy | 131 | * @memcpy_conf_log: default configuration of logical channel memcpy |
149 | * @llis_per_log: number of max linked list items per logical channel | ||
150 | * @disabled_channels: A vector, ending with -1, that marks physical channels | 132 | * @disabled_channels: A vector, ending with -1, that marks physical channels |
151 | * that are for different reasons not available for the driver. | 133 | * that are for different reasons not available for the driver. |
152 | */ | 134 | */ |
@@ -158,23 +140,10 @@ struct stedma40_platform_data { | |||
158 | u32 memcpy_len; | 140 | u32 memcpy_len; |
159 | struct stedma40_chan_cfg *memcpy_conf_phy; | 141 | struct stedma40_chan_cfg *memcpy_conf_phy; |
160 | struct stedma40_chan_cfg *memcpy_conf_log; | 142 | struct stedma40_chan_cfg *memcpy_conf_log; |
161 | unsigned int llis_per_log; | 143 | int disabled_channels[STEDMA40_MAX_PHYS]; |
162 | int disabled_channels[8]; | ||
163 | }; | 144 | }; |
164 | 145 | ||
165 | /** | 146 | #ifdef CONFIG_STE_DMA40 |
166 | * setdma40_set_psize() - Used for changing the package size of an | ||
167 | * already configured dma channel. | ||
168 | * | ||
169 | * @chan: dmaengine handle | ||
170 | * @src_psize: new package side for src. (STEDMA40_PSIZE*) | ||
171 | * @src_psize: new package side for dst. (STEDMA40_PSIZE*) | ||
172 | * | ||
173 | * returns 0 on ok, otherwise negative error number. | ||
174 | */ | ||
175 | int stedma40_set_psize(struct dma_chan *chan, | ||
176 | int src_psize, | ||
177 | int dst_psize); | ||
178 | 147 | ||
179 | /** | 148 | /** |
180 | * stedma40_filter() - Provides stedma40_chan_cfg to the | 149 | * stedma40_filter() - Provides stedma40_chan_cfg to the |
@@ -237,4 +206,21 @@ dma_async_tx_descriptor *stedma40_slave_mem(struct dma_chan *chan, | |||
237 | direction, flags); | 206 | direction, flags); |
238 | } | 207 | } |
239 | 208 | ||
209 | #else | ||
210 | static inline bool stedma40_filter(struct dma_chan *chan, void *data) | ||
211 | { | ||
212 | return false; | ||
213 | } | ||
214 | |||
215 | static inline struct | ||
216 | dma_async_tx_descriptor *stedma40_slave_mem(struct dma_chan *chan, | ||
217 | dma_addr_t addr, | ||
218 | unsigned int size, | ||
219 | enum dma_data_direction direction, | ||
220 | unsigned long flags) | ||
221 | { | ||
222 | return NULL; | ||
223 | } | ||
224 | #endif | ||
225 | |||
240 | #endif | 226 | #endif |