]> git.karo-electronics.de Git - karo-tx-linux.git/blob - include/linux/mxc_asrc.h
ENGR00274286-2 mxc: asrc: Add asrc m2m driver
[karo-tx-linux.git] / include / linux / mxc_asrc.h
1 /*
2  * Copyright 2008-2013 Freescale Semiconductor, Inc. All Rights Reserved.
3  *
4  * The code contained herein is licensed under the GNU General Public
5  * License. You may obtain a copy of the GNU General Public License
6  * Version 2 or later at the following locations:
7  *
8  * http://www.opensource.org/licenses/gpl-license.html
9  * http://www.gnu.org/copyleft/gpl.html
10  *
11  * @file mxc_asrc.h
12  *
13  * @brief i.MX Asynchronous Sample Rate Converter
14  *
15  * @ingroup Audio
16  */
17
18 #ifndef __MXC_ASRC_H__
19 #define __MXC_ASRC_H__
20
21 #include <uapi/linux/mxc_asrc.h>
22 #include <linux/scatterlist.h>
23
24 #define ASRC_DMA_BUFFER_NUM             2
25 #define ASRC_INPUTFIFO_THRESHOLD        32
26 #define ASRC_OUTPUTFIFO_THRESHOLD       32
27 #define ASRC_DMA_BUFFER_SIZE            (1024 * 48 * 4)
28 #define ASRC_MAX_BUFFER_SIZE            (1024 * 48)
29 #define ASRC_OUTPUT_LAST_SAMPLE_DEFAULT 8
30
31
32 /* Ideal Ratio mode doesn't care the outclk frequency, so be fixed */
33 #define ASRC_PRESCALER_IDEAL_RATIO      7
34 /* SPDIF rxclk pulse rate is 128 * samplerate, so 2 ^ 7 */
35 #define ASRC_PRESCALER_SPDIF_RX         7
36 /* SPDIF txclk pulse rate is 64 * samplerate, so 2 ^ 6 */
37 #define ASRC_PRESCALER_SPDIF_TX         6
38 /* I2S bclk is 16 * 2 = 32, so 2 ^ 5 */
39 #define ASRC_PRESCALER_I2S_16BIT        5
40 /* I2S bclk is 24 * 2 = 48 -> 64, so 2 ^ 6 */
41 #define ASRC_PRESCALER_I2S_24BIT        6
42
43
44 #define REG_ASRCTR                      0x00
45 #define REG_ASRIER                      0x04
46 #define REG_ASRCNCR                     0x0C
47 #define REG_ASRCFG                      0x10
48 #define REG_ASRCSR                      0x14
49
50 #define REG_ASRCDR1                     0x18
51 #define REG_ASRCDR2                     0x1C
52 #define REG_ASRCDR(x)                   ((x < 2) ? REG_ASRCDR1 : REG_ASRCDR2)
53
54 #define REG_ASRSTR                      0x20
55 #define REG_ASRRA                       0x24
56 #define REG_ASRRB                       0x28
57 #define REG_ASRRC                       0x2C
58 #define REG_ASRPM1                      0x40
59 #define REG_ASRPM2                      0x44
60 #define REG_ASRPM3                      0x48
61 #define REG_ASRPM4                      0x4C
62 #define REG_ASRPM5                      0x50
63 #define REG_ASRTFR1                     0x54
64 #define REG_ASRCCR                      0x5C
65
66 #define REG_ASRDIA                      0x60
67 #define REG_ASRDOA                      0x64
68 #define REG_ASRDIB                      0x68
69 #define REG_ASRDOB                      0x6C
70 #define REG_ASRDIC                      0x70
71 #define REG_ASRDOC                      0x74
72 #define REG_ASRDI(x)                    (REG_ASRDIA + (x << 3))
73 #define REG_ASRDO(x)                    (REG_ASRDOA + (x << 3))
74
75 #define REG_ASRIDRHA                    0x80
76 #define REG_ASRIDRLA                    0x84
77 #define REG_ASRIDRHB                    0x88
78 #define REG_ASRIDRLB                    0x8C
79 #define REG_ASRIDRHC                    0x90
80 #define REG_ASRIDRLC                    0x94
81 #define REG_ASRIDRH(x)                  (REG_ASRIDRHA + (x << 3))
82 #define REG_ASRIDRL(x)                  (REG_ASRIDRLA + (x << 3))
83
84 #define REG_ASR76K                      0x98
85 #define REG_ASR56K                      0x9C
86
87 #define REG_ASRMCRA                     0xA0
88 #define REG_ASRFSTA                     0xA4
89 #define REG_ASRMCRB                     0xA8
90 #define REG_ASRFSTB                     0xAC
91 #define REG_ASRMCRC                     0xB0
92 #define REG_ASRFSTC                     0xB4
93 #define REG_ASRMCR(x)                   (REG_ASRMCRA + (x << 3))
94 #define REG_ASRFST(x)                   (REG_ASRFSTA + (x << 3))
95
96 #define REG_ASRMCR1A                    0xC0
97 #define REG_ASRMCR1B                    0xC4
98 #define REG_ASRMCR1C                    0xC8
99 #define REG_ASRMCR1(x)                  (REG_ASRMCR1A + (x << 2))
100
101
102 /* REG0 0x00 REG_ASRCTR */
103 #define ASRCTR_ATSx_SHIFT(x)            (20 + x)
104 #define ASRCTR_ATSx_MASK(x)             (1 << ASRCTR_ATSx_SHIFT(x))
105 #define ASRCTR_ATS(x)                   (1 << ASRCTR_ATSx_SHIFT(x))
106 #define ASRCTR_USRx_SHIFT(x)            (14 + (x << 1))
107 #define ASRCTR_USRx_MASK(x)             (1 << ASRCTR_USRx_SHIFT(x))
108 #define ASRCTR_USR(x)                   (1 << ASRCTR_USRx_SHIFT(x))
109 #define ASRCTR_IDRx_SHIFT(x)            (13 + (x << 1))
110 #define ASRCTR_IDRx_MASK(x)             (1 << ASRCTR_IDRx_SHIFT(x))
111 #define ASRCTR_IDR(x)                   (1 << ASRCTR_IDRx_SHIFT(x))
112 #define ASRCTR_SRST_SHIFT               4
113 #define ASRCTR_SRST_MASK                (1 << ASRCTR_SRST_SHIFT)
114 #define ASRCTR_SRST                     (1 << ASRCTR_SRST_SHIFT)
115 #define ASRCTR_ASRCEx_SHIFT(x)          (1 + x)
116 #define ASRCTR_ASRCEx_MASK(x)           (1 << ASRCTR_ASRCEx_SHIFT(x))
117 #define ASRCTR_ASRCE(x)                 (1 << ASRCTR_ASRCEx_SHIFT(x))
118 #define ASRCTR_ASRCEN_SHIFT             0
119 #define ASRCTR_ASRCEN_MASK              (1 << ASRCTR_ASRCEN_SHIFT)
120 #define ASRCTR_ASRCEN                   (1 << ASRCTR_ASRCEN_SHIFT)
121
122 /* REG1 0x04 REG_ASRIER */
123 #define ASRIER_AFPWE_SHIFT              7
124 #define ASRIER_AFPWE_MASK               (1 << ASRIER_AFPWE_SHIFT)
125 #define ASRIER_AFPWE                    (1 << ASRIER_AFPWE_SHIFT)
126 #define ASRIER_AOLIE_SHIFT              6
127 #define ASRIER_AOLIE_MASK               (1 << ASRIER_AOLIE_SHIFT)
128 #define ASRIER_AOLIE                    (1 << ASRIER_AOLIE_SHIFT)
129 #define ASRIER_ADOEx_SHIFT(x)           (3 + x)
130 #define ASRIER_ADOEx_MASK(x)            (1 << ASRIER_ADOEx_SHIFT(x))
131 #define ASRIER_ADOE(x)                  (1 << ASRIER_ADOEx_SHIFT(x))
132 #define ASRIER_ADIEx_SHIFT(x)           (0 + x)
133 #define ASRIER_ADIEx_MASK(x)            (1 << ASRIER_ADIEx_SHIFT(x))
134 #define ASRIER_ADIE(x)                  (1 << ASRIER_ADIEx_SHIFT(x))
135
136 /* REG2 0x0C REG_ASRCNCR */
137 #define ASRCNCR_ANCA_MASK(b)            ((1 << b) - 1)
138 #define ASRCNCR_ANCA_get(v, b)          (v & ASRCNCR_ANCA_MASK(b))
139 #define ASRCNCR_ANCB_MASK(b)            (((1 << b) - 1) << b)
140 #define ASRCNCR_ANCB_get(v, b)          ((v & ASRCNCR_ANCB_MASK(b)) >> b)
141 #define ASRCNCR_ANCC_MASK(b)            (((1 << b) - 1) << (b << 1))
142 #define ASRCNCR_ANCC_get(v, b)          ((v & ASRCNCR_ANCC_MASK(b)) >> (b << 1))
143
144 /* REG3 0x10 REG_ASRCFG */
145 #define ASRCFG_INIRQx_SHIFT(x)          (21 + x)
146 #define ASRCFG_INIRQx_MASK(x)           (1 << ASRCFG_INIRQx_SHIFT(x))
147 #define ASRCFG_INIRQx                   (1 << ASRCFG_INIRQx_SHIFT(x))
148 #define ASRCFG_NDPRx_SHIFT(x)           (18 + x)
149 #define ASRCFG_NDPRx_MASK(x)            (1 << ASRCFG_NDPRx_SHIFT(x))
150 #define ASRCFG_NDPRx                    (1 << ASRCFG_NDPRx_SHIFT(x))
151 #define ASRCFG_POSTMODx_SHIFT(x)        (8 + (x << 2))
152 #define ASRCFG_POSTMODx_WIDTH           2
153 #define ASRCFG_POSTMODx_MASK(x)         (((1 << ASRCFG_POSTMODx_WIDTH) - 1) << ASRCFG_POSTMODx_SHIFT(x))
154 #define ASRCFG_POSTMOD(x, v)            ((v) << ASRCFG_POSTMODx_SHIFT(x))
155 #define ASRCFG_POSTMODx_UP(x)           (0 << ASRCFG_POSTMODx_SHIFT(x))
156 #define ASRCFG_POSTMODx_DCON(x)         (1 << ASRCFG_POSTMODx_SHIFT(x))
157 #define ASRCFG_POSTMODx_DOWN(x)         (2 << ASRCFG_POSTMODx_SHIFT(x))
158 #define ASRCFG_PREMODx_SHIFT(x)         (6 + (x << 2))
159 #define ASRCFG_PREMODx_WIDTH            2
160 #define ASRCFG_PREMODx_MASK(x)          (((1 << ASRCFG_PREMODx_WIDTH) - 1) << ASRCFG_PREMODx_SHIFT(x))
161 #define ASRCFG_PREMOD(x, v)             ((v) << ASRCFG_PREMODx_SHIFT(x))
162 #define ASRCFG_PREMODx_UP(x)            (0 << ASRCFG_PREMODx_SHIFT(x))
163 #define ASRCFG_PREMODx_DCON(x)          (1 << ASRCFG_PREMODx_SHIFT(x))
164 #define ASRCFG_PREMODx_DOWN(x)          (2 << ASRCFG_PREMODx_SHIFT(x))
165 #define ASRCFG_PREMODx_BYPASS(x)        (3 << ASRCFG_PREMODx_SHIFT(x))
166
167 /* REG4 0x14 REG_ASRCSR */
168 #define ASRCSR_AxCSx_WIDTH              4
169 #define ASRCSR_AxCSx_MASK               ((1 << ASRCSR_AxCSx_WIDTH) - 1)
170 #define ASRCSR_AOCSx_SHIFT(x)           (12 + (x << 2))
171 #define ASRCSR_AOCSx_MASK(x)            (((1 << ASRCSR_AxCSx_WIDTH) - 1) << ASRCSR_AOCSx_SHIFT(x))
172 #define ASRCSR_AOCS(x, v)               ((v) << ASRCSR_AOCSx_SHIFT(x))
173 #define ASRCSR_AICSx_SHIFT(x)           (x << 2)
174 #define ASRCSR_AICSx_MASK(x)            (((1 << ASRCSR_AxCSx_WIDTH) - 1) << ASRCSR_AICSx_SHIFT(x))
175 #define ASRCSR_AICS(x, v)               ((v) << ASRCSR_AICSx_SHIFT(x))
176
177 /* REG5&6 0x18 & 0x1C REG_ASRCDR1 & ASRCDR2 */
178 #define ASRCDRx_AxCPx_WIDTH             3
179 #define ASRCDRx_AICPx_SHIFT(x)          (0 + (x % 2) * 6)
180 #define ASRCDRx_AICPx_MASK(x)           (((1 << ASRCDRx_AxCPx_WIDTH) - 1) << ASRCDRx_AICPx_SHIFT(x))
181 #define ASRCDRx_AICP(x, v)              ((v) << ASRCDRx_AICPx_SHIFT(x))
182 #define ASRCDRx_AICDx_SHIFT(x)          (3 + (x % 2) * 6)
183 #define ASRCDRx_AICDx_MASK(x)           (((1 << ASRCDRx_AxCPx_WIDTH) - 1) << ASRCDRx_AICDx_SHIFT(x))
184 #define ASRCDRx_AICD(x, v)              ((v) << ASRCDRx_AICDx_SHIFT(x))
185 #define ASRCDRx_AOCPx_SHIFT(x)          ((x < 2) ? 12 + x * 6 : 6)
186 #define ASRCDRx_AOCPx_MASK(x)           (((1 << ASRCDRx_AxCPx_WIDTH) - 1) << ASRCDRx_AOCPx_SHIFT(x))
187 #define ASRCDRx_AOCP(x, v)              ((v) << ASRCDRx_AOCPx_SHIFT(x))
188 #define ASRCDRx_AOCDx_SHIFT(x)          ((x < 2) ? 15 + x * 6 : 9)
189 #define ASRCDRx_AOCDx_MASK(x)           (((1 << ASRCDRx_AxCPx_WIDTH) - 1) << ASRCDRx_AOCDx_SHIFT(x))
190 #define ASRCDRx_AOCD(x, v)              ((v) << ASRCDRx_AOCDx_SHIFT(x))
191
192 /* REG7 0x20 REG_ASRSTR */
193 #define ASRSTR_DSLCNT_SHIFT             21
194 #define ASRSTR_DSLCNT_MASK              (1 << ASRSTR_DSLCNT_SHIFT)
195 #define ASRSTR_DSLCNT                   (1 << ASRSTR_DSLCNT_SHIFT)
196 #define ASRSTR_ATQOL_SHIFT              20
197 #define ASRSTR_ATQOL_MASK               (1 << ASRSTR_ATQOL_SHIFT)
198 #define ASRSTR_ATQOL                    (1 << ASRSTR_ATQOL_SHIFT)
199 #define ASRSTR_AOOLx_SHIFT(x)           (17 + x)
200 #define ASRSTR_AOOLx_MASK(x)            (1 << ASRSTR_AOOLx_SHIFT(x))
201 #define ASRSTR_AOOL(x)                  (1 << ASRSTR_AOOLx_SHIFT(x))
202 #define ASRSTR_AIOLx_SHIFT(x)           (14 + x)
203 #define ASRSTR_AIOLx_MASK(x)            (1 << ASRSTR_AIOLx_SHIFT(x))
204 #define ASRSTR_AIOL(x)                  (1 << ASRSTR_AIOLx_SHIFT(x))
205 #define ASRSTR_AODOx_SHIFT(x)           (11 + x)
206 #define ASRSTR_AODOx_MASK(x)            (1 << ASRSTR_AODOx_SHIFT(x))
207 #define ASRSTR_AODO(x)                  (1 << ASRSTR_AODOx_SHIFT(x))
208 #define ASRSTR_AIDUx_SHIFT(x)           (8 + x)
209 #define ASRSTR_AIDUx_MASK(x)            (1 << ASRSTR_AIDUx_SHIFT(x))
210 #define ASRSTR_AIDU(x)                  (1 << ASRSTR_AIDUx_SHIFT(x))
211 #define ASRSTR_FPWT_SHIFT               7
212 #define ASRSTR_FPWT_MASK                (1 << ASRSTR_FPWT_SHIFT)
213 #define ASRSTR_FPWT                     (1 << ASRSTR_FPWT_SHIFT)
214 #define ASRSTR_AOLE_SHIFT               6
215 #define ASRSTR_AOLE_MASK                (1 << ASRSTR_AOLE_SHIFT)
216 #define ASRSTR_AOLE                     (1 << ASRSTR_AOLE_SHIFT)
217 #define ASRSTR_AODEx_SHIFT(x)           (3 + x)
218 #define ASRSTR_AODFx_MASK(x)            (1 << ASRSTR_AODEx_SHIFT(x))
219 #define ASRSTR_AODF(x)                  (1 << ASRSTR_AODEx_SHIFT(x))
220 #define ASRSTR_AIDEx_SHIFT(x)           (0 + x)
221 #define ASRSTR_AIDEx_MASK(x)            (1 << ASRSTR_AIDEx_SHIFT(x))
222 #define ASRSTR_AIDE(x)                  (1 << ASRSTR_AIDEx_SHIFT(x))
223
224 /* REG10 0x54 REG_ASRTFR1 */
225 #define ASRTFR1_TF_BASE_WIDTH           7
226 #define ASRTFR1_TF_BASE_SHIFT           6
227 #define ASRTFR1_TF_BASE_MASK            (((1 << ASRTFR1_TF_BASE_WIDTH) - 1) << ASRTFR1_TF_BASE_SHIFT)
228 #define ASRTFR1_TF_BASE(x)              ((x) << ASRTFR1_TF_BASE_SHIFT)
229
230 /*
231  * REG22 0xA0 REG_ASRMCRA
232  * REG24 0xA8 REG_ASRMCRB
233  * REG26 0xB0 REG_ASRMCRC
234  */
235 #define ASRMCRx_ZEROBUFx_SHIFT          23
236 #define ASRMCRx_ZEROBUFxCLR_MASK        (1 << ASRMCRx_ZEROBUFx_SHIFT)
237 #define ASRMCRx_ZEROBUFxCLR             (1 << ASRMCRx_ZEROBUFx_SHIFT)
238 #define ASRMCRx_EXTTHRSHx_SHIFT         22
239 #define ASRMCRx_EXTTHRSHx_MASK          (1 << ASRMCRx_EXTTHRSHx_SHIFT)
240 #define ASRMCRx_EXTTHRSHx               (1 << ASRMCRx_EXTTHRSHx_SHIFT)
241 #define ASRMCRx_BUFSTALLx_SHIFT         21
242 #define ASRMCRx_BUFSTALLx_MASK          (1 << ASRMCRx_BUFSTALLx_SHIFT)
243 #define ASRMCRx_BUFSTALLx               (1 << ASRMCRx_BUFSTALLx_SHIFT)
244 #define ASRMCRx_BYPASSPOLYx_SHIFT       20
245 #define ASRMCRx_BYPASSPOLYx_MASK        (1 << ASRMCRx_BYPASSPOLYx_SHIFT)
246 #define ASRMCRx_BYPASSPOLYx             (1 << ASRMCRx_BYPASSPOLYx_SHIFT)
247 #define ASRMCRx_OUTFIFO_THRESHOLD_WIDTH 6
248 #define ASRMCRx_OUTFIFO_THRESHOLD_SHIFT 12
249 #define ASRMCRx_OUTFIFO_THRESHOLD_MASK  (((1 << ASRMCRx_OUTFIFO_THRESHOLD_WIDTH) - 1) << ASRMCRx_OUTFIFO_THRESHOLD_SHIFT)
250 #define ASRMCRx_OUTFIFO_THRESHOLD(v)    (((v) << ASRMCRx_OUTFIFO_THRESHOLD_SHIFT) & ASRMCRx_OUTFIFO_THRESHOLD_MASK)
251 #define ASRMCRx_RSYNIFx_SHIFT           11
252 #define ASRMCRx_RSYNIFx_MASK            (1 << ASRMCRx_RSYNIFx_SHIFT)
253 #define ASRMCRx_RSYNIFx                 (1 << ASRMCRx_RSYNIFx_SHIFT)
254 #define ASRMCRx_RSYNOFx_SHIFT           10
255 #define ASRMCRx_RSYNOFx_MASK            (1 << ASRMCRx_RSYNOFx_SHIFT)
256 #define ASRMCRx_RSYNOFx                 (1 << ASRMCRx_RSYNOFx_SHIFT)
257 #define ASRMCRx_INFIFO_THRESHOLD_WIDTH  6
258 #define ASRMCRx_INFIFO_THRESHOLD_SHIFT  0
259 #define ASRMCRx_INFIFO_THRESHOLD_MASK   (((1 << ASRMCRx_INFIFO_THRESHOLD_WIDTH) - 1) << ASRMCRx_INFIFO_THRESHOLD_SHIFT)
260 #define ASRMCRx_INFIFO_THRESHOLD(v)     (((v) << ASRMCRx_INFIFO_THRESHOLD_SHIFT) & ASRMCRx_INFIFO_THRESHOLD_MASK)
261
262 /*
263  * REG23 0xA4 REG_ASRFSTA
264  * REG25 0xAC REG_ASRFSTB
265  * REG27 0xB4 REG_ASRFSTC
266  */
267 #define ASRFSTx_OAFx_SHIFT              23
268 #define ASRFSTx_OAFx_MASK               (1 << ASRFSTx_OAFx_SHIFT)
269 #define ASRFSTx_OAFx                    (1 << ASRFSTx_OAFx_SHIFT)
270 #define ASRFSTx_OUTPUT_FIFO_WIDTH       7
271 #define ASRFSTx_OUTPUT_FIFO_SHIFT       12
272 #define ASRFSTx_OUTPUT_FIFO_MASK        (((1 << ASRFSTx_OUTPUT_FIFO_WIDTH) - 1) << ASRFSTx_OUTPUT_FIFO_SHIFT)
273 #define ASRFSTx_IAEx_SHIFT              11
274 #define ASRFSTx_IAEx_MASK               (1 << ASRFSTx_OAFx_SHIFT)
275 #define ASRFSTx_IAEx                    (1 << ASRFSTx_OAFx_SHIFT)
276 #define ASRFSTx_INPUT_FIFO_WIDTH        7
277 #define ASRFSTx_INPUT_FIFO_SHIFT        0
278 #define ASRFSTx_INPUT_FIFO_MASK         ((1 << ASRFSTx_INPUT_FIFO_WIDTH) - 1)
279
280 /* REG28 0xC0 & 0xC4 & 0xC8 REG_ASRMCR1x */
281 #define ASRMCR1x_IWD_WIDTH              3
282 #define ASRMCR1x_IWD_SHIFT              9
283 #define ASRMCR1x_IWD_MASK               (((1 << ASRMCR1x_IWD_WIDTH) - 1) << ASRMCR1x_IWD_SHIFT)
284 #define ASRMCR1x_IWD(v)                 ((v) << ASRMCR1x_IWD_SHIFT)
285 #define ASRMCR1x_IMSB_SHIFT             8
286 #define ASRMCR1x_IMSB_MASK              (1 << ASRMCR1x_IMSB_SHIFT)
287 #define ASRMCR1x_IMSB_MSB               (1 << ASRMCR1x_IMSB_SHIFT)
288 #define ASRMCR1x_IMSB_LSB               (0 << ASRMCR1x_IMSB_SHIFT)
289 #define ASRMCR1x_OMSB_SHIFT             2
290 #define ASRMCR1x_OMSB_MASK              (1 << ASRMCR1x_OMSB_SHIFT)
291 #define ASRMCR1x_OMSB_MSB               (1 << ASRMCR1x_OMSB_SHIFT)
292 #define ASRMCR1x_OMSB_LSB               (0 << ASRMCR1x_OMSB_SHIFT)
293 #define ASRMCR1x_OSGN_SHIFT             1
294 #define ASRMCR1x_OSGN_MASK              (1 << ASRMCR1x_OSGN_SHIFT)
295 #define ASRMCR1x_OSGN                   (1 << ASRMCR1x_OSGN_SHIFT)
296 #define ASRMCR1x_OW16_SHIFT             0
297 #define ASRMCR1x_OW16_MASK              (1 << ASRMCR1x_OW16_SHIFT)
298 #define ASRMCR1x_OW16(v)                ((v) << ASRMCR1x_OW16_SHIFT)
299
300
301 struct dma_block {
302         unsigned int index;
303         unsigned int length;
304         void *dma_vaddr;
305         dma_addr_t dma_paddr;
306         struct list_head queue;
307 };
308
309 struct asrc_p2p_params {
310         u32 p2p_rate;                           /* ASRC output rate for p2p */
311         enum asrc_word_width p2p_width;         /* ASRC output wordwidth for p2p */
312 };
313
314 struct asrc_pair_params {
315         enum asrc_pair_index index;
316         wait_queue_head_t input_wait_queue;
317         wait_queue_head_t output_wait_queue;
318         unsigned int input_counter;
319         unsigned int output_counter;
320         struct dma_chan *input_dma_channel;
321         struct dma_chan *output_dma_channel;
322         unsigned int input_buffer_size;
323         unsigned int output_buffer_size;
324         unsigned int buffer_num;
325         unsigned int pair_hold;
326         unsigned int asrc_active;
327         unsigned int channel_nums;
328         struct dma_block input_dma_total;
329         struct dma_block input_dma[ASRC_DMA_BUFFER_NUM];
330         struct dma_block output_dma_total;
331         struct dma_block output_dma[ASRC_DMA_BUFFER_NUM];
332         struct dma_block output_last_period;
333         struct dma_async_tx_descriptor *desc_in;
334         struct dma_async_tx_descriptor *desc_out;
335         struct work_struct task_output_work;
336         unsigned int input_sg_nodes;
337         unsigned int output_sg_nodes;
338         struct scatterlist input_sg[4], output_sg[4];
339         enum asrc_word_width input_word_width;
340         enum asrc_word_width output_word_width;
341         u32 input_sample_rate;
342         u32 output_sample_rate;
343         u32 input_wm;
344         u32 output_wm;
345         unsigned int last_period_sample;
346 };
347
348 struct asrc_data {
349         struct asrc_pair asrc_pair[3];
350         struct proc_dir_entry *proc_asrc;
351         struct regmap *regmap;
352         unsigned long vaddr;
353         unsigned long paddr;
354         struct class *asrc_class;
355         int asrc_major;
356         struct clk *asrc_clk;
357         unsigned int channel_bits;
358         int clk_map_ver;
359         int irq;
360         struct device *dev;
361 };
362
363 struct asrc_p2p_ops {
364         void (*asrc_p2p_start_conv)(enum asrc_pair_index);
365         void (*asrc_p2p_stop_conv)(enum asrc_pair_index);
366         int (*asrc_p2p_get_dma_request)(enum asrc_pair_index, bool);
367         u32 (*asrc_p2p_per_addr)(enum asrc_pair_index, bool);
368         int (*asrc_p2p_req_pair)(int, enum asrc_pair_index *index);
369         int (*asrc_p2p_config_pair)(struct asrc_config *config);
370         void (*asrc_p2p_release_pair)(enum asrc_pair_index);
371         void (*asrc_p2p_finish_conv)(enum asrc_pair_index);
372 };
373
374 extern void asrc_p2p_hook(struct asrc_p2p_ops *asrc_p2p_ct);
375
376 extern int asrc_req_pair(int chn_num, enum asrc_pair_index *index);
377 extern void asrc_release_pair(enum asrc_pair_index index);
378 extern int asrc_config_pair(struct asrc_config *config);
379 extern void asrc_get_status(struct asrc_status_flags *flags);
380 extern void asrc_start_conv(enum asrc_pair_index index);
381 extern void asrc_stop_conv(enum asrc_pair_index index);
382 extern u32 asrc_get_per_addr(enum asrc_pair_index index, bool i);
383 extern int asrc_get_dma_request(enum asrc_pair_index index, bool i);
384 extern void asrc_finish_conv(enum asrc_pair_index index);
385 extern int asrc_set_watermark(enum asrc_pair_index index,
386                 u32 in_wm, u32 out_wm);
387 extern void sdma_set_event_pending(struct dma_chan *chan);
388
389 #endif/* __MXC_ASRC_H__ */