xref: /linux/sound/soc/tegra/tegra210_sfc.c (revision 981368e1440b76f68b1ac8f5fb14e739f80ecc4e)
1 // SPDX-License-Identifier: GPL-2.0-only
2 //
3 // tegra210_sfc.c - Tegra210 SFC driver
4 //
5 // Copyright (c) 2021-2023 NVIDIA CORPORATION.  All rights reserved.
6 
7 #include <linux/clk.h>
8 #include <linux/device.h>
9 #include <linux/io.h>
10 #include <linux/module.h>
11 #include <linux/of.h>
12 #include <linux/of_device.h>
13 #include <linux/platform_device.h>
14 #include <linux/pm_runtime.h>
15 #include <linux/regmap.h>
16 #include <sound/core.h>
17 #include <sound/pcm.h>
18 #include <sound/pcm_params.h>
19 #include <sound/soc.h>
20 
21 #include "tegra210_sfc.h"
22 #include "tegra_cif.h"
23 
24 #define UNSUPP_CONV ((void *)(-EOPNOTSUPP))
25 #define BYPASS_CONV NULL
26 
27 static const struct reg_default tegra210_sfc_reg_defaults[] = {
28 	{ TEGRA210_SFC_RX_INT_MASK, 0x00000001},
29 	{ TEGRA210_SFC_RX_CIF_CTRL, 0x00007700},
30 	{ TEGRA210_SFC_TX_INT_MASK, 0x00000001},
31 	{ TEGRA210_SFC_TX_CIF_CTRL, 0x00007700},
32 	{ TEGRA210_SFC_CG, 0x1},
33 	{ TEGRA210_SFC_CFG_RAM_CTRL, 0x00004000},
34 };
35 
36 static const int tegra210_sfc_rates[TEGRA210_SFC_NUM_RATES] = {
37 	8000,
38 	11025,
39 	16000,
40 	22050,
41 	24000,
42 	32000,
43 	44100,
44 	48000,
45 	64000,
46 	88200,
47 	96000,
48 	176400,
49 	192000,
50 };
51 
52 /* coeff RAM tables required for SFC */
53 static u32 coef_8to11[TEGRA210_SFC_COEF_RAM_DEPTH] = {
54 	0x000c6102,//header
55 	0x0001d727,//input gain
56 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
57 	0x00e55557, 0xffcadd5b, 0x003d80ba,
58 	0x00d13397, 0xfff232f8, 0x00683337,
59 	0x00000002,//output gain
60 	0x0018a102,//header
61 	0x000005d6,//input gain
62 	0x00c6543e, 0xff342935, 0x0052f116,
63 	0x000a1d78, 0xff3330c0, 0x005f88a3,
64 	0xffbee7c0, 0xff2b5ba5, 0x0073eb26,
65 	0x00000003,//output gain
66 	0x00235204,//farrow
67 	0x000aaaab,
68 	0xffaaaaab,
69 	0xfffaaaab,
70 	0x00555555,
71 	0xff600000,
72 	0xfff55555,
73 	0x00155555,
74 	0x00055555,
75 	0xffeaaaab,
76 	0x00200000,
77 	0x00005102,//header
78 	0x0000015f,//input gain
79 	0x00a7909c, 0xff241c71, 0x005f5e00,
80 	0xffca77f4, 0xff20dd50, 0x006855eb,
81 	0xff86c552, 0xff18137a, 0x00773648,
82 	0x00000001//output gain
83 };
84 
85 static u32 coef_8to16[TEGRA210_SFC_COEF_RAM_DEPTH] = {
86 	0x00006102,//header
87 	0x0001d727,//input gain
88 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
89 	0x00e55557, 0xffcadd5b, 0x003d80ba,
90 	0x00d13397, 0xfff232f8, 0x00683337,
91 	0x00000002//output gain
92 };
93 
94 static u32 coef_8to22[TEGRA210_SFC_COEF_RAM_DEPTH] = {
95 	0x000c6102,//header
96 	0x0001d727,//input gain
97 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
98 	0x00e55557, 0xffcadd5b, 0x003d80ba,
99 	0x00d13397, 0xfff232f8, 0x00683337,
100 	0x00000002,//output gain
101 	0x0018a102,//header
102 	0x000005d6,//input gain
103 	0x00c6543e, 0xff342935, 0x0052f116,
104 	0x000a1d78, 0xff3330c0, 0x005f88a3,
105 	0xffbee7c0, 0xff2b5ba5, 0x0073eb26,
106 	0x00000003,//output gain
107 	0x00230204,//farrow
108 	0x000aaaab,
109 	0xffaaaaab,
110 	0xfffaaaab,
111 	0x00555555,
112 	0xff600000,
113 	0xfff55555,
114 	0x00155555,
115 	0x00055555,
116 	0xffeaaaab,
117 	0x00200000,
118 	0x00005102,//header
119 	0x000005f3,//input gain
120 	0x00d816d6, 0xff385383, 0x004fe566,
121 	0x003c548d, 0xff38c23d, 0x005d0b1c,
122 	0xfff02f7d, 0xff31e983, 0x0072d65d,
123 	0x00000001//output gain
124 };
125 
126 static u32 coef_8to24[TEGRA210_SFC_COEF_RAM_DEPTH] = {
127 	0x0000a105,//header
128 	0x000005e1,//input gain
129 	0x00dca92f, 0xff45647a, 0x0046b59c,
130 	0x00429d1e, 0xff4fec62, 0x00516d30,
131 	0xffdea779, 0xff5e08ba, 0x0060185e,
132 	0xffafbab2, 0xff698d5a, 0x006ce3ae,
133 	0xff9a82d2, 0xff704674, 0x007633c5,
134 	0xff923433, 0xff721128, 0x007cff42,
135 	0x00000003//output gain
136 };
137 
138 static u32 coef_8to32[TEGRA210_SFC_COEF_RAM_DEPTH] = {
139 	0x000c6102,//header
140 	0x0001d727,//input gain
141 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
142 	0x00e55557, 0xffcadd5b, 0x003d80ba,
143 	0x00d13397, 0xfff232f8, 0x00683337,
144 	0x00000002,//output gain
145 	0x00006102,//header
146 	0x000013d9,//input gain
147 	0x00ebd477, 0xff4ce383, 0x0042049d,
148 	0x0089c278, 0xff54414d, 0x00531ded,
149 	0x004a5e07, 0xff53cf41, 0x006efbdc,
150 	0x00000002//output gain
151 };
152 
153 static u32 coef_8to44[TEGRA210_SFC_COEF_RAM_DEPTH] = {
154 	0x0156105,//interpolation + IIR filter
155 	0x0000d649,//input gain
156 	0x00e87afb, 0xff5f69d0, 0x003df3cf,
157 	0x007ce488, 0xff99a5c8, 0x0056a6a0,
158 	0x00344928, 0xffcba3e5, 0x006be470,
159 	0x00137aa7, 0xffe60276, 0x00773410,
160 	0x0005fa2a, 0xfff1ac11, 0x007c795b,
161 	0x00012d36, 0xfff5eca2, 0x007f10ef,
162 	0x00000002,//ouptut gain
163 	0x0021a102,//interpolation + IIR filter
164 	0x00000e00,//input gain
165 	0x00e2e000, 0xff6e1a00, 0x002aaa00,
166 	0x00610a00, 0xff5dda00, 0x003ccc00,
167 	0x00163a00, 0xff3c0400, 0x00633200,
168 	0x00000003,//Output gain
169 	0x00000204,//Farrow filter
170 	0x000aaaab,
171 	0xffaaaaab,
172 	0xfffaaaab,
173 	0x00555555,
174 	0xff600000,
175 	0xfff55555,
176 	0x00155555,
177 	0x00055555,
178 	0xffeaaaab,
179 	0x00200000
180 };
181 
182 static u32 coef_8to48[TEGRA210_SFC_COEF_RAM_DEPTH] = {
183 	0x00156105,//interpolation + IIR Filter
184 	0x0000d649,//input gain
185 	0x00e87afb, 0xff5f69d0, 0x003df3cf,
186 	0x007ce488, 0xff99a5c8, 0x0056a6a0,
187 	0x00344928, 0xffcba3e5, 0x006be470,
188 	0x00137aa7, 0xffe60276, 0x00773410,
189 	0x0005fa2a, 0xfff1ac11, 0x007c795b,
190 	0x00012d36, 0xfff5eca2, 0x007f10ef,
191 	0x00000002,//ouptut gain
192 	0x0000a102,//interpolation + IIR filter
193 	0x00000e00,//input gain
194 	0x00e2e000, 0xff6e1a00, 0x002aaa00,
195 	0x00610a00, 0xff5dda00, 0x003ccc00,
196 	0x00163a00, 0xff3c0400, 0x00633200,
197 	0x00000003//output gain
198 };
199 
200 static u32 coef_8to88[TEGRA210_SFC_COEF_RAM_DEPTH] = {
201 	0x000c6102,//header
202 	0x0001d727,//input gain
203 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
204 	0x00e55557, 0xffcadd5b, 0x003d80ba,
205 	0x00d13397, 0xfff232f8, 0x00683337,
206 	0x00000002,//output gain
207 	0x00186102,//header
208 	0x000013d9,//input gain
209 	0x00ebd477, 0xff4ce383, 0x0042049d,
210 	0x0089c278, 0xff54414d, 0x00531ded,
211 	0x004a5e07, 0xff53cf41, 0x006efbdc,
212 	0x00000002,//output gain
213 	0x0024a102,//header
214 	0x0000007d,//input gain
215 	0x007d1f20, 0xff1a540e, 0x00678bf9,
216 	0xff916625, 0xff16b0ff, 0x006e433a,
217 	0xff5af660, 0xff0eb91f, 0x00797356,
218 	0x00000003,//output gain
219 	0x00000204,//farrow
220 	0x000aaaab,
221 	0xffaaaaab,
222 	0xfffaaaab,
223 	0x00555555,
224 	0xff600000,
225 	0xfff55555,
226 	0x00155555,
227 	0x00055555,
228 	0xffeaaaab,
229 	0x00200000
230 };
231 
232 static u32 coef_8to96[TEGRA210_SFC_COEF_RAM_DEPTH] = {
233 	0x000c6102,//header
234 	0x0001d727,//input gain
235 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
236 	0x00e55557, 0xffcadd5b, 0x003d80ba,
237 	0x00d13397, 0xfff232f8, 0x00683337,
238 	0x00000002,//output gain
239 	0x00186102,//header
240 	0x000013d9,//input gain
241 	0x00ebd477, 0xff4ce383, 0x0042049d,
242 	0x0089c278, 0xff54414d, 0x00531ded,
243 	0x004a5e07, 0xff53cf41, 0x006efbdc,
244 	0x00000002,//output gain
245 	0x0000a102,//header
246 	0x0000007d,//input gain
247 	0x007d1f20, 0xff1a540e, 0x00678bf9,
248 	0xff916625, 0xff16b0ff, 0x006e433a,
249 	0xff5af660, 0xff0eb91f, 0x00797356,
250 	0x00000003//output gain
251 };
252 
253 static u32 coef_11to8[TEGRA210_SFC_COEF_RAM_DEPTH] = {
254 	0x000c6102,//header
255 	0x0000015f,//input gain
256 	0x00a7909c, 0xff241c71, 0x005f5e00,
257 	0xffca77f4, 0xff20dd50, 0x006855eb,
258 	0xff86c552, 0xff18137a, 0x00773648,
259 	0x00000002,//output gain
260 	0x00186102,//header
261 	0x000005f3,//input gain
262 	0x00d816d6, 0xff385383, 0x004fe566,
263 	0x003c548d, 0xff38c23d, 0x005d0b1c,
264 	0xfff02f7d, 0xff31e983, 0x0072d65d,
265 	0x00000002,//output gain
266 	0x00239204,//farrow
267 	0x000aaaab,
268 	0xffaaaaab,
269 	0xfffaaaab,
270 	0x00555555,
271 	0xff600000,
272 	0xfff55555,
273 	0x00155555,
274 	0x00055555,
275 	0xffeaaaab,
276 	0x00200000,
277 	0x00005102,//header
278 	0x0001d727,//input gain
279 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
280 	0x00e55557, 0xffcadd5b, 0x003d80ba,
281 	0x00d13397, 0xfff232f8, 0x00683337,
282 	0x00000001//output gain
283 };
284 
285 static u32 coef_11to16[TEGRA210_SFC_COEF_RAM_DEPTH] = {
286 	0x000c6102,//header
287 	0x0001d727,//input gain
288 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
289 	0x00e55557, 0xffcadd5b, 0x003d80ba,
290 	0x00d13397, 0xfff232f8, 0x00683337,
291 	0x00000002,//output gain
292 	0x00186102,//header
293 	0x000013d9,//input gain
294 	0x00ebd477, 0xff4ce383, 0x0042049d,
295 	0x0089c278, 0xff54414d, 0x00531ded,
296 	0x004a5e07, 0xff53cf41, 0x006efbdc,
297 	0x00000002,//output gain
298 	0x00009204,//farrow
299 	0x000aaaab,
300 	0xffaaaaab,
301 	0xfffaaaab,
302 	0x00555555,
303 	0xff600000,
304 	0xfff55555,
305 	0x00155555,
306 	0x00055555,
307 	0xffeaaaab,
308 	0x00200000
309 };
310 
311 static u32 coef_11to22[TEGRA210_SFC_COEF_RAM_DEPTH] = {
312 	0x00006102,//header
313 	0x0001d727,//input gain
314 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
315 	0x00e55557, 0xffcadd5b, 0x003d80ba,
316 	0x00d13397, 0xfff232f8, 0x00683337,
317 	0x00000002//output gain
318 };
319 
320 static u32 coef_11to24[TEGRA210_SFC_COEF_RAM_DEPTH] = {
321 	0x000c6102,//header
322 	0x0001d727,//input gain
323 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
324 	0x00e55557, 0xffcadd5b, 0x003d80ba,
325 	0x00d13397, 0xfff232f8, 0x00683337,
326 	0x00000002,//output gain
327 	0x00186102,//header
328 	0x000013d9,//input gain
329 	0x00ebd477, 0xff4ce383, 0x0042049d,
330 	0x0089c278, 0xff54414d, 0x00531ded,
331 	0x004a5e07, 0xff53cf41, 0x006efbdc,
332 	0x00000002,//output gain
333 	0x00005204,//farrow
334 	0x000aaaab,
335 	0xffaaaaab,
336 	0xfffaaaab,
337 	0x00555555,
338 	0xff600000,
339 	0xfff55555,
340 	0x00155555,
341 	0x00055555,
342 	0xffeaaaab,
343 	0x00200000
344 };
345 
346 static u32 coef_11to32[TEGRA210_SFC_COEF_RAM_DEPTH] = {
347 	0x000c6102,//header
348 	0x0001d727,//input gain
349 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
350 	0x00e55557, 0xffcadd5b, 0x003d80ba,
351 	0x00d13397, 0xfff232f8, 0x00683337,
352 	0x00000002,//output gain
353 	0x00186102,//header
354 	0x000013d9,//input gain
355 	0x00ebd477, 0xff4ce383, 0x0042049d,
356 	0x0089c278, 0xff54414d, 0x00531ded,
357 	0x004a5e07, 0xff53cf41, 0x006efbdc,
358 	0x00000002,//output gain
359 	0x00246102,//header
360 	0x0000010a,//input gain
361 	0x00c93dc4, 0xff26f5f6, 0x005d1041,
362 	0x001002c4, 0xff245b76, 0x00666002,
363 	0xffc30a45, 0xff1baecd, 0x00765921,
364 	0x00000002,//output gain
365 	0x00009204,//farrow
366 	0x000aaaab,
367 	0xffaaaaab,
368 	0xfffaaaab,
369 	0x00555555,
370 	0xff600000,
371 	0xfff55555,
372 	0x00155555,
373 	0x00055555,
374 	0xffeaaaab,
375 	0x00200000
376 };
377 
378 static u32 coef_11to44[TEGRA210_SFC_COEF_RAM_DEPTH] = {
379 	0x000c6102,//header
380 	0x0001d727,//input gain
381 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
382 	0x00e55557, 0xffcadd5b, 0x003d80ba,
383 	0x00d13397, 0xfff232f8, 0x00683337,
384 	0x00000002,//output gain
385 	0x00006102,//header
386 	0x000013d9,//input gain
387 	0x00ebd477, 0xff4ce383, 0x0042049d,
388 	0x0089c278, 0xff54414d, 0x00531ded,
389 	0x004a5e07, 0xff53cf41, 0x006efbdc,
390 	0x00000002//output gain
391 };
392 
393 static u32 coef_11to48[TEGRA210_SFC_COEF_RAM_DEPTH] = {
394 	0x000c6102,//header
395 	0x0001d727,//input gain
396 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
397 	0x00e55557, 0xffcadd5b, 0x003d80ba,
398 	0x00d13397, 0xfff232f8, 0x00683337,
399 	0x00000002,//output gain
400 	0x00186102,//header
401 	0x000013d9,//input gain
402 	0x00ebd477, 0xff4ce383, 0x0042049d,
403 	0x0089c278, 0xff54414d, 0x00531ded,
404 	0x004a5e07, 0xff53cf41, 0x006efbdc,
405 	0x00000002,//output gain
406 	0x00246102,//header
407 	0x0000010a,//input gain
408 	0x00c93dc4, 0xff26f5f6, 0x005d1041,
409 	0x001002c4, 0xff245b76, 0x00666002,
410 	0xffc30a45, 0xff1baecd, 0x00765921,
411 	0x00000002,//output gain
412 	0x00005204,//farrow
413 	0x000aaaab,
414 	0xffaaaaab,
415 	0xfffaaaab,
416 	0x00555555,
417 	0xff600000,
418 	0xfff55555,
419 	0x00155555,
420 	0x00055555,
421 	0xffeaaaab,
422 	0x00200000
423 };
424 
425 static u32 coef_11to88[TEGRA210_SFC_COEF_RAM_DEPTH] = {
426 	0x000c6102,//header
427 	0x0001d727,//input gain
428 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
429 	0x00e55557, 0xffcadd5b, 0x003d80ba,
430 	0x00d13397, 0xfff232f8, 0x00683337,
431 	0x00000002,//output gain
432 	0x00186102,//header
433 	0x000013d9,//input gain
434 	0x00ebd477, 0xff4ce383, 0x0042049d,
435 	0x0089c278, 0xff54414d, 0x00531ded,
436 	0x004a5e07, 0xff53cf41, 0x006efbdc,
437 	0x00000002,//output gain
438 	0x00006102,//header
439 	0x0000010a,//input gain
440 	0x00c93dc4, 0xff26f5f6, 0x005d1041,
441 	0x001002c4, 0xff245b76, 0x00666002,
442 	0xffc30a45, 0xff1baecd, 0x00765921,
443 	0x00000002//output gain
444 };
445 
446 static u32 coef_11to96[TEGRA210_SFC_COEF_RAM_DEPTH] = {
447 	0x000c6102,//header
448 	0x0001d727,//input gain
449 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
450 	0x00e55557, 0xffcadd5b, 0x003d80ba,
451 	0x00d13397, 0xfff232f8, 0x00683337,
452 	0x00000002,//output gain
453 	0x00186102,//header
454 	0x000013d9,//input gain
455 	0x00ebd477, 0xff4ce383, 0x0042049d,
456 	0x0089c278, 0xff54414d, 0x00531ded,
457 	0x004a5e07, 0xff53cf41, 0x006efbdc,
458 	0x00000002,//output gain
459 	0x00246102,//header
460 	0x0000010a,//input gain
461 	0x00c93dc4, 0xff26f5f6, 0x005d1041,
462 	0x001002c4, 0xff245b76, 0x00666002,
463 	0xffc30a45, 0xff1baecd, 0x00765921,
464 	0x00000002,//output gain
465 	0x00000204,//farrow
466 	0x000aaaab,
467 	0xffaaaaab,
468 	0xfffaaaab,
469 	0x00555555,
470 	0xff600000,
471 	0xfff55555,
472 	0x00155555,
473 	0x00055555,
474 	0xffeaaaab,
475 	0x00200000
476 };
477 
478 static u32 coef_16to8[TEGRA210_SFC_COEF_RAM_DEPTH] = {
479 	0x00005102,//header
480 	0x0001d727,//input gain
481 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
482 	0x00e55557, 0xffcadd5b, 0x003d80ba,
483 	0x00d13397, 0xfff232f8, 0x00683337,
484 	0x00000001//output gain
485 };
486 
487 static u32 coef_16to11[TEGRA210_SFC_COEF_RAM_DEPTH] = {
488 	0x000fa103,//header
489 	0x000001e0,//input gain
490 	0x00de44c0, 0xff380b7f, 0x004ffc73,
491 	0x00494b44, 0xff3d493a, 0x005908bf,
492 	0xffe9a3c8, 0xff425647, 0x006745f7,
493 	0xffc42d61, 0xff40a6c7, 0x00776709,
494 	0x00000003,//output gain
495 	0x001a5204,//farrow
496 	0x000aaaab,
497 	0xffaaaaab,
498 	0xfffaaaab,
499 	0x00555555,
500 	0xff600000,
501 	0xfff55555,
502 	0x00155555,
503 	0x00055555,
504 	0xffeaaaab,
505 	0x00200000,
506 	0x00005102,//header
507 	0x0001d727,//input gain
508 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
509 	0x00e55557, 0xffcadd5b, 0x003d80ba,
510 	0x00d13397, 0xfff232f8, 0x00683337,
511 	0x00000001//output gain
512 };
513 
514 static u32 coef_16to22[TEGRA210_SFC_COEF_RAM_DEPTH] = {
515 	0x000c6102,//header
516 	0x0001d727,//input gain
517 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
518 	0x00e55557, 0xffcadd5b, 0x003d80ba,
519 	0x00d13397, 0xfff232f8, 0x00683337,
520 	0x00000002,//output gain
521 	0x0018a102,//header
522 	0x000005d6,//input gain
523 	0x00c6543e, 0xff342935, 0x0052f116,
524 	0x000a1d78, 0xff3330c0, 0x005f88a3,
525 	0xffbee7c0, 0xff2b5ba5, 0x0073eb26,
526 	0x00000003,//output gain
527 	0x00235204,//farrow
528 	0x000aaaab,
529 	0xffaaaaab,
530 	0xfffaaaab,
531 	0x00555555,
532 	0xff600000,
533 	0xfff55555,
534 	0x00155555,
535 	0x00055555,
536 	0xffeaaaab,
537 	0x00200000,
538 	0x00005102,//header
539 	0x0000015f,//input gain
540 	0x00a7909c, 0xff241c71, 0x005f5e00,
541 	0xffca77f4, 0xff20dd50, 0x006855eb,
542 	0xff86c552, 0xff18137a, 0x00773648,
543 	0x00000001//output gain
544 };
545 
546 static u32 coef_16to24[TEGRA210_SFC_COEF_RAM_DEPTH] = {
547 	0x0015a105,//header
548 	0x00000292,//input gain
549 	0x00e4320a, 0xff41d2d9, 0x004911ac,
550 	0x005dd9e3, 0xff4c7d80, 0x0052103e,
551 	0xfff8ebef, 0xff5b6fab, 0x005f0a0d,
552 	0xffc4b414, 0xff68582c, 0x006b38e5,
553 	0xffabb861, 0xff704bec, 0x0074de52,
554 	0xffa19f4c, 0xff729059, 0x007c7e90,
555 	0x00000003,//output gain
556 	0x00005105,//header
557 	0x00000292,//input gain
558 	0x00e4320a, 0xff41d2d9, 0x004911ac,
559 	0x005dd9e3, 0xff4c7d80, 0x0052103e,
560 	0xfff8ebef, 0xff5b6fab, 0x005f0a0d,
561 	0xffc4b414, 0xff68582c, 0x006b38e5,
562 	0xffabb861, 0xff704bec, 0x0074de52,
563 	0xffa19f4c, 0xff729059, 0x007c7e90,
564 	0x00000001//output gain
565 };
566 
567 static u32 coef_16to32[TEGRA210_SFC_COEF_RAM_DEPTH] = {
568 	0x00006102,//header
569 	0x0001d727,//input gain
570 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
571 	0x00e55557, 0xffcadd5b, 0x003d80ba,
572 	0x00d13397, 0xfff232f8, 0x00683337,
573 	0x00000002//output gain
574 };
575 
576 static u32 coef_16to44[TEGRA210_SFC_COEF_RAM_DEPTH] = {
577 	0x00156105,//interpolation + IIR filter
578 	0x0000d649,//input gain
579 	0x00e87afb, 0xff5f69d0, 0x003df3cf,
580 	0x007ce488, 0xff99a5c8, 0x0056a6a0,
581 	0x00344928, 0xffcba3e5, 0x006be470,
582 	0x00137aa7, 0xffe60276, 0x00773410,
583 	0x0005fa2a, 0xfff1ac11, 0x007c795b,
584 	0x00012d36, 0xfff5eca2, 0x007f10ef,
585 	0x00000002,//output gain
586 	0x0021a102,//interpolation + IIR filter
587 	0x00000e00,//input gain
588 	0x00e2e000, 0xff6e1a00, 0x002aaa00,
589 	0x00610a00, 0xff5dda00, 0x003ccc00,
590 	0x00163a00, 0xff3c0400, 0x00633200,
591 	0x00000003,//output gain
592 	0x002c0204,//Farrow Filter
593 	0x000aaaab,
594 	0xffaaaaab,
595 	0xfffaaaab,
596 	0x00555555,
597 	0xff600000,
598 	0xfff55555,
599 	0x00155555,
600 	0x00055555,
601 	0xffeaaaab,
602 	0x00200000,
603 	0x00005101,//IIR Filter + Decimator
604 	0x0000203c,//input gain
605 	0x00f52d35, 0xff2e2162, 0x005a21e0,
606 	0x00c6f0f0, 0xff2ecd69, 0x006fa78d,
607 	0x00000001//output gain
608 };
609 
610 static u32 coef_16to48[TEGRA210_SFC_COEF_RAM_DEPTH] = {
611 	0x0000a105,//interpolation + IIR Filter
612 	0x00000784,//input gain
613 	0x00cc516e, 0xff2c9639, 0x005ad5b3,
614 	0x0013ad0d, 0xff3d4799, 0x0063ce75,
615 	0xffb6f398, 0xff5138d1, 0x006e9e1f,
616 	0xff9186e5, 0xff5f96a4, 0x0076a86e,
617 	0xff82089c, 0xff676b81, 0x007b9f8a,
618 	0xff7c48a5, 0xff6a31e7, 0x007ebb7b,
619 	0x00000003//output gain
620 };
621 
622 static u32 coef_16to88[TEGRA210_SFC_COEF_RAM_DEPTH] = {
623 	0x000c6102,//header
624 	0x0001d727,//input gain
625 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
626 	0x00e55557, 0xffcadd5b, 0x003d80ba,
627 	0x00d13397, 0xfff232f8, 0x00683337,
628 	0x00000002,//output gain
629 	0x0018a102,//header
630 	0x000005d6,//input gain
631 	0x00c6543e, 0xff342935, 0x0052f116,
632 	0x000a1d78, 0xff3330c0, 0x005f88a3,
633 	0xffbee7c0, 0xff2b5ba5, 0x0073eb26,
634 	0x00000003,//output gain
635 	0x00000204,//farrow
636 	0x000aaaab,
637 	0xffaaaaab,
638 	0xfffaaaab,
639 	0x00555555,
640 	0xff600000,
641 	0xfff55555,
642 	0x00155555,
643 	0x00055555,
644 	0xffeaaaab,
645 	0x00200000
646 };
647 
648 static u32 coef_16to96[TEGRA210_SFC_COEF_RAM_DEPTH] = {
649 	0x000c6102,//header
650 	0x0001d727,//input gain
651 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
652 	0x00e55557, 0xffcadd5b, 0x003d80ba,
653 	0x00d13397, 0xfff232f8, 0x00683337,
654 	0x00000002,//output gain
655 	0x0000a102,//header
656 	0x000005d6,//input gain
657 	0x00c6543e, 0xff342935, 0x0052f116,
658 	0x000a1d78, 0xff3330c0, 0x005f88a3,
659 	0xffbee7c0, 0xff2b5ba5, 0x0073eb26,
660 	0x00000003//output gain
661 };
662 
663 static u32 coef_16to176[TEGRA210_SFC_COEF_RAM_DEPTH] = {
664 	0x000c6102,//header
665 	0x0001d727,//input gain
666 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
667 	0x00e55557, 0xffcadd5b, 0x003d80ba,
668 	0x00d13397, 0xfff232f8, 0x00683337,
669 	0x00000002,//output gain
670 	0x00186102,//header
671 	0x000013d9,//input gain
672 	0x00ebd477, 0xff4ce383, 0x0042049d,
673 	0x0089c278, 0xff54414d, 0x00531ded,
674 	0x004a5e07, 0xff53cf41, 0x006efbdc,
675 	0x00000002,//output gain
676 	0x0024a102,//header
677 	0x0000007d,//input gain
678 	0x007d1f20, 0xff1a540e, 0x00678bf9,
679 	0xff916625, 0xff16b0ff, 0x006e433a,
680 	0xff5af660, 0xff0eb91f, 0x00797356,
681 	0x00000003,//output gain
682 	0x00000204,//farrow
683 	0x000aaaab,
684 	0xffaaaaab,
685 	0xfffaaaab,
686 	0x00555555,
687 	0xff600000,
688 	0xfff55555,
689 	0x00155555,
690 	0x00055555,
691 	0xffeaaaab,
692 	0x00200000
693 };
694 
695 static u32 coef_16to192[TEGRA210_SFC_COEF_RAM_DEPTH] = {
696 	0x000c6102,//header
697 	0x0001d727,//input gain
698 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
699 	0x00e55557, 0xffcadd5b, 0x003d80ba,
700 	0x00d13397, 0xfff232f8, 0x00683337,
701 	0x00000002,//output gain
702 	0x00186102,//header
703 	0x000013d9,//input gain
704 	0x00ebd477, 0xff4ce383, 0x0042049d,
705 	0x0089c278, 0xff54414d, 0x00531ded,
706 	0x004a5e07, 0xff53cf41, 0x006efbdc,
707 	0x00000002,//output gain
708 	0x0000a102,//header
709 	0x0000007d,//input gain
710 	0x007d1f20, 0xff1a540e, 0x00678bf9,
711 	0xff916625, 0xff16b0ff, 0x006e433a,
712 	0xff5af660, 0xff0eb91f, 0x00797356,
713 	0x00000003//output gain
714 };
715 
716 static u32 coef_22to8[TEGRA210_SFC_COEF_RAM_DEPTH] = {
717 	0x000c6102,//header
718 	0x000005f3,//input gain
719 	0x00d816d6, 0xff385383, 0x004fe566,
720 	0x003c548d, 0xff38c23d, 0x005d0b1c,
721 	0xfff02f7d, 0xff31e983, 0x0072d65d,
722 	0x00000002,//output gain
723 	0x00179204,//farrow
724 	0x000aaaab,
725 	0xffaaaaab,
726 	0xfffaaaab,
727 	0x00555555,
728 	0xff600000,
729 	0xfff55555,
730 	0x00155555,
731 	0x00055555,
732 	0xffeaaaab,
733 	0x00200000,
734 	0x00005102,//header
735 	0x0001d727,//input gain
736 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
737 	0x00e55557, 0xffcadd5b, 0x003d80ba,
738 	0x00d13397, 0xfff232f8, 0x00683337,
739 	0x00000001//output gain
740 };
741 
742 static u32 coef_22to11[TEGRA210_SFC_COEF_RAM_DEPTH] = {
743 	0x00005102,//header
744 	0x0001d727,//input gain
745 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
746 	0x00e55557, 0xffcadd5b, 0x003d80ba,
747 	0x00d13397, 0xfff232f8, 0x00683337,
748 	0x00000001//output gain
749 };
750 
751 static u32 coef_22to16[TEGRA210_SFC_COEF_RAM_DEPTH] = {
752 	0x000c6102,//header
753 	0x0000015f,//input gain
754 	0x00a7909c, 0xff241c71, 0x005f5e00,
755 	0xffca77f4, 0xff20dd50, 0x006855eb,
756 	0xff86c552, 0xff18137a, 0x00773648,
757 	0x00000002,//output gain
758 	0x00186102,//header
759 	0x000005f3,//input gain
760 	0x00d816d6, 0xff385383, 0x004fe566,
761 	0x003c548d, 0xff38c23d, 0x005d0b1c,
762 	0xfff02f7d, 0xff31e983, 0x0072d65d,
763 	0x00000002,//output gain
764 	0x00239204,//farrow
765 	0x000aaaab,
766 	0xffaaaaab,
767 	0xfffaaaab,
768 	0x00555555,
769 	0xff600000,
770 	0xfff55555,
771 	0x00155555,
772 	0x00055555,
773 	0xffeaaaab,
774 	0x00200000,
775 	0x00005102,//header
776 	0x0001d727,//input gain
777 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
778 	0x00e55557, 0xffcadd5b, 0x003d80ba,
779 	0x00d13397, 0xfff232f8, 0x00683337,
780 	0x00000001//output gain
781 };
782 
783 static u32 coef_22to24[TEGRA210_SFC_COEF_RAM_DEPTH] = {
784 	0x000c6102,//header
785 	0x0001d727,//input gain
786 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
787 	0x00e55557, 0xffcadd5b, 0x003d80ba,
788 	0x00d13397, 0xfff232f8, 0x00683337,
789 	0x00000002,//output gain
790 	0x00186102,//header
791 	0x000013d9,//input gain
792 	0x00ebd477, 0xff4ce383, 0x0042049d,
793 	0x0089c278, 0xff54414d, 0x00531ded,
794 	0x004a5e07, 0xff53cf41, 0x006efbdc,
795 	0x00000002,//output gain
796 	0x00235204,//farrow
797 	0x000aaaab,
798 	0xffaaaaab,
799 	0xfffaaaab,
800 	0x00555555,
801 	0xff600000,
802 	0xfff55555,
803 	0x00155555,
804 	0x00055555,
805 	0xffeaaaab,
806 	0x00200000,
807 	0x00005102,//header
808 	0x0001d029,//input gain
809 	0x00f2a98b, 0xff92aa71, 0x001fcd16,
810 	0x00ae9004, 0xffb85140, 0x0041813a,
811 	0x007f8ed1, 0xffd585fc, 0x006a69e6,
812 	0x00000001//output gain
813 };
814 
815 static u32 coef_22to32[TEGRA210_SFC_COEF_RAM_DEPTH] = {
816 	0x000c6102,//header
817 	0x0001d727,//input gain
818 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
819 	0x00e55557, 0xffcadd5b, 0x003d80ba,
820 	0x00d13397, 0xfff232f8, 0x00683337,
821 	0x00000002,//output gain
822 	0x00186102,//header
823 	0x000013d9,//input gain
824 	0x00ebd477, 0xff4ce383, 0x0042049d,
825 	0x0089c278, 0xff54414d, 0x00531ded,
826 	0x004a5e07, 0xff53cf41, 0x006efbdc,
827 	0x00000002,//output gain
828 	0x00009204,//farrow
829 	0x000aaaab,
830 	0xffaaaaab,
831 	0xfffaaaab,
832 	0x00555555,
833 	0xff600000,
834 	0xfff55555,
835 	0x00155555,
836 	0x00055555,
837 	0xffeaaaab,
838 	0x00200000
839 };
840 
841 static u32 coef_22to44[TEGRA210_SFC_COEF_RAM_DEPTH] = {
842 	0x00006102,//header
843 	0x0001d727,//input gain
844 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
845 	0x00e55557, 0xffcadd5b, 0x003d80ba,
846 	0x00d13397, 0xfff232f8, 0x00683337,
847 	0x00000002//output gain
848 };
849 
850 static u32 coef_22to48[TEGRA210_SFC_COEF_RAM_DEPTH] = {
851 	0x000c6102,//header
852 	0x0001d727,//input gain
853 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
854 	0x00e55557, 0xffcadd5b, 0x003d80ba,
855 	0x00d13397, 0xfff232f8, 0x00683337,
856 	0x00000002,//output gain
857 	0x00186102,//header
858 	0x000013d9,//input gain
859 	0x00ebd477, 0xff4ce383, 0x0042049d,
860 	0x0089c278, 0xff54414d, 0x00531ded,
861 	0x004a5e07, 0xff53cf41, 0x006efbdc,
862 	0x00000002,//output gain
863 	0x00005204,//farrow
864 	0x000aaaab,
865 	0xffaaaaab,
866 	0xfffaaaab,
867 	0x00555555,
868 	0xff600000,
869 	0xfff55555,
870 	0x00155555,
871 	0x00055555,
872 	0xffeaaaab,
873 	0x00200000
874 };
875 
876 static u32 coef_22to88[TEGRA210_SFC_COEF_RAM_DEPTH] = {
877 	0x000c6102,//header
878 	0x0001d727,//input gain
879 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
880 	0x00e55557, 0xffcadd5b, 0x003d80ba,
881 	0x00d13397, 0xfff232f8, 0x00683337,
882 	0x00000002,//output gain
883 	0x00006102,//header
884 	0x000013d9,//input gain
885 	0x00ebd477, 0xff4ce383, 0x0042049d,
886 	0x0089c278, 0xff54414d, 0x00531ded,
887 	0x004a5e07, 0xff53cf41, 0x006efbdc,
888 	0x00000002//output gain
889 };
890 
891 static u32 coef_22to96[TEGRA210_SFC_COEF_RAM_DEPTH] = {
892 	0x000c6102,//header
893 	0x0001d727,//input gain
894 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
895 	0x00e55557, 0xffcadd5b, 0x003d80ba,
896 	0x00d13397, 0xfff232f8, 0x00683337,
897 	0x00000002,//output gain
898 	0x00186102,//header
899 	0x000013d9,//input gain
900 	0x00ebd477, 0xff4ce383, 0x0042049d,
901 	0x0089c278, 0xff54414d, 0x00531ded,
902 	0x004a5e07, 0xff53cf41, 0x006efbdc,
903 	0x00000002,//output gain
904 	0x00246102,//header
905 	0x0000010a,//input gain
906 	0x00c93dc4, 0xff26f5f6, 0x005d1041,
907 	0x001002c4, 0xff245b76, 0x00666002,
908 	0xffc30a45, 0xff1baecd, 0x00765921,
909 	0x00000002,//output gain
910 	0x00005204,//farrow
911 	0x000aaaab,
912 	0xffaaaaab,
913 	0xfffaaaab,
914 	0x00555555,
915 	0xff600000,
916 	0xfff55555,
917 	0x00155555,
918 	0x00055555,
919 	0xffeaaaab,
920 	0x00200000
921 };
922 
923 static u32 coef_22to176[TEGRA210_SFC_COEF_RAM_DEPTH] = {
924 	0x000c6102,//header
925 	0x0001d727,//input gain
926 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
927 	0x00e55557, 0xffcadd5b, 0x003d80ba,
928 	0x00d13397, 0xfff232f8, 0x00683337,
929 	0x00000002,//output gain
930 	0x00186102,//header
931 	0x000013d9,//input gain
932 	0x00ebd477, 0xff4ce383, 0x0042049d,
933 	0x0089c278, 0xff54414d, 0x00531ded,
934 	0x004a5e07, 0xff53cf41, 0x006efbdc,
935 	0x00000002,//output gain
936 	0x00006102,//header
937 	0x0000010a,//input gain
938 	0x00c93dc4, 0xff26f5f6, 0x005d1041,
939 	0x001002c4, 0xff245b76, 0x00666002,
940 	0xffc30a45, 0xff1baecd, 0x00765921,
941 	0x00000002//output gain
942 };
943 
944 static u32 coef_22to192[TEGRA210_SFC_COEF_RAM_DEPTH] = {
945 	0x000c6102,//header
946 	0x0001d727,//input gain
947 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
948 	0x00e55557, 0xffcadd5b, 0x003d80ba,
949 	0x00d13397, 0xfff232f8, 0x00683337,
950 	0x00000002,//output gain
951 	0x00186102,//header
952 	0x000013d9,//input gain
953 	0x00ebd477, 0xff4ce383, 0x0042049d,
954 	0x0089c278, 0xff54414d, 0x00531ded,
955 	0x004a5e07, 0xff53cf41, 0x006efbdc,
956 	0x00000002,//output gain
957 	0x00246102,//header
958 	0x0000010a,//input gain
959 	0x00c93dc4, 0xff26f5f6, 0x005d1041,
960 	0x001002c4, 0xff245b76, 0x00666002,
961 	0xffc30a45, 0xff1baecd, 0x00765921,
962 	0x00000002,//output gain
963 	0x00000204,//farrow
964 	0x000aaaab,
965 	0xffaaaaab,
966 	0xfffaaaab,
967 	0x00555555,
968 	0xff600000,
969 	0xfff55555,
970 	0x00155555,
971 	0x00055555,
972 	0xffeaaaab,
973 	0x00200000
974 };
975 
976 static u32 coef_24to8[TEGRA210_SFC_COEF_RAM_DEPTH] = {
977 	0x00009105,//header
978 	0x000005e1,//input gain
979 	0x00dca92f, 0xff45647a, 0x0046b59c,
980 	0x00429d1e, 0xff4fec62, 0x00516d30,
981 	0xffdea779, 0xff5e08ba, 0x0060185e,
982 	0xffafbab2, 0xff698d5a, 0x006ce3ae,
983 	0xff9a82d2, 0xff704674, 0x007633c5,
984 	0xff923433, 0xff721128, 0x007cff42,
985 	0x00000001//output gain
986 };
987 
988 static u32 coef_24to11[TEGRA210_SFC_COEF_RAM_DEPTH] = {
989 	0x000f6103,//header
990 	0x000001e0,//input gain
991 	0x00de44c0, 0xff380b7f, 0x004ffc73,
992 	0x00494b44, 0xff3d493a, 0x005908bf,
993 	0xffe9a3c8, 0xff425647, 0x006745f7,
994 	0xffc42d61, 0xff40a6c7, 0x00776709,
995 	0x00000002,//output gain
996 	0x001a5204,//farrow
997 	0x000aaaab,
998 	0xffaaaaab,
999 	0xfffaaaab,
1000 	0x00555555,
1001 	0xff600000,
1002 	0xfff55555,
1003 	0x00155555,
1004 	0x00055555,
1005 	0xffeaaaab,
1006 	0x00200000,
1007 	0x00005102,//header
1008 	0x0001d727,//input gain
1009 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1010 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1011 	0x00d13397, 0xfff232f8, 0x00683337,
1012 	0x00000001//output gain
1013 };
1014 
1015 static u32 coef_24to16[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1016 	0x00156105,//header
1017 	0x00000292,//input gain
1018 	0x00e4320a, 0xff41d2d9, 0x004911ac,
1019 	0x005dd9e3, 0xff4c7d80, 0x0052103e,
1020 	0xfff8ebef, 0xff5b6fab, 0x005f0a0d,
1021 	0xffc4b414, 0xff68582c, 0x006b38e5,
1022 	0xffabb861, 0xff704bec, 0x0074de52,
1023 	0xffa19f4c, 0xff729059, 0x007c7e90,
1024 	0x00000002,//output gain
1025 	0x00009105,//header
1026 	0x00000292,//input gain
1027 	0x00e4320a, 0xff41d2d9, 0x004911ac,
1028 	0x005dd9e3, 0xff4c7d80, 0x0052103e,
1029 	0xfff8ebef, 0xff5b6fab, 0x005f0a0d,
1030 	0xffc4b414, 0xff68582c, 0x006b38e5,
1031 	0xffabb861, 0xff704bec, 0x0074de52,
1032 	0xffa19f4c, 0xff729059, 0x007c7e90,
1033 	0x00000001//output gain
1034 };
1035 
1036 static u32 coef_24to22[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1037 	0x000c6102,//header
1038 	0x0001d029,//input gain
1039 	0x00f2a98b, 0xff92aa71, 0x001fcd16,
1040 	0x00ae9004, 0xffb85140, 0x0041813a,
1041 	0x007f8ed1, 0xffd585fc, 0x006a69e6,
1042 	0x00000002,//output gain
1043 	0x001b6103,//header
1044 	0x000001e0,//input gain
1045 	0x00de44c0, 0xff380b7f, 0x004ffc73,
1046 	0x00494b44, 0xff3d493a, 0x005908bf,
1047 	0xffe9a3c8, 0xff425647, 0x006745f7,
1048 	0xffc42d61, 0xff40a6c7, 0x00776709,
1049 	0x00000002,//output gain
1050 	0x00265204,//farrow
1051 	0x000aaaab,
1052 	0xffaaaaab,
1053 	0xfffaaaab,
1054 	0x00555555,
1055 	0xff600000,
1056 	0xfff55555,
1057 	0x00155555,
1058 	0x00055555,
1059 	0xffeaaaab,
1060 	0x00200000,
1061 	0x00005102,//header
1062 	0x0001d727,//input gain
1063 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1064 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1065 	0x00d13397, 0xfff232f8, 0x00683337,
1066 	0x00000001//output gain
1067 };
1068 
1069 static u32 coef_24to32[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1070 	0x000c6102,//header
1071 	0x0001d727,//input gain
1072 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1073 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1074 	0x00d13397, 0xfff232f8, 0x00683337,
1075 	0x00000002,//output gain
1076 	0x00186102,//header
1077 	0x000013d9,//input gain
1078 	0x00ebd477, 0xff4ce383, 0x0042049d,
1079 	0x0089c278, 0xff54414d, 0x00531ded,
1080 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1081 	0x00000002,//output gain
1082 	0x00009102,//header
1083 	0x000013d9,//input gain
1084 	0x00ebd477, 0xff4ce383, 0x0042049d,
1085 	0x0089c278, 0xff54414d, 0x00531ded,
1086 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1087 	0x00000001//output gain
1088 };
1089 
1090 static u32 coef_24to44[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1091 	0x000c6102,//header
1092 	0x0001d727,//input gain
1093 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1094 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1095 	0x00d13397, 0xfff232f8, 0x00683337,
1096 	0x00000002,//output gain
1097 	0x00186102,//header
1098 	0x000013d9,//input gain
1099 	0x00ebd477, 0xff4ce383, 0x0042049d,
1100 	0x0089c278, 0xff54414d, 0x00531ded,
1101 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1102 	0x00000002,//output gain
1103 	0x00230204,//farrow
1104 	0x000aaaab,
1105 	0xffaaaaab,
1106 	0xfffaaaab,
1107 	0x00555555,
1108 	0xff600000,
1109 	0xfff55555,
1110 	0x00155555,
1111 	0x00055555,
1112 	0xffeaaaab,
1113 	0x00200000,
1114 	0x00005102,//header
1115 	0x00001685,//input gain
1116 	0x00f53ae9, 0xff52f196, 0x003e3e08,
1117 	0x00b9f857, 0xff5d8985, 0x0050070a,
1118 	0x008c3e86, 0xff6053f0, 0x006d98ef,
1119 	0x00000001//output gain
1120 };
1121 
1122 static u32 coef_24to48[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1123 	0x00006102,//header
1124 	0x0001d727,//input gain
1125 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1126 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1127 	0x00d13397, 0xfff232f8, 0x00683337,
1128 	0x00000002//output gain
1129 };
1130 
1131 static u32 coef_24to88[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1132 	0x000c6102,//header
1133 	0x0001d727,//input gain
1134 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1135 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1136 	0x00d13397, 0xfff232f8, 0x00683337,
1137 	0x00000002,//output gain
1138 	0x00186102,//header
1139 	0x000013d9,//input gain
1140 	0x00ebd477, 0xff4ce383, 0x0042049d,
1141 	0x0089c278, 0xff54414d, 0x00531ded,
1142 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1143 	0x00000002,//output gain
1144 	0x00246102,//header
1145 	0x0000010a,//input gain
1146 	0x00c93dc4, 0xff26f5f6, 0x005d1041,
1147 	0x001002c4, 0xff245b76, 0x00666002,
1148 	0xffc30a45, 0xff1baecd, 0x00765921,
1149 	0x00000002,//output gain
1150 	0x002f0204,//farrow
1151 	0x000aaaab,
1152 	0xffaaaaab,
1153 	0xfffaaaab,
1154 	0x00555555,
1155 	0xff600000,
1156 	0xfff55555,
1157 	0x00155555,
1158 	0x00055555,
1159 	0xffeaaaab,
1160 	0x00200000,
1161 	0x00005102,//header
1162 	0x00000138,//input gain
1163 	0x00d5d232, 0xff2a3bf8, 0x005a785c,
1164 	0x0034001b, 0xff283109, 0x006462a6,
1165 	0xffe6746a, 0xff1fb09c, 0x00758a91,
1166 	0x00000001//output gain
1167 };
1168 
1169 static u32 coef_24to96[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1170 	0x000c6102,//header
1171 	0x0001d727,//input gain
1172 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1173 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1174 	0x00d13397, 0xfff232f8, 0x00683337,
1175 	0x00000002,//output gain
1176 	0x00006102,//header
1177 	0x000013d9,//input gain
1178 	0x00ebd477, 0xff4ce383, 0x0042049d,
1179 	0x0089c278, 0xff54414d, 0x00531ded,
1180 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1181 	0x00000002//output gain
1182 };
1183 
1184 static u32 coef_24to176[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1185 	0x000c6102,//header
1186 	0x0001d727,//input gain
1187 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1188 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1189 	0x00d13397, 0xfff232f8, 0x00683337,
1190 	0x00000002,//output gain
1191 	0x00186102,//header
1192 	0x000013d9,//input gain
1193 	0x00ebd477, 0xff4ce383, 0x0042049d,
1194 	0x0089c278, 0xff54414d, 0x00531ded,
1195 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1196 	0x00000002,//output gain
1197 	0x00246102,//header
1198 	0x0000010a,//input gain
1199 	0x00c93dc4, 0xff26f5f6, 0x005d1041,
1200 	0x001002c4, 0xff245b76, 0x00666002,
1201 	0xffc30a45, 0xff1baecd, 0x00765921,
1202 	0x00000002,//output gain
1203 	0x00000204,//farrow
1204 	0x000aaaab,
1205 	0xffaaaaab,
1206 	0xfffaaaab,
1207 	0x00555555,
1208 	0xff600000,
1209 	0xfff55555,
1210 	0x00155555,
1211 	0x00055555,
1212 	0xffeaaaab,
1213 	0x00200000
1214 };
1215 
1216 static u32 coef_24to192[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1217 	0x000c6102,//header
1218 	0x0001d727,//input gain
1219 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1220 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1221 	0x00d13397, 0xfff232f8, 0x00683337,
1222 	0x00000002,//output gain
1223 	0x00186102,//header
1224 	0x000013d9,//input gain
1225 	0x00ebd477, 0xff4ce383, 0x0042049d,
1226 	0x0089c278, 0xff54414d, 0x00531ded,
1227 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1228 	0x00000002,//output gain
1229 	0x00006102,//header
1230 	0x0000010a,//input gain
1231 	0x00c93dc4, 0xff26f5f6, 0x005d1041,
1232 	0x001002c4, 0xff245b76, 0x00666002,
1233 	0xffc30a45, 0xff1baecd, 0x00765921,
1234 	0x00000002//output gain
1235 };
1236 
1237 static u32 coef_32to8[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1238 	0x000c5102,//header
1239 	0x000013d9,//input gain
1240 	0x00ebd477, 0xff4ce383, 0x0042049d,
1241 	0x0089c278, 0xff54414d, 0x00531ded,
1242 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1243 	0x00000001,//output gain
1244 	0x00005102,//header
1245 	0x0001d727,//input gain
1246 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1247 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1248 	0x00d13397, 0xfff232f8, 0x00683337,
1249 	0x00000001//output gain
1250 };
1251 
1252 static u32 coef_32to11[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1253 	0x000ca102,//header
1254 	0x000000af,//input gain
1255 	0x00c65663, 0xff23d2ce, 0x005f97d6,
1256 	0x00086ad6, 0xff20ec4f, 0x00683201,
1257 	0xffbbbef6, 0xff184447, 0x00770963,
1258 	0x00000003,//output gain
1259 	0x00175204,//farrow
1260 	0x000aaaab,
1261 	0xffaaaaab,
1262 	0xfffaaaab,
1263 	0x00555555,
1264 	0xff600000,
1265 	0xfff55555,
1266 	0x00155555,
1267 	0x00055555,
1268 	0xffeaaaab,
1269 	0x00200000,
1270 	0x0000d102,//header
1271 	0x000013d9,//input gain
1272 	0x00ebd477, 0xff4ce383, 0x0042049d,
1273 	0x0089c278, 0xff54414d, 0x00531ded,
1274 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1275 	0x00000001//output gain
1276 };
1277 
1278 static u32 coef_32to16[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1279 	0x00005102,//header
1280 	0x0001d727,//input gain
1281 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1282 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1283 	0x00d13397, 0xfff232f8, 0x00683337,
1284 	0x00000001//output gain
1285 };
1286 
1287 static u32 coef_32to22[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1288 	0x000fa103,//header
1289 	0x000001e0,//input gain
1290 	0x00de44c0, 0xff380b7f, 0x004ffc73,
1291 	0x00494b44, 0xff3d493a, 0x005908bf,
1292 	0xffe9a3c8, 0xff425647, 0x006745f7,
1293 	0xffc42d61, 0xff40a6c7, 0x00776709,
1294 	0x00000003,//output gain
1295 	0x001a5204,//farrow
1296 	0x000aaaab,
1297 	0xffaaaaab,
1298 	0xfffaaaab,
1299 	0x00555555,
1300 	0xff600000,
1301 	0xfff55555,
1302 	0x00155555,
1303 	0x00055555,
1304 	0xffeaaaab,
1305 	0x00200000,
1306 	0x00005102,//header
1307 	0x0001d727,//input gain
1308 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1309 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1310 	0x00d13397, 0xfff232f8, 0x00683337,
1311 	0x00000001//output gain
1312 };
1313 
1314 static u32 coef_32to24[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1315 	0x000ca102,//header
1316 	0x000013d9,//input gain
1317 	0x00ebd477, 0xff4ce383, 0x0042049d,
1318 	0x0089c278, 0xff54414d, 0x00531ded,
1319 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1320 	0x00000003,//output gain
1321 	0x0000d102,//header
1322 	0x000013d9,//input gain
1323 	0x00ebd477, 0xff4ce383, 0x0042049d,
1324 	0x0089c278, 0xff54414d, 0x00531ded,
1325 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1326 	0x00000001//output gain
1327 };
1328 
1329 static u32 coef_32to44[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1330 	0x000c6102,//header
1331 	0x0001d727,//input gain
1332 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1333 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1334 	0x00d13397, 0xfff232f8, 0x00683337,
1335 	0x00000002,//output gain
1336 	0x0018a102,//header
1337 	0x000005d6,//input gain
1338 	0x00c6543e, 0xff342935, 0x0052f116,
1339 	0x000a1d78, 0xff3330c0, 0x005f88a3,
1340 	0xffbee7c0, 0xff2b5ba5, 0x0073eb26,
1341 	0x00000003,//output gain
1342 	0x00235204,//farrow
1343 	0x000aaaab,
1344 	0xffaaaaab,
1345 	0xfffaaaab,
1346 	0x00555555,
1347 	0xff600000,
1348 	0xfff55555,
1349 	0x00155555,
1350 	0x00055555,
1351 	0xffeaaaab,
1352 	0x00200000,
1353 	0x00005102,//header
1354 	0x0000015f,//input gain
1355 	0x00a7909c, 0xff241c71, 0x005f5e00,
1356 	0xffca77f4, 0xff20dd50, 0x006855eb,
1357 	0xff86c552, 0xff18137a, 0x00773648,
1358 	0x00000001//output gain
1359 };
1360 
1361 static u32 coef_32to48[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1362 	0x0015a105,//header
1363 	0x00000292,//input gain
1364 	0x00e4320a, 0xff41d2d9, 0x004911ac,
1365 	0x005dd9e3, 0xff4c7d80, 0x0052103e,
1366 	0xfff8ebef, 0xff5b6fab, 0x005f0a0d,
1367 	0xffc4b414, 0xff68582c, 0x006b38e5,
1368 	0xffabb861, 0xff704bec, 0x0074de52,
1369 	0xffa19f4c, 0xff729059, 0x007c7e90,
1370 	0x00000003,//output gain
1371 	0x00005105,//header
1372 	0x00000292,//input gain
1373 	0x00e4320a, 0xff41d2d9, 0x004911ac,
1374 	0x005dd9e3, 0xff4c7d80, 0x0052103e,
1375 	0xfff8ebef, 0xff5b6fab, 0x005f0a0d,
1376 	0xffc4b414, 0xff68582c, 0x006b38e5,
1377 	0xffabb861, 0xff704bec, 0x0074de52,
1378 	0xffa19f4c, 0xff729059, 0x007c7e90,
1379 	0x00000001//output gain
1380 };
1381 
1382 static u32 coef_32to88[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1383 	0x000c6102,//header
1384 	0x0001d727,//input gain
1385 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1386 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1387 	0x00d13397, 0xfff232f8, 0x00683337,
1388 	0x00000002,//output gain
1389 	0x0018a102,//header
1390 	0x000005d6,//input gain
1391 	0x00c6543e, 0xff342935, 0x0052f116,
1392 	0x000a1d78, 0xff3330c0, 0x005f88a3,
1393 	0xffbee7c0, 0xff2b5ba5, 0x0073eb26,
1394 	0x00000003,//output gain
1395 	0x00230204,//farrow
1396 	0x000aaaab,
1397 	0xffaaaaab,
1398 	0xfffaaaab,
1399 	0x00555555,
1400 	0xff600000,
1401 	0xfff55555,
1402 	0x00155555,
1403 	0x00055555,
1404 	0xffeaaaab,
1405 	0x00200000,
1406 	0x00005102,//header
1407 	0x000005f3,//input gain
1408 	0x00d816d6, 0xff385383, 0x004fe566,
1409 	0x003c548d, 0xff38c23d, 0x005d0b1c,
1410 	0xfff02f7d, 0xff31e983, 0x0072d65d,
1411 	0x00000001//output gain
1412 };
1413 
1414 static u32 coef_32to96[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1415 	0x0000a105,//header
1416 	0x00000292,//input gain
1417 	0x00e4320a, 0xff41d2d9, 0x004911ac,
1418 	0x005dd9e3, 0xff4c7d80, 0x0052103e,
1419 	0xfff8ebef, 0xff5b6fab, 0x005f0a0d,
1420 	0xffc4b414, 0xff68582c, 0x006b38e5,
1421 	0xffabb861, 0xff704bec, 0x0074de52,
1422 	0xffa19f4c, 0xff729059, 0x007c7e90,
1423 	0x00000003//output gain
1424 };
1425 
1426 static u32 coef_32to176[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1427 	0x000c6102,//header
1428 	0x0001d727,//input gain
1429 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1430 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1431 	0x00d13397, 0xfff232f8, 0x00683337,
1432 	0x00000002,//output gain
1433 	0x0018a102,//header
1434 	0x000005d6,//input gain
1435 	0x00c6543e, 0xff342935, 0x0052f116,
1436 	0x000a1d78, 0xff3330c0, 0x005f88a3,
1437 	0xffbee7c0, 0xff2b5ba5, 0x0073eb26,
1438 	0x00000003,//output gain
1439 	0x00000204,//farrow
1440 	0x000aaaab,
1441 	0xffaaaaab,
1442 	0xfffaaaab,
1443 	0x00555555,
1444 	0xff600000,
1445 	0xfff55555,
1446 	0x00155555,
1447 	0x00055555,
1448 	0xffeaaaab,
1449 	0x00200000
1450 };
1451 
1452 static u32 coef_32to192[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1453 	0x000c6102,//header
1454 	0x0001d727,//input gain
1455 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1456 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1457 	0x00d13397, 0xfff232f8, 0x00683337,
1458 	0x00000002,//output gain
1459 	0x0000a102,//header
1460 	0x000005d6,//input gain
1461 	0x00c6543e, 0xff342935, 0x0052f116,
1462 	0x000a1d78, 0xff3330c0, 0x005f88a3,
1463 	0xffbee7c0, 0xff2b5ba5, 0x0073eb26,
1464 	0x00000003//output gain
1465 };
1466 
1467 static u32 coef_44to8[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1468 	0x00120104,//IIR Filter
1469 	0x00000af2,//input gain
1470 	0x0057eebe, 0xff1e9863, 0x00652604,
1471 	0xff7206ea, 0xff22ad7e, 0x006d47e1,
1472 	0xff42a4d7, 0xff26e722, 0x0075fd83,
1473 	0xff352f66, 0xff29312b, 0x007b986b,
1474 	0xff310a07, 0xff296f51, 0x007eca7c,
1475 	0x00000001,//output gain
1476 	0x001d9204,//Farrow Filter + decimation
1477 	0x000aaaab,
1478 	0xffaaaaab,
1479 	0xfffaaaab,
1480 	0x00555555,
1481 	0xff600000,
1482 	0xfff55555,
1483 	0x00155555,
1484 	0x00055555,
1485 	0xffeaaaab,
1486 	0x00200000,
1487 	0x00005105,//IIR Filter + Decimator
1488 	0x0000d649,//input gain
1489 	0x00e87afb, 0xff5f69d0, 0x003df3cf,
1490 	0x007ce488, 0xff99a5c8, 0x0056a6a0,
1491 	0x00344928, 0xffcba3e5, 0x006be470,
1492 	0x00137aa7, 0xffe60276, 0x00773410,
1493 	0x0005fa2a, 0xfff1ac11, 0x007c795b,
1494 	0x00012d36, 0xfff5eca2, 0x007f10ef,
1495 	0x00000001//output gain
1496 };
1497 
1498 static u32 coef_44to11[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1499 	0x000c5102,//header
1500 	0x000013d9,//input gain
1501 	0x00ebd477, 0xff4ce383, 0x0042049d,
1502 	0x0089c278, 0xff54414d, 0x00531ded,
1503 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1504 	0x00000001,//output gain
1505 	0x00005102,//header
1506 	0x0001d727,//input gain
1507 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1508 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1509 	0x00d13397, 0xfff232f8, 0x00683337,
1510 	0x00000001//output gain
1511 };
1512 
1513 static u32 coef_44to16[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1514 	0x00126104,//IIR Filter + interpolation
1515 	0x00000af2,//input gain
1516 	0x0057eebe, 0xff1e9863, 0x00652604,
1517 	0xff7206ea, 0xff22ad7e, 0x006d47e1,
1518 	0xff42a4d7, 0xff26e722, 0x0075fd83,
1519 	0xff352f66, 0xff29312b, 0x007b986b,
1520 	0xff310a07, 0xff296f51, 0x007eca7c,
1521 	0x00000002,//output gain
1522 	0x001d9204,//Farrow Filter + decimation
1523 	0x000aaaab,
1524 	0xffaaaaab,
1525 	0xfffaaaab,
1526 	0x00555555,
1527 	0xff600000,
1528 	0xfff55555,
1529 	0x00155555,
1530 	0x00055555,
1531 	0xffeaaaab,
1532 	0x00200000,
1533 	0x00005105,//IIR Filter + Decimator
1534 	0x0000d649,//input gain
1535 	0x00e87afb, 0xff5f69d0, 0x003df3cf,
1536 	0x007ce488, 0xff99a5c8, 0x0056a6a0,
1537 	0x00344928, 0xffcba3e5, 0x006be470,
1538 	0x00137aa7, 0xffe60276, 0x00773410,
1539 	0x0005fa2a, 0xfff1ac11, 0x007c795b,
1540 	0x00012d36, 0xfff5eca2, 0x007f10ef,
1541 	0x00000001//output gain
1542 };
1543 
1544 static u32 coef_44to22[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1545 	0x00005102,//header
1546 	0x0001d727,//input gain
1547 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1548 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1549 	0x00d13397, 0xfff232f8, 0x00683337,
1550 	0x00000001//output gain
1551 };
1552 
1553 static u32 coef_44to24[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1554 	0x000c6102,//header
1555 	0x00001685,//input gain
1556 	0x00f53ae9, 0xff52f196, 0x003e3e08,
1557 	0x00b9f857, 0xff5d8985, 0x0050070a,
1558 	0x008c3e86, 0xff6053f0, 0x006d98ef,
1559 	0x00000002,//output gain
1560 	0x00175204,//farrow
1561 	0x000aaaab,
1562 	0xffaaaaab,
1563 	0xfffaaaab,
1564 	0x00555555,
1565 	0xff600000,
1566 	0xfff55555,
1567 	0x00155555,
1568 	0x00055555,
1569 	0xffeaaaab,
1570 	0x00200000,
1571 	0x00005102,//header
1572 	0x0001d727,//input gain
1573 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1574 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1575 	0x00d13397, 0xfff232f8, 0x00683337,
1576 	0x00000001//output gain
1577 };
1578 
1579 static u32 coef_44to32[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1580 	0x000c6102,//header
1581 	0x0000015f,//input gain
1582 	0x00a7909c, 0xff241c71, 0x005f5e00,
1583 	0xffca77f4, 0xff20dd50, 0x006855eb,
1584 	0xff86c552, 0xff18137a, 0x00773648,
1585 	0x00000002,//output gain
1586 	0x00186102,//header
1587 	0x000005f3,//input gain
1588 	0x00d816d6, 0xff385383, 0x004fe566,
1589 	0x003c548d, 0xff38c23d, 0x005d0b1c,
1590 	0xfff02f7d, 0xff31e983, 0x0072d65d,
1591 	0x00000002,//output gain
1592 	0x00239204,//farrow
1593 	0x000aaaab,
1594 	0xffaaaaab,
1595 	0xfffaaaab,
1596 	0x00555555,
1597 	0xff600000,
1598 	0xfff55555,
1599 	0x00155555,
1600 	0x00055555,
1601 	0xffeaaaab,
1602 	0x00200000,
1603 	0x00005102,//header
1604 	0x0001d727,//input gain
1605 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1606 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1607 	0x00d13397, 0xfff232f8, 0x00683337,
1608 	0x00000001//output gain
1609 };
1610 
1611 static u32 coef_44to48[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1612 	0x000c6102,//header
1613 	0x0001d727,//input gain
1614 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1615 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1616 	0x00d13397, 0xfff232f8, 0x00683337,
1617 	0x00000002,//output gain
1618 	0x00186102,//header
1619 	0x000013d9,//input gain
1620 	0x00ebd477, 0xff4ce383, 0x0042049d,
1621 	0x0089c278, 0xff54414d, 0x00531ded,
1622 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1623 	0x00000002,//output gain
1624 	0x00235204,//farrow
1625 	0x000aaaab,
1626 	0xffaaaaab,
1627 	0xfffaaaab,
1628 	0x00555555,
1629 	0xff600000,
1630 	0xfff55555,
1631 	0x00155555,
1632 	0x00055555,
1633 	0xffeaaaab,
1634 	0x00200000,
1635 	0x00005102,//header
1636 	0x0001d029,//input gain
1637 	0x00f2a98b, 0xff92aa71, 0x001fcd16,
1638 	0x00ae9004, 0xffb85140, 0x0041813a,
1639 	0x007f8ed1, 0xffd585fc, 0x006a69e6,
1640 	0x00000001//output gain
1641 };
1642 
1643 static u32 coef_44to88[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1644 	0x00006102,//header
1645 	0x0001d727,//input gain
1646 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1647 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1648 	0x00d13397, 0xfff232f8, 0x00683337,
1649 	0x00000002//output gain
1650 };
1651 
1652 static u32 coef_44to96[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1653 	0x000c6102,//header
1654 	0x0001d727,//input gain
1655 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1656 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1657 	0x00d13397, 0xfff232f8, 0x00683337,
1658 	0x00000002,//output gain
1659 	0x00186102,//header
1660 	0x000013d9,//input gain
1661 	0x00ebd477, 0xff4ce383, 0x0042049d,
1662 	0x0089c278, 0xff54414d, 0x00531ded,
1663 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1664 	0x00000002,//output gain
1665 	0x00005204,//farrow
1666 	0x000aaaab,
1667 	0xffaaaaab,
1668 	0xfffaaaab,
1669 	0x00555555,
1670 	0xff600000,
1671 	0xfff55555,
1672 	0x00155555,
1673 	0x00055555,
1674 	0xffeaaaab,
1675 	0x00200000
1676 };
1677 
1678 static u32 coef_44to176[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1679 	0x000c6102,//header
1680 	0x0001d727,//input gain
1681 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1682 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1683 	0x00d13397, 0xfff232f8, 0x00683337,
1684 	0x00000002,//output gain
1685 	0x00006102,//header
1686 	0x000013d9,//input gain
1687 	0x00ebd477, 0xff4ce383, 0x0042049d,
1688 	0x0089c278, 0xff54414d, 0x00531ded,
1689 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1690 	0x00000002//output gain
1691 };
1692 
1693 static u32 coef_44to192[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1694 	0x000c6102,//header
1695 	0x0001d727,//input gain
1696 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1697 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1698 	0x00d13397, 0xfff232f8, 0x00683337,
1699 	0x00000002,//output gain
1700 	0x00186102,//header
1701 	0x000013d9,//input gain
1702 	0x00ebd477, 0xff4ce383, 0x0042049d,
1703 	0x0089c278, 0xff54414d, 0x00531ded,
1704 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1705 	0x00000002,//output gain
1706 	0x00246102,//header
1707 	0x0000010a,//input gain
1708 	0x00c93dc4, 0xff26f5f6, 0x005d1041,
1709 	0x001002c4, 0xff245b76, 0x00666002,
1710 	0xffc30a45, 0xff1baecd, 0x00765921,
1711 	0x00000002,//output gain
1712 	0x00005204,//farrow
1713 	0x000aaaab,
1714 	0xffaaaaab,
1715 	0xfffaaaab,
1716 	0x00555555,
1717 	0xff600000,
1718 	0xfff55555,
1719 	0x00155555,
1720 	0x00055555,
1721 	0xffeaaaab,
1722 	0x00200000
1723 };
1724 
1725 static u32 coef_48to8[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1726 	0x000c9102,//IIR Filter + Decimator
1727 	0x00000e00,//input gain
1728 	0x00e2e000, 0xff6e1a00, 0x002aaa00,
1729 	0x00610a00, 0xff5dda00, 0x003ccc00,
1730 	0x00163a00, 0xff3c0400, 0x00633200,
1731 	0x00000001,//output gain
1732 	0x00005105,//IIR Filter + Decimator
1733 	0x0000d649,//input gain
1734 	0x00e87afb, 0xff5f69d0, 0x003df3cf,
1735 	0x007ce488, 0xff99a5c8, 0x0056a6a0,
1736 	0x00344928, 0xffcba3e5, 0x006be470,
1737 	0x00137aa7, 0xffe60276, 0x00773410,
1738 	0x0005fa2a, 0xfff1ac11, 0x007c795b,
1739 	0x00012d36, 0xfff5eca2, 0x007f10ef,
1740 	0x00000001//output gain
1741 };
1742 
1743 static u32 coef_48to11[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1744 	0x000c6102,//header
1745 	0x000000af,//input gain
1746 	0x00c65663, 0xff23d2ce, 0x005f97d6,
1747 	0x00086ad6, 0xff20ec4f, 0x00683201,
1748 	0xffbbbef6, 0xff184447, 0x00770963,
1749 	0x00000002,//output gain
1750 	0x00175204,//farrow
1751 	0x000aaaab,
1752 	0xffaaaaab,
1753 	0xfffaaaab,
1754 	0x00555555,
1755 	0xff600000,
1756 	0xfff55555,
1757 	0x00155555,
1758 	0x00055555,
1759 	0xffeaaaab,
1760 	0x00200000,
1761 	0x00235102,//header
1762 	0x000013d9,//input gain
1763 	0x00ebd477, 0xff4ce383, 0x0042049d,
1764 	0x0089c278, 0xff54414d, 0x00531ded,
1765 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1766 	0x00000001,//output gain
1767 	0x00005102,//header
1768 	0x0001d727,//input gain
1769 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1770 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1771 	0x00d13397, 0xfff232f8, 0x00683337,
1772 	0x00000001//output gain
1773 };
1774 
1775 static u32 coef_48to16[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1776 	0x00009105,//IIR Filter + Decimator
1777 	0x00000784,//input gain
1778 	0x00cc516e, 0xff2c9639, 0x005ad5b3,
1779 	0x0013ad0d, 0xff3d4799, 0x0063ce75,
1780 	0xffb6f398, 0xff5138d1, 0x006e9e1f,
1781 	0xff9186e5, 0xff5f96a4, 0x0076a86e,
1782 	0xff82089c, 0xff676b81, 0x007b9f8a,
1783 	0xff7c48a5, 0xff6a31e7, 0x007ebb7b,
1784 	0x00000001//output gain
1785 };
1786 
1787 static u32 coef_48to22[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1788 	0x000f6103,//header
1789 	0x000001e0,//input gain
1790 	0x00de44c0, 0xff380b7f, 0x004ffc73,
1791 	0x00494b44, 0xff3d493a, 0x005908bf,
1792 	0xffe9a3c8, 0xff425647, 0x006745f7,
1793 	0xffc42d61, 0xff40a6c7, 0x00776709,
1794 	0x00000002,//output gain
1795 	0x001a5204,//farrow
1796 	0x000aaaab,
1797 	0xffaaaaab,
1798 	0xfffaaaab,
1799 	0x00555555,
1800 	0xff600000,
1801 	0xfff55555,
1802 	0x00155555,
1803 	0x00055555,
1804 	0xffeaaaab,
1805 	0x00200000,
1806 	0x00005102,//header
1807 	0x0001d727,//input gain
1808 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1809 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1810 	0x00d13397, 0xfff232f8, 0x00683337,
1811 	0x00000001//output gain
1812 };
1813 
1814 static u32 coef_48to24[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1815 	0x00005102,//header
1816 	0x0001d727,//input gain
1817 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1818 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1819 	0x00d13397, 0xfff232f8, 0x00683337,
1820 	0x00000001//output gain
1821 };
1822 
1823 static u32 coef_48to32[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1824 	0x00156105,//header
1825 	0x00000292,//input gain
1826 	0x00e4320a, 0xff41d2d9, 0x004911ac,
1827 	0x005dd9e3, 0xff4c7d80, 0x0052103e,
1828 	0xfff8ebef, 0xff5b6fab, 0x005f0a0d,
1829 	0xffc4b414, 0xff68582c, 0x006b38e5,
1830 	0xffabb861, 0xff704bec, 0x0074de52,
1831 	0xffa19f4c, 0xff729059, 0x007c7e90,
1832 	0x00000002,//output gain
1833 	0x00009105,//header
1834 	0x00000292,//input gain
1835 	0x00e4320a, 0xff41d2d9, 0x004911ac,
1836 	0x005dd9e3, 0xff4c7d80, 0x0052103e,
1837 	0xfff8ebef, 0xff5b6fab, 0x005f0a0d,
1838 	0xffc4b414, 0xff68582c, 0x006b38e5,
1839 	0xffabb861, 0xff704bec, 0x0074de52,
1840 	0xffa19f4c, 0xff729059, 0x007c7e90,
1841 	0x00000001//output gain
1842 };
1843 
1844 static u32 coef_48to44[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1845 	0x000c6102,//header
1846 	0x0001d029,//input gain
1847 	0x00f2a98b, 0xff92aa71, 0x001fcd16,
1848 	0x00ae9004, 0xffb85140, 0x0041813a,
1849 	0x007f8ed1, 0xffd585fc, 0x006a69e6,
1850 	0x00000002,//output gain
1851 	0x001b6103,//header
1852 	0x000001e0,//input gain
1853 	0x00de44c0, 0xff380b7f, 0x004ffc73,
1854 	0x00494b44, 0xff3d493a, 0x005908bf,
1855 	0xffe9a3c8, 0xff425647, 0x006745f7,
1856 	0xffc42d61, 0xff40a6c7, 0x00776709,
1857 	0x00000002,//output gain
1858 	0x00265204,//farrow
1859 	0x000aaaab,
1860 	0xffaaaaab,
1861 	0xfffaaaab,
1862 	0x00555555,
1863 	0xff600000,
1864 	0xfff55555,
1865 	0x00155555,
1866 	0x00055555,
1867 	0xffeaaaab,
1868 	0x00200000,
1869 	0x00005102,//header
1870 	0x0001d727,//input gain
1871 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1872 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1873 	0x00d13397, 0xfff232f8, 0x00683337,
1874 	0x00000001//output gain
1875 };
1876 
1877 static u32 coef_48to88[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1878 	0x000c6102,//header
1879 	0x0001d727,//input gain
1880 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1881 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1882 	0x00d13397, 0xfff232f8, 0x00683337,
1883 	0x00000002,//output gain
1884 	0x00186102,//header
1885 	0x000013d9,//input gain
1886 	0x00ebd477, 0xff4ce383, 0x0042049d,
1887 	0x0089c278, 0xff54414d, 0x00531ded,
1888 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1889 	0x00000002,//output gain
1890 	0x00230204,//farrow
1891 	0x000aaaab,
1892 	0xffaaaaab,
1893 	0xfffaaaab,
1894 	0x00555555,
1895 	0xff600000,
1896 	0xfff55555,
1897 	0x00155555,
1898 	0x00055555,
1899 	0xffeaaaab,
1900 	0x00200000,
1901 	0x00005102,//header
1902 	0x00001685,//input gain
1903 	0x00f53ae9, 0xff52f196, 0x003e3e08,
1904 	0x00b9f857, 0xff5d8985, 0x0050070a,
1905 	0x008c3e86, 0xff6053f0, 0x006d98ef,
1906 	0x00000001//output gain
1907 };
1908 
1909 static u32 coef_48to96[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1910 	0x00006102,//header
1911 	0x0001d727,//input gain
1912 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1913 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1914 	0x00d13397, 0xfff232f8, 0x00683337,
1915 	0x00000002//output gain
1916 };
1917 
1918 static u32 coef_48to176[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1919 	0x000c6102,//header
1920 	0x0001d727,//input gain
1921 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1922 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1923 	0x00d13397, 0xfff232f8, 0x00683337,
1924 	0x00000002,//output gain
1925 	0x00186102,//header
1926 	0x000013d9,//input gain
1927 	0x00ebd477, 0xff4ce383, 0x0042049d,
1928 	0x0089c278, 0xff54414d, 0x00531ded,
1929 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1930 	0x00000002,//output gain
1931 	0x00246102,//header
1932 	0x0000010a,//input gain
1933 	0x00c93dc4, 0xff26f5f6, 0x005d1041,
1934 	0x001002c4, 0xff245b76, 0x00666002,
1935 	0xffc30a45, 0xff1baecd, 0x00765921,
1936 	0x00000002,//output gain
1937 	0x002f0204,//farrow
1938 	0x000aaaab,
1939 	0xffaaaaab,
1940 	0xfffaaaab,
1941 	0x00555555,
1942 	0xff600000,
1943 	0xfff55555,
1944 	0x00155555,
1945 	0x00055555,
1946 	0xffeaaaab,
1947 	0x00200000,
1948 	0x00005102,//header
1949 	0x00000138,//input gain
1950 	0x00d5d232, 0xff2a3bf8, 0x005a785c,
1951 	0x0034001b, 0xff283109, 0x006462a6,
1952 	0xffe6746a, 0xff1fb09c, 0x00758a91,
1953 	0x00000001//output gain
1954 };
1955 
1956 static u32 coef_48to192[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1957 	0x000c6102,//header
1958 	0x0001d727,//input gain
1959 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1960 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1961 	0x00d13397, 0xfff232f8, 0x00683337,
1962 	0x00000002,//output gain
1963 	0x00006102,//header
1964 	0x000013d9,//input gain
1965 	0x00ebd477, 0xff4ce383, 0x0042049d,
1966 	0x0089c278, 0xff54414d, 0x00531ded,
1967 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1968 	0x00000002//output gain
1969 };
1970 
1971 static u32 coef_88to8[TEGRA210_SFC_COEF_RAM_DEPTH] = {
1972 	0x000c0102,//header
1973 	0x00000057,//input gain
1974 	0x00a8e717, 0xff1c748d, 0x0065b976,
1975 	0xffcbccab, 0xff190aff, 0x006cc1cf,
1976 	0xff871ce1, 0xff10d878, 0x0078cfc5,
1977 	0x00000001,//output gain
1978 	0x00179204,//farrow
1979 	0x000aaaab,
1980 	0xffaaaaab,
1981 	0xfffaaaab,
1982 	0x00555555,
1983 	0xff600000,
1984 	0xfff55555,
1985 	0x00155555,
1986 	0x00055555,
1987 	0xffeaaaab,
1988 	0x00200000,
1989 	0x00235102,//header
1990 	0x000013d9,//input gain
1991 	0x00ebd477, 0xff4ce383, 0x0042049d,
1992 	0x0089c278, 0xff54414d, 0x00531ded,
1993 	0x004a5e07, 0xff53cf41, 0x006efbdc,
1994 	0x00000001,//output gain
1995 	0x00005102,//header
1996 	0x0001d727,//input gain
1997 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
1998 	0x00e55557, 0xffcadd5b, 0x003d80ba,
1999 	0x00d13397, 0xfff232f8, 0x00683337,
2000 	0x00000001//output gain
2001 };
2002 
2003 static u32 coef_88to11[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2004 	0x000c5102,//header
2005 	0x0000010a,//input gain
2006 	0x00c93dc4, 0xff26f5f6, 0x005d1041,
2007 	0x001002c4, 0xff245b76, 0x00666002,
2008 	0xffc30a45, 0xff1baecd, 0x00765921,
2009 	0x00000001,//output gain
2010 	0x00185102,//header
2011 	0x000013d9,//input gain
2012 	0x00ebd477, 0xff4ce383, 0x0042049d,
2013 	0x0089c278, 0xff54414d, 0x00531ded,
2014 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2015 	0x00000001,//output gain
2016 	0x00005102,//header
2017 	0x0001d727,//input gain
2018 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2019 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2020 	0x00d13397, 0xfff232f8, 0x00683337,
2021 	0x00000001//output gain
2022 };
2023 
2024 static u32 coef_88to16[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2025 	0x000c0102,//header
2026 	0x000005f3,//input gain
2027 	0x00d816d6, 0xff385383, 0x004fe566,
2028 	0x003c548d, 0xff38c23d, 0x005d0b1c,
2029 	0xfff02f7d, 0xff31e983, 0x0072d65d,
2030 	0x00000001,//output gain
2031 	0x00179204,//farrow
2032 	0x000aaaab,
2033 	0xffaaaaab,
2034 	0xfffaaaab,
2035 	0x00555555,
2036 	0xff600000,
2037 	0xfff55555,
2038 	0x00155555,
2039 	0x00055555,
2040 	0xffeaaaab,
2041 	0x00200000,
2042 	0x00005102,//header
2043 	0x0001d727,//input gain
2044 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2045 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2046 	0x00d13397, 0xfff232f8, 0x00683337,
2047 	0x00000001//output gain
2048 };
2049 
2050 static u32 coef_88to22[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2051 	0x000c5102,//header
2052 	0x000013d9,//input gain
2053 	0x00ebd477, 0xff4ce383, 0x0042049d,
2054 	0x0089c278, 0xff54414d, 0x00531ded,
2055 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2056 	0x00000001,//output gain
2057 	0x00005102,//header
2058 	0x0001d727,//input gain
2059 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2060 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2061 	0x00d13397, 0xfff232f8, 0x00683337,
2062 	0x00000001//output gain
2063 };
2064 
2065 static u32 coef_88to24[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2066 	0x000c0102,//header
2067 	0x00001685,//input gain
2068 	0x00f53ae9, 0xff52f196, 0x003e3e08,
2069 	0x00b9f857, 0xff5d8985, 0x0050070a,
2070 	0x008c3e86, 0xff6053f0, 0x006d98ef,
2071 	0x00000001,//output gain
2072 	0x00175204,//farrow
2073 	0x000aaaab,
2074 	0xffaaaaab,
2075 	0xfffaaaab,
2076 	0x00555555,
2077 	0xff600000,
2078 	0xfff55555,
2079 	0x00155555,
2080 	0x00055555,
2081 	0xffeaaaab,
2082 	0x00200000,
2083 	0x00005102,//header
2084 	0x0001d727,//input gain
2085 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2086 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2087 	0x00d13397, 0xfff232f8, 0x00683337,
2088 	0x00000001//output gain
2089 };
2090 
2091 static u32 coef_88to32[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2092 	0x000c6102,//header
2093 	0x000005f3,//input gain
2094 	0x00d816d6, 0xff385383, 0x004fe566,
2095 	0x003c548d, 0xff38c23d, 0x005d0b1c,
2096 	0xfff02f7d, 0xff31e983, 0x0072d65d,
2097 	0x00000002,//output gain
2098 	0x00179204,//farrow
2099 	0x000aaaab,
2100 	0xffaaaaab,
2101 	0xfffaaaab,
2102 	0x00555555,
2103 	0xff600000,
2104 	0xfff55555,
2105 	0x00155555,
2106 	0x00055555,
2107 	0xffeaaaab,
2108 	0x00200000,
2109 	0x00005102,//header
2110 	0x0001d727,//input gain
2111 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2112 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2113 	0x00d13397, 0xfff232f8, 0x00683337,
2114 	0x00000001//output gain
2115 };
2116 
2117 static u32 coef_88to44[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2118 	0x00005102,//header
2119 	0x0001d727,//input gain
2120 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2121 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2122 	0x00d13397, 0xfff232f8, 0x00683337,
2123 	0x00000001//output gain
2124 };
2125 
2126 static u32 coef_88to48[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2127 	0x000c6102,//header
2128 	0x00001685,//input gain
2129 	0x00f53ae9, 0xff52f196, 0x003e3e08,
2130 	0x00b9f857, 0xff5d8985, 0x0050070a,
2131 	0x008c3e86, 0xff6053f0, 0x006d98ef,
2132 	0x00000002,//output gain
2133 	0x00175204,//farrow
2134 	0x000aaaab,
2135 	0xffaaaaab,
2136 	0xfffaaaab,
2137 	0x00555555,
2138 	0xff600000,
2139 	0xfff55555,
2140 	0x00155555,
2141 	0x00055555,
2142 	0xffeaaaab,
2143 	0x00200000,
2144 	0x00005102,//header
2145 	0x0001d727,//input gain
2146 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2147 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2148 	0x00d13397, 0xfff232f8, 0x00683337,
2149 	0x00000001//output gain
2150 };
2151 
2152 static u32 coef_88to96[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2153 	0x000c6102,//header
2154 	0x000013d9,//input gain
2155 	0x00ebd477, 0xff4ce383, 0x0042049d,
2156 	0x0089c278, 0xff54414d, 0x00531ded,
2157 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2158 	0x00000002,//output gain
2159 	0x00005204,//farrow
2160 	0x000aaaab,
2161 	0xffaaaaab,
2162 	0xfffaaaab,
2163 	0x00555555,
2164 	0xff600000,
2165 	0xfff55555,
2166 	0x00155555,
2167 	0x00055555,
2168 	0xffeaaaab,
2169 	0x00200000
2170 };
2171 
2172 static u32 coef_88to176[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2173 	0x00006102,//header
2174 	0x000013d9,//input gain
2175 	0x00ebd477, 0xff4ce383, 0x0042049d,
2176 	0x0089c278, 0xff54414d, 0x00531ded,
2177 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2178 	0x00000002//output gain
2179 };
2180 
2181 static u32 coef_88to192[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2182 	0x000c6102,//header
2183 	0x000013d9,//input gain
2184 	0x00ebd477, 0xff4ce383, 0x0042049d,
2185 	0x0089c278, 0xff54414d, 0x00531ded,
2186 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2187 	0x00000002,//output gain
2188 	0x00186102,//header
2189 	0x0000010a,//input gain
2190 	0x00c93dc4, 0xff26f5f6, 0x005d1041,
2191 	0x001002c4, 0xff245b76, 0x00666002,
2192 	0xffc30a45, 0xff1baecd, 0x00765921,
2193 	0x00000002,//output gain
2194 	0x00005204,//farrow
2195 	0x000aaaab,
2196 	0xffaaaaab,
2197 	0xfffaaaab,
2198 	0x00555555,
2199 	0xff600000,
2200 	0xfff55555,
2201 	0x00155555,
2202 	0x00055555,
2203 	0xffeaaaab,
2204 	0x00200000
2205 };
2206 
2207 static u32 coef_96to8[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2208 	0x000c9102,//header
2209 	0x0000007d,//input gain
2210 	0x007d1f20, 0xff1a540e, 0x00678bf9,
2211 	0xff916625, 0xff16b0ff, 0x006e433a,
2212 	0xff5af660, 0xff0eb91f, 0x00797356,
2213 	0x00000001,//output gain
2214 	0x00185102,//header
2215 	0x000013d9,//input gain
2216 	0x00ebd477, 0xff4ce383, 0x0042049d,
2217 	0x0089c278, 0xff54414d, 0x00531ded,
2218 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2219 	0x00000001,//output gain
2220 	0x00005102,//header
2221 	0x0001d727,//input gain
2222 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2223 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2224 	0x00d13397, 0xfff232f8, 0x00683337,
2225 	0x00000001//output gain
2226 };
2227 
2228 static u32 coef_96to11[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2229 	0x000c0102,//header
2230 	0x000000af,//input gain
2231 	0x00c65663, 0xff23d2ce, 0x005f97d6,
2232 	0x00086ad6, 0xff20ec4f, 0x00683201,
2233 	0xffbbbef6, 0xff184447, 0x00770963,
2234 	0x00000001,//output gain
2235 	0x00175204,//farrow
2236 	0x000aaaab,
2237 	0xffaaaaab,
2238 	0xfffaaaab,
2239 	0x00555555,
2240 	0xff600000,
2241 	0xfff55555,
2242 	0x00155555,
2243 	0x00055555,
2244 	0xffeaaaab,
2245 	0x00200000,
2246 	0x00235102,//header
2247 	0x000013d9,//input gain
2248 	0x00ebd477, 0xff4ce383, 0x0042049d,
2249 	0x0089c278, 0xff54414d, 0x00531ded,
2250 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2251 	0x00000001,//output gain
2252 	0x00005102,//header
2253 	0x0001d727,//input gain
2254 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2255 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2256 	0x00d13397, 0xfff232f8, 0x00683337,
2257 	0x00000001//output gain
2258 };
2259 
2260 static u32 coef_96to16[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2261 	0x000c9102,//header
2262 	0x000005d6,//input gain
2263 	0x00c6543e, 0xff342935, 0x0052f116,
2264 	0x000a1d78, 0xff3330c0, 0x005f88a3,
2265 	0xffbee7c0, 0xff2b5ba5, 0x0073eb26,
2266 	0x00000001,//output gain
2267 	0x00005102,//header
2268 	0x0001d727,//input gain
2269 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2270 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2271 	0x00d13397, 0xfff232f8, 0x00683337,
2272 	0x00000001//output gain
2273 };
2274 
2275 static u32 coef_96to22[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2276 	0x000c6102,//header
2277 	0x000000af,//input gain
2278 	0x00c65663, 0xff23d2ce, 0x005f97d6,
2279 	0x00086ad6, 0xff20ec4f, 0x00683201,
2280 	0xffbbbef6, 0xff184447, 0x00770963,
2281 	0x00000002,//output gain
2282 	0x00175204,//farrow
2283 	0x000aaaab,
2284 	0xffaaaaab,
2285 	0xfffaaaab,
2286 	0x00555555,
2287 	0xff600000,
2288 	0xfff55555,
2289 	0x00155555,
2290 	0x00055555,
2291 	0xffeaaaab,
2292 	0x00200000,
2293 	0x00235102,//header
2294 	0x000013d9,//input gain
2295 	0x00ebd477, 0xff4ce383, 0x0042049d,
2296 	0x0089c278, 0xff54414d, 0x00531ded,
2297 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2298 	0x00000001,//output gain
2299 	0x00005102,//header
2300 	0x0001d727,//input gain
2301 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2302 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2303 	0x00d13397, 0xfff232f8, 0x00683337,
2304 	0x00000001//output gain
2305 };
2306 
2307 static u32 coef_96to24[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2308 	0x000c5102,//header
2309 	0x000013d9,//input gain
2310 	0x00ebd477, 0xff4ce383, 0x0042049d,
2311 	0x0089c278, 0xff54414d, 0x00531ded,
2312 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2313 	0x00000001,//output gain
2314 	0x00005102,//header
2315 	0x0001d727,//input gain
2316 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2317 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2318 	0x00d13397, 0xfff232f8, 0x00683337,
2319 	0x00000001//output gain
2320 };
2321 
2322 static u32 coef_96to32[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2323 	0x00009105,//header
2324 	0x00000292,//input gain
2325 	0x00e4320a, 0xff41d2d9, 0x004911ac,
2326 	0x005dd9e3, 0xff4c7d80, 0x0052103e,
2327 	0xfff8ebef, 0xff5b6fab, 0x005f0a0d,
2328 	0xffc4b414, 0xff68582c, 0x006b38e5,
2329 	0xffabb861, 0xff704bec, 0x0074de52,
2330 	0xffa19f4c, 0xff729059, 0x007c7e90,
2331 	0x00000001//output gain
2332 };
2333 
2334 static u32 coef_96to44[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2335 	0x000f6103,//header
2336 	0x000001e0,//input gain
2337 	0x00de44c0, 0xff380b7f, 0x004ffc73,
2338 	0x00494b44, 0xff3d493a, 0x005908bf,
2339 	0xffe9a3c8, 0xff425647, 0x006745f7,
2340 	0xffc42d61, 0xff40a6c7, 0x00776709,
2341 	0x00000002,//output gain
2342 	0x001a5204,//farrow
2343 	0x000aaaab,
2344 	0xffaaaaab,
2345 	0xfffaaaab,
2346 	0x00555555,
2347 	0xff600000,
2348 	0xfff55555,
2349 	0x00155555,
2350 	0x00055555,
2351 	0xffeaaaab,
2352 	0x00200000,
2353 	0x00005102,//header
2354 	0x0001d727,//input gain
2355 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2356 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2357 	0x00d13397, 0xfff232f8, 0x00683337,
2358 	0x00000001//output gain
2359 };
2360 
2361 static u32 coef_96to48[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2362 	0x00005102,//header
2363 	0x0001d727,//input gain
2364 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2365 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2366 	0x00d13397, 0xfff232f8, 0x00683337,
2367 	0x00000001//output gain
2368 };
2369 
2370 static u32 coef_96to88[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2371 	0x000f6103,//header
2372 	0x000001e0,//input gain
2373 	0x00de44c0, 0xff380b7f, 0x004ffc73,
2374 	0x00494b44, 0xff3d493a, 0x005908bf,
2375 	0xffe9a3c8, 0xff425647, 0x006745f7,
2376 	0xffc42d61, 0xff40a6c7, 0x00776709,
2377 	0x00000002,//output gain
2378 	0x001a0204,//farrow
2379 	0x000aaaab,
2380 	0xffaaaaab,
2381 	0xfffaaaab,
2382 	0x00555555,
2383 	0xff600000,
2384 	0xfff55555,
2385 	0x00155555,
2386 	0x00055555,
2387 	0xffeaaaab,
2388 	0x00200000,
2389 	0x00005102,//header
2390 	0x000013d9,//input gain
2391 	0x00ebd477, 0xff4ce383, 0x0042049d,
2392 	0x0089c278, 0xff54414d, 0x00531ded,
2393 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2394 	0x00000001//output gain
2395 };
2396 
2397 static u32 coef_96to176[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2398 	0x000f6103,//header
2399 	0x000001e0,//input gain
2400 	0x00de44c0, 0xff380b7f, 0x004ffc73,
2401 	0x00494b44, 0xff3d493a, 0x005908bf,
2402 	0xffe9a3c8, 0xff425647, 0x006745f7,
2403 	0xffc42d61, 0xff40a6c7, 0x00776709,
2404 	0x00000002,//output gain
2405 	0x001b6102,//header
2406 	0x000000af,//input gain
2407 	0x00c65663, 0xff23d2ce, 0x005f97d6,
2408 	0x00086ad6, 0xff20ec4f, 0x00683201,
2409 	0xffbbbef6, 0xff184447, 0x00770963,
2410 	0x00000002,//output gain
2411 	0x00260204,//farrow
2412 	0x000aaaab,
2413 	0xffaaaaab,
2414 	0xfffaaaab,
2415 	0x00555555,
2416 	0xff600000,
2417 	0xfff55555,
2418 	0x00155555,
2419 	0x00055555,
2420 	0xffeaaaab,
2421 	0x00200000,
2422 	0x00005102,//header
2423 	0x0000010a,//input gain
2424 	0x00c93dc4, 0xff26f5f6, 0x005d1041,
2425 	0x001002c4, 0xff245b76, 0x00666002,
2426 	0xffc30a45, 0xff1baecd, 0x00765921,
2427 	0x00000001//output gain
2428 };
2429 
2430 static u32 coef_96to192[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2431 	0x00006103,//header
2432 	0x000001e0,//input gain
2433 	0x00de44c0, 0xff380b7f, 0x004ffc73,
2434 	0x00494b44, 0xff3d493a, 0x005908bf,
2435 	0xffe9a3c8, 0xff425647, 0x006745f7,
2436 	0xffc42d61, 0xff40a6c7, 0x00776709,
2437 	0x00000002//output gain
2438 };
2439 
2440 static u32 coef_176to16[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2441 	0x000c0102,//header
2442 	0x00000057,//input gain
2443 	0x00a8e717, 0xff1c748d, 0x0065b976,
2444 	0xffcbccab, 0xff190aff, 0x006cc1cf,
2445 	0xff871ce1, 0xff10d878, 0x0078cfc5,
2446 	0x00000001,//output gain
2447 	0x00179204,//farrow
2448 	0x000aaaab,
2449 	0xffaaaaab,
2450 	0xfffaaaab,
2451 	0x00555555,
2452 	0xff600000,
2453 	0xfff55555,
2454 	0x00155555,
2455 	0x00055555,
2456 	0xffeaaaab,
2457 	0x00200000,
2458 	0x00235102,//header
2459 	0x000013d9,//input gain
2460 	0x00ebd477, 0xff4ce383, 0x0042049d,
2461 	0x0089c278, 0xff54414d, 0x00531ded,
2462 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2463 	0x00000001,//output gain
2464 	0x00005102,//header
2465 	0x0001d727,//input gain
2466 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2467 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2468 	0x00d13397, 0xfff232f8, 0x00683337,
2469 	0x00000001//output gain
2470 };
2471 
2472 static u32 coef_176to22[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2473 	0x000c5102,//header
2474 	0x0000010a,//input gain
2475 	0x00c93dc4, 0xff26f5f6, 0x005d1041,
2476 	0x001002c4, 0xff245b76, 0x00666002,
2477 	0xffc30a45, 0xff1baecd, 0x00765921,
2478 	0x00000001,//output gain
2479 	0x00185102,//header
2480 	0x000013d9,//input gain
2481 	0x00ebd477, 0xff4ce383, 0x0042049d,
2482 	0x0089c278, 0xff54414d, 0x00531ded,
2483 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2484 	0x00000001,//output gain
2485 	0x00005102,//header
2486 	0x0001d727,//input gain
2487 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2488 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2489 	0x00d13397, 0xfff232f8, 0x00683337,
2490 	0x00000001//output gain
2491 };
2492 
2493 static u32 coef_176to24[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2494 	0x000c0102,//header
2495 	0x00000138,//input gain
2496 	0x00d5d232, 0xff2a3bf8, 0x005a785c,
2497 	0x0034001b, 0xff283109, 0x006462a6,
2498 	0xffe6746a, 0xff1fb09c, 0x00758a91,
2499 	0x00000001,//output gain
2500 	0x00175204,//farrow
2501 	0x000aaaab,
2502 	0xffaaaaab,
2503 	0xfffaaaab,
2504 	0x00555555,
2505 	0xff600000,
2506 	0xfff55555,
2507 	0x00155555,
2508 	0x00055555,
2509 	0xffeaaaab,
2510 	0x00200000,
2511 	0x00235102,//header
2512 	0x000013d9,//input gain
2513 	0x00ebd477, 0xff4ce383, 0x0042049d,
2514 	0x0089c278, 0xff54414d, 0x00531ded,
2515 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2516 	0x00000001,//output gain
2517 	0x00005102,//header
2518 	0x0001d727,//input gain
2519 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2520 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2521 	0x00d13397, 0xfff232f8, 0x00683337,
2522 	0x00000001//output gain
2523 };
2524 
2525 static u32 coef_176to32[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2526 	0x000c0102,//header
2527 	0x000005f3,//input gain
2528 	0x00d816d6, 0xff385383, 0x004fe566,
2529 	0x003c548d, 0xff38c23d, 0x005d0b1c,
2530 	0xfff02f7d, 0xff31e983, 0x0072d65d,
2531 	0x00000001,//output gain
2532 	0x00179204,//farrow
2533 	0x000aaaab,
2534 	0xffaaaaab,
2535 	0xfffaaaab,
2536 	0x00555555,
2537 	0xff600000,
2538 	0xfff55555,
2539 	0x00155555,
2540 	0x00055555,
2541 	0xffeaaaab,
2542 	0x00200000,
2543 	0x00005102,//header
2544 	0x0001d727,//input gain
2545 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2546 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2547 	0x00d13397, 0xfff232f8, 0x00683337,
2548 	0x00000001//output gain
2549 };
2550 
2551 static u32 coef_176to44[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2552 	0x000c5102,//header
2553 	0x000013d9,//input gain
2554 	0x00ebd477, 0xff4ce383, 0x0042049d,
2555 	0x0089c278, 0xff54414d, 0x00531ded,
2556 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2557 	0x00000001,//output gain
2558 	0x00005102,//header
2559 	0x0001d727,//input gain
2560 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2561 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2562 	0x00d13397, 0xfff232f8, 0x00683337,
2563 	0x00000001//output gain
2564 };
2565 
2566 static u32 coef_176to48[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2567 	0x000c0102,//header
2568 	0x00001685,//input gain
2569 	0x00f53ae9, 0xff52f196, 0x003e3e08,
2570 	0x00b9f857, 0xff5d8985, 0x0050070a,
2571 	0x008c3e86, 0xff6053f0, 0x006d98ef,
2572 	0x00000001,//output gain
2573 	0x00175204,//farrow
2574 	0x000aaaab,
2575 	0xffaaaaab,
2576 	0xfffaaaab,
2577 	0x00555555,
2578 	0xff600000,
2579 	0xfff55555,
2580 	0x00155555,
2581 	0x00055555,
2582 	0xffeaaaab,
2583 	0x00200000,
2584 	0x00005102,//header
2585 	0x0001d727,//input gain
2586 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2587 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2588 	0x00d13397, 0xfff232f8, 0x00683337,
2589 	0x00000001//output gain
2590 };
2591 
2592 static u32 coef_176to88[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2593 	0x00005102,//header
2594 	0x000013d9,//input gain
2595 	0x00ebd477, 0xff4ce383, 0x0042049d,
2596 	0x0089c278, 0xff54414d, 0x00531ded,
2597 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2598 	0x00000001//output gain
2599 };
2600 
2601 static u32 coef_176to96[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2602 	0x000c6102,//header
2603 	0x0000010a,//input gain
2604 	0x00c93dc4, 0xff26f5f6, 0x005d1041,
2605 	0x001002c4, 0xff245b76, 0x00666002,
2606 	0xffc30a45, 0xff1baecd, 0x00765921,
2607 	0x00000002,//output gain
2608 	0x00175204,//farrow
2609 	0x000aaaab,
2610 	0xffaaaaab,
2611 	0xfffaaaab,
2612 	0x00555555,
2613 	0xff600000,
2614 	0xfff55555,
2615 	0x00155555,
2616 	0x00055555,
2617 	0xffeaaaab,
2618 	0x00200000,
2619 	0x00005103,//header
2620 	0x000001e0,//input gain
2621 	0x00de44c0, 0xff380b7f, 0x004ffc73,
2622 	0x00494b44, 0xff3d493a, 0x005908bf,
2623 	0xffe9a3c8, 0xff425647, 0x006745f7,
2624 	0xffc42d61, 0xff40a6c7, 0x00776709,
2625 	0x00000001//output gain
2626 };
2627 
2628 static u32 coef_176to192[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2629 	0x000c6102,//header
2630 	0x0000010a,//input gain
2631 	0x00c93dc4, 0xff26f5f6, 0x005d1041,
2632 	0x001002c4, 0xff245b76, 0x00666002,
2633 	0xffc30a45, 0xff1baecd, 0x00765921,
2634 	0x00000002,//output gain
2635 	0x00005204,//farrow
2636 	0x000aaaab,
2637 	0xffaaaaab,
2638 	0xfffaaaab,
2639 	0x00555555,
2640 	0xff600000,
2641 	0xfff55555,
2642 	0x00155555,
2643 	0x00055555,
2644 	0xffeaaaab,
2645 	0x00200000
2646 };
2647 
2648 static u32 coef_192to16[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2649 	0x000c9102,//header
2650 	0x0000007d,//input gain
2651 	0x007d1f20, 0xff1a540e, 0x00678bf9,
2652 	0xff916625, 0xff16b0ff, 0x006e433a,
2653 	0xff5af660, 0xff0eb91f, 0x00797356,
2654 	0x00000001,//output gain
2655 	0x00185102,//header
2656 	0x000013d9,//input gain
2657 	0x00ebd477, 0xff4ce383, 0x0042049d,
2658 	0x0089c278, 0xff54414d, 0x00531ded,
2659 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2660 	0x00000001,//output gain
2661 	0x00005102,//header
2662 	0x0001d727,//input gain
2663 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2664 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2665 	0x00d13397, 0xfff232f8, 0x00683337,
2666 	0x00000001//output gain
2667 };
2668 
2669 static u32 coef_192to22[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2670 	0x000c0102,//header
2671 	0x000000af,//input gain
2672 	0x00c65663, 0xff23d2ce, 0x005f97d6,
2673 	0x00086ad6, 0xff20ec4f, 0x00683201,
2674 	0xffbbbef6, 0xff184447, 0x00770963,
2675 	0x00000001,//output gain
2676 	0x00175204,//farrow
2677 	0x000aaaab,
2678 	0xffaaaaab,
2679 	0xfffaaaab,
2680 	0x00555555,
2681 	0xff600000,
2682 	0xfff55555,
2683 	0x00155555,
2684 	0x00055555,
2685 	0xffeaaaab,
2686 	0x00200000,
2687 	0x00235102,//header
2688 	0x000013d9,//input gain
2689 	0x00ebd477, 0xff4ce383, 0x0042049d,
2690 	0x0089c278, 0xff54414d, 0x00531ded,
2691 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2692 	0x00000001,//output gain
2693 	0x00005102,//header
2694 	0x0001d727,//input gain
2695 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2696 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2697 	0x00d13397, 0xfff232f8, 0x00683337,
2698 	0x00000001//output gain
2699 };
2700 
2701 static u32 coef_192to24[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2702 	0x000c5102,//header
2703 	0x0000010a,//input gain
2704 	0x00c93dc4, 0xff26f5f6, 0x005d1041,
2705 	0x001002c4, 0xff245b76, 0x00666002,
2706 	0xffc30a45, 0xff1baecd, 0x00765921,
2707 	0x00000001,//output gain
2708 	0x00185102,//header
2709 	0x000013d9,//input gain
2710 	0x00ebd477, 0xff4ce383, 0x0042049d,
2711 	0x0089c278, 0xff54414d, 0x00531ded,
2712 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2713 	0x00000001,//output gain
2714 	0x00005102,//header
2715 	0x0001d727,//input gain
2716 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2717 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2718 	0x00d13397, 0xfff232f8, 0x00683337,
2719 	0x00000001//output gain
2720 };
2721 
2722 static u32 coef_192to32[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2723 	0x000c9102,//header
2724 	0x000005d6,//input gain
2725 	0x00c6543e, 0xff342935, 0x0052f116,
2726 	0x000a1d78, 0xff3330c0, 0x005f88a3,
2727 	0xffbee7c0, 0xff2b5ba5, 0x0073eb26,
2728 	0x00000001,//output gain
2729 	0x00005102,//header
2730 	0x0001d727,//input gain
2731 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2732 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2733 	0x00d13397, 0xfff232f8, 0x00683337,
2734 	0x00000001//output gain
2735 };
2736 
2737 static u32 coef_192to44[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2738 	0x000c6102,//header
2739 	0x000000af,//input gain
2740 	0x00c65663, 0xff23d2ce, 0x005f97d6,
2741 	0x00086ad6, 0xff20ec4f, 0x00683201,
2742 	0xffbbbef6, 0xff184447, 0x00770963,
2743 	0x00000002,//output gain
2744 	0x00175204,//farrow
2745 	0x000aaaab,
2746 	0xffaaaaab,
2747 	0xfffaaaab,
2748 	0x00555555,
2749 	0xff600000,
2750 	0xfff55555,
2751 	0x00155555,
2752 	0x00055555,
2753 	0xffeaaaab,
2754 	0x00200000,
2755 	0x00235102,//header
2756 	0x000013d9,//input gain
2757 	0x00ebd477, 0xff4ce383, 0x0042049d,
2758 	0x0089c278, 0xff54414d, 0x00531ded,
2759 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2760 	0x00000001,//output gain
2761 	0x00005102,//header
2762 	0x0001d727,//input gain
2763 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2764 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2765 	0x00d13397, 0xfff232f8, 0x00683337,
2766 	0x00000001//output gain
2767 };
2768 
2769 static u32 coef_192to48[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2770 	0x000c5102,//header
2771 	0x000013d9,//input gain
2772 	0x00ebd477, 0xff4ce383, 0x0042049d,
2773 	0x0089c278, 0xff54414d, 0x00531ded,
2774 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2775 	0x00000001,//output gain
2776 	0x00005102,//header
2777 	0x0001d727,//input gain
2778 	0x00fc2fc7, 0xff9bb27b, 0x001c564c,
2779 	0x00e55557, 0xffcadd5b, 0x003d80ba,
2780 	0x00d13397, 0xfff232f8, 0x00683337,
2781 	0x00000001//output gain
2782 };
2783 
2784 static u32 coef_192to88[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2785 	0x000c6102,//header
2786 	0x000000af,//input gain
2787 	0x00c65663, 0xff23d2ce, 0x005f97d6,
2788 	0x00086ad6, 0xff20ec4f, 0x00683201,
2789 	0xffbbbef6, 0xff184447, 0x00770963,
2790 	0x00000002,//output gain
2791 	0x00175204,//farrow
2792 	0x000aaaab,
2793 	0xffaaaaab,
2794 	0xfffaaaab,
2795 	0x00555555,
2796 	0xff600000,
2797 	0xfff55555,
2798 	0x00155555,
2799 	0x00055555,
2800 	0xffeaaaab,
2801 	0x00200000,
2802 	0x00005102,//header
2803 	0x000013d9,//input gain
2804 	0x00ebd477, 0xff4ce383, 0x0042049d,
2805 	0x0089c278, 0xff54414d, 0x00531ded,
2806 	0x004a5e07, 0xff53cf41, 0x006efbdc,
2807 	0x00000001//output gain
2808 };
2809 
2810 static u32 coef_192to96[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2811 	0x00005103,//header
2812 	0x000001e0,//input gain
2813 	0x00de44c0, 0xff380b7f, 0x004ffc73,
2814 	0x00494b44, 0xff3d493a, 0x005908bf,
2815 	0xffe9a3c8, 0xff425647, 0x006745f7,
2816 	0xffc42d61, 0xff40a6c7, 0x00776709,
2817 	0x00000001//output gain
2818 };
2819 
2820 static u32 coef_192to176[TEGRA210_SFC_COEF_RAM_DEPTH] = {
2821 	0x000c6102,//header
2822 	0x000000af,//input gain
2823 	0x00c65663, 0xff23d2ce, 0x005f97d6,
2824 	0x00086ad6, 0xff20ec4f, 0x00683201,
2825 	0xffbbbef6, 0xff184447, 0x00770963,
2826 	0x00000002,//output gain
2827 	0x00170204,//farrow
2828 	0x000aaaab,
2829 	0xffaaaaab,
2830 	0xfffaaaab,
2831 	0x00555555,
2832 	0xff600000,
2833 	0xfff55555,
2834 	0x00155555,
2835 	0x00055555,
2836 	0xffeaaaab,
2837 	0x00200000,
2838 	0x00005102,//header
2839 	0x0000010a,//input gain
2840 	0x00c93dc4, 0xff26f5f6, 0x005d1041,
2841 	0x001002c4, 0xff245b76, 0x00666002,
2842 	0xffc30a45, 0xff1baecd, 0x00765921,
2843 	0x00000001//output gain
2844 };
2845 
2846 /*
2847  * Coefficient table for various sample rate conversions. The sample
2848  * rates available are as per tegra210_sfc_rates[].
2849  */
2850 static s32 *coef_addr_table[TEGRA210_SFC_NUM_RATES][TEGRA210_SFC_NUM_RATES] = {
2851 	/* Convertions from 8 kHz */
2852 	{
2853 		BYPASS_CONV,
2854 		coef_8to11,
2855 		coef_8to16,
2856 		coef_8to22,
2857 		coef_8to24,
2858 		coef_8to32,
2859 		coef_8to44,
2860 		coef_8to48,
2861 		UNSUPP_CONV,
2862 		coef_8to88,
2863 		coef_8to96,
2864 		UNSUPP_CONV,
2865 		UNSUPP_CONV,
2866 	},
2867 	/* Convertions from 11.025 kHz */
2868 	{
2869 		coef_11to8,
2870 		BYPASS_CONV,
2871 		coef_11to16,
2872 		coef_11to22,
2873 		coef_11to24,
2874 		coef_11to32,
2875 		coef_11to44,
2876 		coef_11to48,
2877 		UNSUPP_CONV,
2878 		coef_11to88,
2879 		coef_11to96,
2880 		UNSUPP_CONV,
2881 		UNSUPP_CONV,
2882 	},
2883 	/* Convertions from 16 kHz */
2884 	{
2885 		coef_16to8,
2886 		coef_16to11,
2887 		BYPASS_CONV,
2888 		coef_16to22,
2889 		coef_16to24,
2890 		coef_16to32,
2891 		coef_16to44,
2892 		coef_16to48,
2893 		UNSUPP_CONV,
2894 		coef_16to88,
2895 		coef_16to96,
2896 		coef_16to176,
2897 		coef_16to192,
2898 	},
2899 	/* Convertions from 22.05 kHz */
2900 	{
2901 		coef_22to8,
2902 		coef_22to11,
2903 		coef_22to16,
2904 		BYPASS_CONV,
2905 		coef_22to24,
2906 		coef_22to32,
2907 		coef_22to44,
2908 		coef_22to48,
2909 		UNSUPP_CONV,
2910 		coef_22to88,
2911 		coef_22to96,
2912 		coef_22to176,
2913 		coef_22to192,
2914 	},
2915 	/* Convertions from 24 kHz */
2916 	{
2917 		coef_24to8,
2918 		coef_24to11,
2919 		coef_24to16,
2920 		coef_24to22,
2921 		BYPASS_CONV,
2922 		coef_24to32,
2923 		coef_24to44,
2924 		coef_24to48,
2925 		UNSUPP_CONV,
2926 		coef_24to88,
2927 		coef_24to96,
2928 		coef_24to176,
2929 		coef_24to192,
2930 	},
2931 	/* Convertions from 32 kHz */
2932 	{
2933 		coef_32to8,
2934 		coef_32to11,
2935 		coef_32to16,
2936 		coef_32to22,
2937 		coef_32to24,
2938 		BYPASS_CONV,
2939 		coef_32to44,
2940 		coef_32to48,
2941 		UNSUPP_CONV,
2942 		coef_32to88,
2943 		coef_32to96,
2944 		coef_32to176,
2945 		coef_32to192,
2946 	},
2947 	/* Convertions from 44.1 kHz */
2948 	{
2949 		coef_44to8,
2950 		coef_44to11,
2951 		coef_44to16,
2952 		coef_44to22,
2953 		coef_44to24,
2954 		coef_44to32,
2955 		BYPASS_CONV,
2956 		coef_44to48,
2957 		UNSUPP_CONV,
2958 		coef_44to88,
2959 		coef_44to96,
2960 		coef_44to176,
2961 		coef_44to192,
2962 	},
2963 	/* Convertions from 48 kHz */
2964 	{
2965 		coef_48to8,
2966 		coef_48to11,
2967 		coef_48to16,
2968 		coef_48to22,
2969 		coef_48to24,
2970 		coef_48to32,
2971 		coef_48to44,
2972 		BYPASS_CONV,
2973 		UNSUPP_CONV,
2974 		coef_48to88,
2975 		coef_48to96,
2976 		coef_48to176,
2977 		coef_48to192,
2978 	},
2979 	/* Convertions from 64 kHz */
2980 	{
2981 		UNSUPP_CONV,
2982 		UNSUPP_CONV,
2983 		UNSUPP_CONV,
2984 		UNSUPP_CONV,
2985 		UNSUPP_CONV,
2986 		UNSUPP_CONV,
2987 		UNSUPP_CONV,
2988 		UNSUPP_CONV,
2989 		UNSUPP_CONV,
2990 		UNSUPP_CONV,
2991 		UNSUPP_CONV,
2992 		UNSUPP_CONV,
2993 		UNSUPP_CONV,
2994 	},
2995 	/* Convertions from 88.2 kHz */
2996 	{
2997 		coef_88to8,
2998 		coef_88to11,
2999 		coef_88to16,
3000 		coef_88to22,
3001 		coef_88to24,
3002 		coef_88to32,
3003 		coef_88to44,
3004 		coef_88to48,
3005 		UNSUPP_CONV,
3006 		BYPASS_CONV,
3007 		coef_88to96,
3008 		coef_88to176,
3009 		coef_88to192,
3010 	},
3011 	/* Convertions from 96 kHz */
3012 	{	coef_96to8,
3013 		coef_96to11,
3014 		coef_96to16,
3015 		coef_96to22,
3016 		coef_96to24,
3017 		coef_96to32,
3018 		coef_96to44,
3019 		coef_96to48,
3020 		UNSUPP_CONV,
3021 		coef_96to88,
3022 		BYPASS_CONV,
3023 		coef_96to176,
3024 		coef_96to192,
3025 	},
3026 	/* Convertions from 176.4 kHz */
3027 	{
3028 		UNSUPP_CONV,
3029 		UNSUPP_CONV,
3030 		coef_176to16,
3031 		coef_176to22,
3032 		coef_176to24,
3033 		coef_176to32,
3034 		coef_176to44,
3035 		coef_176to48,
3036 		UNSUPP_CONV,
3037 		coef_176to88,
3038 		coef_176to96,
3039 		BYPASS_CONV,
3040 		coef_176to192,
3041 	},
3042 	/* Convertions from 192 kHz */
3043 	{
3044 		UNSUPP_CONV,
3045 		UNSUPP_CONV,
3046 		coef_192to16,
3047 		coef_192to22,
3048 		coef_192to24,
3049 		coef_192to32,
3050 		coef_192to44,
3051 		coef_192to48,
3052 		UNSUPP_CONV,
3053 		coef_192to88,
3054 		coef_192to96,
3055 		coef_192to176,
3056 		BYPASS_CONV,
3057 	},
3058 };
3059 
3060 static int __maybe_unused tegra210_sfc_runtime_suspend(struct device *dev)
3061 {
3062 	struct tegra210_sfc *sfc = dev_get_drvdata(dev);
3063 
3064 	regcache_cache_only(sfc->regmap, true);
3065 	regcache_mark_dirty(sfc->regmap);
3066 
3067 	return 0;
3068 }
3069 
3070 static int __maybe_unused tegra210_sfc_runtime_resume(struct device *dev)
3071 {
3072 	struct tegra210_sfc *sfc = dev_get_drvdata(dev);
3073 
3074 	regcache_cache_only(sfc->regmap, false);
3075 	regcache_sync(sfc->regmap);
3076 
3077 	return 0;
3078 }
3079 
3080 static inline void tegra210_sfc_write_ram(struct regmap *regmap,
3081 					  s32 *data)
3082 {
3083 	int i;
3084 
3085 	regmap_write(regmap, TEGRA210_SFC_CFG_RAM_CTRL,
3086 		     TEGRA210_SFC_RAM_CTRL_SEQ_ACCESS_EN |
3087 		     TEGRA210_SFC_RAM_CTRL_ADDR_INIT_EN |
3088 		     TEGRA210_SFC_RAM_CTRL_RW_WRITE);
3089 
3090 	for (i = 0; i < TEGRA210_SFC_COEF_RAM_DEPTH; i++)
3091 		regmap_write(regmap, TEGRA210_SFC_CFG_RAM_DATA, data[i]);
3092 }
3093 
3094 static int tegra210_sfc_write_coeff_ram(struct snd_soc_component *cmpnt)
3095 {
3096 	struct tegra210_sfc *sfc = dev_get_drvdata(cmpnt->dev);
3097 	s32 *coeff_ram;
3098 
3099 	/* Bypass */
3100 	if (sfc->srate_in == sfc->srate_out)
3101 		return 0;
3102 
3103 	coeff_ram = coef_addr_table[sfc->srate_in][sfc->srate_out];
3104 	if (IS_ERR_OR_NULL(coeff_ram)) {
3105 		dev_err(cmpnt->dev,
3106 			"Conversion from %d to %d Hz is not supported\n",
3107 			sfc->srate_in, sfc->srate_out);
3108 
3109 		return PTR_ERR_OR_ZERO(coeff_ram);
3110 	}
3111 
3112 	tegra210_sfc_write_ram(sfc->regmap, coeff_ram);
3113 
3114 	regmap_update_bits(sfc->regmap,
3115 			   TEGRA210_SFC_COEF_RAM,
3116 			   TEGRA210_SFC_COEF_RAM_EN,
3117 			   TEGRA210_SFC_COEF_RAM_EN);
3118 
3119 	return 0;
3120 }
3121 
3122 static int tegra210_sfc_set_audio_cif(struct tegra210_sfc *sfc,
3123 				      struct snd_pcm_hw_params *params,
3124 				      unsigned int reg)
3125 {
3126 	unsigned int channels, audio_bits, path;
3127 	struct tegra_cif_conf cif_conf;
3128 
3129 	memset(&cif_conf, 0, sizeof(struct tegra_cif_conf));
3130 
3131 	channels = params_channels(params);
3132 
3133 	switch (params_format(params)) {
3134 	case SNDRV_PCM_FORMAT_S16_LE:
3135 		audio_bits = TEGRA_ACIF_BITS_16;
3136 		break;
3137 	case SNDRV_PCM_FORMAT_S32_LE:
3138 		audio_bits = TEGRA_ACIF_BITS_32;
3139 		break;
3140 	default:
3141 		return -EOPNOTSUPP;
3142 	}
3143 
3144 	cif_conf.audio_ch = channels;
3145 	cif_conf.client_ch = channels;
3146 	cif_conf.audio_bits = audio_bits;
3147 	cif_conf.client_bits = TEGRA_ACIF_BITS_32;
3148 
3149 	if (reg == TEGRA210_SFC_RX_CIF_CTRL)
3150 		path = SFC_RX_PATH;
3151 	else
3152 		path = SFC_TX_PATH;
3153 
3154 	cif_conf.stereo_conv = sfc->stereo_to_mono[path];
3155 	cif_conf.mono_conv = sfc->mono_to_stereo[path];
3156 
3157 	tegra_set_cif(sfc->regmap, reg, &cif_conf);
3158 
3159 	return 0;
3160 }
3161 
3162 static int tegra210_sfc_soft_reset(struct tegra210_sfc *sfc)
3163 {
3164 	u32 val;
3165 
3166 	/*
3167 	 * Soft Reset: Below performs module soft reset which clears
3168 	 * all FSM logic, flushes flow control of FIFO and resets the
3169 	 * state register. It also brings module back to disabled
3170 	 * state (without flushing the data in the pipe).
3171 	 */
3172 	regmap_update_bits(sfc->regmap, TEGRA210_SFC_SOFT_RESET,
3173 			   TEGRA210_SFC_SOFT_RESET_EN, 1);
3174 
3175 	return regmap_read_poll_timeout(sfc->regmap,
3176 					TEGRA210_SFC_SOFT_RESET,
3177 					val,
3178 					!(val & TEGRA210_SFC_SOFT_RESET_EN),
3179 					10, 10000);
3180 }
3181 
3182 static int tegra210_sfc_rate_to_idx(struct device *dev, int rate,
3183 				    int *rate_idx)
3184 {
3185 	int i;
3186 
3187 	for (i = 0; i < ARRAY_SIZE(tegra210_sfc_rates); i++) {
3188 		if (rate == tegra210_sfc_rates[i]) {
3189 			*rate_idx = i;
3190 
3191 			return 0;
3192 		}
3193 	}
3194 
3195 	dev_err(dev, "Sample rate %d Hz is not supported\n", rate);
3196 
3197 	return -EOPNOTSUPP;
3198 }
3199 
3200 static int tegra210_sfc_startup(struct snd_pcm_substream *substream,
3201 				struct snd_soc_dai *dai)
3202 {
3203 	struct tegra210_sfc *sfc = snd_soc_dai_get_drvdata(dai);
3204 	int err;
3205 
3206 	regmap_update_bits(sfc->regmap, TEGRA210_SFC_COEF_RAM,
3207 			   TEGRA210_SFC_COEF_RAM_EN, 0);
3208 
3209 	err = tegra210_sfc_soft_reset(sfc);
3210 	if (err < 0) {
3211 		dev_err(dai->dev, "Failed to reset SFC in %s, err = %d\n",
3212 			__func__, err);
3213 
3214 		return err;
3215 	}
3216 
3217 	return 0;
3218 }
3219 
3220 static int tegra210_sfc_in_hw_params(struct snd_pcm_substream *substream,
3221 				     struct snd_pcm_hw_params *params,
3222 				     struct snd_soc_dai *dai)
3223 {
3224 	struct tegra210_sfc *sfc = snd_soc_dai_get_drvdata(dai);
3225 	struct device *dev = dai->dev;
3226 	int err;
3227 
3228 	err = tegra210_sfc_rate_to_idx(dev, params_rate(params),
3229 				       &sfc->srate_in);
3230 	if (err < 0)
3231 		return err;
3232 
3233 	err = tegra210_sfc_set_audio_cif(sfc, params, TEGRA210_SFC_RX_CIF_CTRL);
3234 	if (err < 0) {
3235 		dev_err(dev, "Can't set SFC RX CIF: %d\n", err);
3236 		return err;
3237 	}
3238 
3239 	regmap_write(sfc->regmap, TEGRA210_SFC_RX_FREQ, sfc->srate_in);
3240 
3241 	return err;
3242 }
3243 
3244 static int tegra210_sfc_out_hw_params(struct snd_pcm_substream *substream,
3245 				      struct snd_pcm_hw_params *params,
3246 				      struct snd_soc_dai *dai)
3247 {
3248 	struct tegra210_sfc *sfc = snd_soc_dai_get_drvdata(dai);
3249 	struct device *dev = dai->dev;
3250 	int err;
3251 
3252 	err = tegra210_sfc_rate_to_idx(dev, params_rate(params),
3253 				       &sfc->srate_out);
3254 	if (err < 0)
3255 		return err;
3256 
3257 	err = tegra210_sfc_set_audio_cif(sfc, params, TEGRA210_SFC_TX_CIF_CTRL);
3258 	if (err < 0) {
3259 		dev_err(dev, "Can't set SFC TX CIF: %d\n", err);
3260 		return err;
3261 	}
3262 
3263 	regmap_write(sfc->regmap, TEGRA210_SFC_TX_FREQ, sfc->srate_out);
3264 
3265 	return 0;
3266 }
3267 
3268 static int tegra210_sfc_init(struct snd_soc_dapm_widget *w,
3269 			     struct snd_kcontrol *kcontrol, int event)
3270 {
3271 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
3272 
3273 	return tegra210_sfc_write_coeff_ram(cmpnt);
3274 }
3275 
3276 static int tegra210_sfc_iget_stereo_to_mono(struct snd_kcontrol *kcontrol,
3277 				    struct snd_ctl_elem_value *ucontrol)
3278 {
3279 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
3280 	struct tegra210_sfc *sfc = snd_soc_component_get_drvdata(cmpnt);
3281 
3282 	ucontrol->value.enumerated.item[0] = sfc->stereo_to_mono[SFC_RX_PATH];
3283 
3284 	return 0;
3285 }
3286 
3287 static int tegra210_sfc_iput_stereo_to_mono(struct snd_kcontrol *kcontrol,
3288 				    struct snd_ctl_elem_value *ucontrol)
3289 {
3290 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
3291 	struct tegra210_sfc *sfc = snd_soc_component_get_drvdata(cmpnt);
3292 	unsigned int value = ucontrol->value.enumerated.item[0];
3293 
3294 	if (value == sfc->stereo_to_mono[SFC_RX_PATH])
3295 		return 0;
3296 
3297 	sfc->stereo_to_mono[SFC_RX_PATH] = value;
3298 
3299 	return 1;
3300 }
3301 
3302 static int tegra210_sfc_iget_mono_to_stereo(struct snd_kcontrol *kcontrol,
3303 				    struct snd_ctl_elem_value *ucontrol)
3304 {
3305 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
3306 	struct tegra210_sfc *sfc = snd_soc_component_get_drvdata(cmpnt);
3307 
3308 	ucontrol->value.enumerated.item[0] = sfc->mono_to_stereo[SFC_RX_PATH];
3309 
3310 	return 0;
3311 }
3312 
3313 static int tegra210_sfc_iput_mono_to_stereo(struct snd_kcontrol *kcontrol,
3314 				    struct snd_ctl_elem_value *ucontrol)
3315 {
3316 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
3317 	struct tegra210_sfc *sfc = snd_soc_component_get_drvdata(cmpnt);
3318 	unsigned int value = ucontrol->value.enumerated.item[0];
3319 
3320 	if (value == sfc->mono_to_stereo[SFC_RX_PATH])
3321 		return 0;
3322 
3323 	sfc->mono_to_stereo[SFC_RX_PATH] = value;
3324 
3325 	return 1;
3326 }
3327 
3328 static int tegra210_sfc_oget_stereo_to_mono(struct snd_kcontrol *kcontrol,
3329 				    struct snd_ctl_elem_value *ucontrol)
3330 {
3331 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
3332 	struct tegra210_sfc *sfc = snd_soc_component_get_drvdata(cmpnt);
3333 
3334 	ucontrol->value.enumerated.item[0] = sfc->stereo_to_mono[SFC_TX_PATH];
3335 
3336 	return 0;
3337 }
3338 
3339 static int tegra210_sfc_oput_stereo_to_mono(struct snd_kcontrol *kcontrol,
3340 				    struct snd_ctl_elem_value *ucontrol)
3341 {
3342 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
3343 	struct tegra210_sfc *sfc = snd_soc_component_get_drvdata(cmpnt);
3344 	unsigned int value = ucontrol->value.enumerated.item[0];
3345 
3346 	if (value == sfc->stereo_to_mono[SFC_TX_PATH])
3347 		return 0;
3348 
3349 	sfc->stereo_to_mono[SFC_TX_PATH] = value;
3350 
3351 	return 1;
3352 }
3353 
3354 static int tegra210_sfc_oget_mono_to_stereo(struct snd_kcontrol *kcontrol,
3355 				    struct snd_ctl_elem_value *ucontrol)
3356 {
3357 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
3358 	struct tegra210_sfc *sfc = snd_soc_component_get_drvdata(cmpnt);
3359 
3360 	ucontrol->value.enumerated.item[0] = sfc->mono_to_stereo[SFC_TX_PATH];
3361 
3362 	return 0;
3363 }
3364 
3365 static int tegra210_sfc_oput_mono_to_stereo(struct snd_kcontrol *kcontrol,
3366 				    struct snd_ctl_elem_value *ucontrol)
3367 {
3368 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
3369 	struct tegra210_sfc *sfc = snd_soc_component_get_drvdata(cmpnt);
3370 	unsigned int value = ucontrol->value.enumerated.item[0];
3371 
3372 	if (value == sfc->mono_to_stereo[SFC_TX_PATH])
3373 		return 0;
3374 
3375 	sfc->mono_to_stereo[SFC_TX_PATH] = value;
3376 
3377 	return 1;
3378 }
3379 
3380 static const struct snd_soc_dai_ops tegra210_sfc_in_dai_ops = {
3381 	.hw_params	= tegra210_sfc_in_hw_params,
3382 	.startup	= tegra210_sfc_startup,
3383 };
3384 
3385 static const struct snd_soc_dai_ops tegra210_sfc_out_dai_ops = {
3386 	.hw_params	= tegra210_sfc_out_hw_params,
3387 };
3388 
3389 static struct snd_soc_dai_driver tegra210_sfc_dais[] = {
3390 	{
3391 		.name = "SFC-RX-CIF",
3392 		.playback = {
3393 			.stream_name = "RX-CIF-Playback",
3394 			.channels_min = 1,
3395 			.channels_max = 2,
3396 			.rates = SNDRV_PCM_RATE_8000_192000,
3397 			.formats = SNDRV_PCM_FMTBIT_S8 |
3398 				SNDRV_PCM_FMTBIT_S16_LE |
3399 				SNDRV_PCM_FMTBIT_S32_LE,
3400 		},
3401 		.capture = {
3402 			.stream_name = "RX-CIF-Capture",
3403 			.channels_min = 1,
3404 			.channels_max = 2,
3405 			.rates = SNDRV_PCM_RATE_8000_192000,
3406 			.formats = SNDRV_PCM_FMTBIT_S8 |
3407 				SNDRV_PCM_FMTBIT_S16_LE |
3408 				SNDRV_PCM_FMTBIT_S32_LE,
3409 		},
3410 		.ops = &tegra210_sfc_in_dai_ops,
3411 	},
3412 	{
3413 		.name = "SFC-TX-CIF",
3414 		.playback = {
3415 			.stream_name = "TX-CIF-Playback",
3416 			.channels_min = 1,
3417 			.channels_max = 2,
3418 			.rates = SNDRV_PCM_RATE_8000_192000,
3419 			.formats = SNDRV_PCM_FMTBIT_S8 |
3420 				SNDRV_PCM_FMTBIT_S16_LE |
3421 				SNDRV_PCM_FMTBIT_S32_LE,
3422 		},
3423 		.capture = {
3424 			.stream_name = "TX-CIF-Capture",
3425 			.channels_min = 1,
3426 			.channels_max = 2,
3427 			.rates = SNDRV_PCM_RATE_8000_192000,
3428 			.formats = SNDRV_PCM_FMTBIT_S8 |
3429 				SNDRV_PCM_FMTBIT_S16_LE |
3430 				SNDRV_PCM_FMTBIT_S32_LE,
3431 		},
3432 		.ops = &tegra210_sfc_out_dai_ops,
3433 	},
3434 };
3435 
3436 static const struct snd_soc_dapm_widget tegra210_sfc_widgets[] = {
3437 	SND_SOC_DAPM_AIF_IN("RX", NULL, 0, SND_SOC_NOPM, 0, 0),
3438 	SND_SOC_DAPM_AIF_OUT_E("TX", NULL, 0, TEGRA210_SFC_ENABLE,
3439 			       TEGRA210_SFC_EN_SHIFT, 0,
3440 			       tegra210_sfc_init, SND_SOC_DAPM_PRE_PMU),
3441 };
3442 
3443 #define RESAMPLE_ROUTE(sname)					\
3444 	{ "RX XBAR-" sname,	NULL,	"XBAR-TX" },		\
3445 	{ "RX-CIF-" sname,	NULL,	"RX XBAR-" sname },	\
3446 	{ "RX",			NULL,	"RX-CIF-" sname },	\
3447 	{ "TX-CIF-" sname,	NULL,	"TX" },			\
3448 	{ "TX XBAR-" sname,	NULL,	"TX-CIF-" sname },	\
3449 	{ "XBAR-RX",		NULL,	"TX XBAR-" sname }
3450 
3451 static const struct snd_soc_dapm_route tegra210_sfc_routes[] = {
3452 	{ "TX", NULL, "RX" },
3453 	RESAMPLE_ROUTE("Playback"),
3454 	RESAMPLE_ROUTE("Capture"),
3455 };
3456 
3457 static const char * const tegra210_sfc_stereo_conv_text[] = {
3458 	"CH0", "CH1", "AVG",
3459 };
3460 
3461 static const char * const tegra210_sfc_mono_conv_text[] = {
3462 	"Zero", "Copy",
3463 };
3464 
3465 static const struct soc_enum tegra210_sfc_stereo_conv_enum =
3466 	SOC_ENUM_SINGLE(SND_SOC_NOPM, 0,
3467 			ARRAY_SIZE(tegra210_sfc_stereo_conv_text),
3468 			tegra210_sfc_stereo_conv_text);
3469 
3470 static const struct soc_enum tegra210_sfc_mono_conv_enum =
3471 	SOC_ENUM_SINGLE(SND_SOC_NOPM, 0,
3472 			ARRAY_SIZE(tegra210_sfc_mono_conv_text),
3473 			tegra210_sfc_mono_conv_text);
3474 
3475 static const struct snd_kcontrol_new tegra210_sfc_controls[] = {
3476 	SOC_ENUM_EXT("Input Stereo To Mono", tegra210_sfc_stereo_conv_enum,
3477 		     tegra210_sfc_iget_stereo_to_mono,
3478 		     tegra210_sfc_iput_stereo_to_mono),
3479 	SOC_ENUM_EXT("Input Mono To Stereo", tegra210_sfc_mono_conv_enum,
3480 		     tegra210_sfc_iget_mono_to_stereo,
3481 		     tegra210_sfc_iput_mono_to_stereo),
3482 	SOC_ENUM_EXT("Output Stereo To Mono", tegra210_sfc_stereo_conv_enum,
3483 		     tegra210_sfc_oget_stereo_to_mono,
3484 		     tegra210_sfc_oput_stereo_to_mono),
3485 	SOC_ENUM_EXT("Output Mono To Stereo", tegra210_sfc_mono_conv_enum,
3486 		     tegra210_sfc_oget_mono_to_stereo,
3487 		     tegra210_sfc_oput_mono_to_stereo),
3488 };
3489 
3490 static const struct snd_soc_component_driver tegra210_sfc_cmpnt = {
3491 	.dapm_widgets		= tegra210_sfc_widgets,
3492 	.num_dapm_widgets	= ARRAY_SIZE(tegra210_sfc_widgets),
3493 	.dapm_routes		= tegra210_sfc_routes,
3494 	.num_dapm_routes	= ARRAY_SIZE(tegra210_sfc_routes),
3495 	.controls		= tegra210_sfc_controls,
3496 	.num_controls		= ARRAY_SIZE(tegra210_sfc_controls),
3497 };
3498 
3499 static bool tegra210_sfc_wr_reg(struct device *dev, unsigned int reg)
3500 {
3501 	switch (reg) {
3502 	case TEGRA210_SFC_RX_INT_MASK ... TEGRA210_SFC_RX_FREQ:
3503 	case TEGRA210_SFC_TX_INT_MASK ... TEGRA210_SFC_TX_FREQ:
3504 	case TEGRA210_SFC_ENABLE ... TEGRA210_SFC_CG:
3505 	case TEGRA210_SFC_COEF_RAM ... TEGRA210_SFC_CFG_RAM_DATA:
3506 		return true;
3507 	default:
3508 		return false;
3509 	}
3510 }
3511 
3512 static bool tegra210_sfc_rd_reg(struct device *dev, unsigned int reg)
3513 {
3514 	switch (reg) {
3515 	case TEGRA210_SFC_RX_STATUS ... TEGRA210_SFC_RX_FREQ:
3516 	case TEGRA210_SFC_TX_STATUS ... TEGRA210_SFC_TX_FREQ:
3517 	case TEGRA210_SFC_ENABLE ... TEGRA210_SFC_INT_STATUS:
3518 	case TEGRA210_SFC_COEF_RAM ... TEGRA210_SFC_CFG_RAM_DATA:
3519 		return true;
3520 	default:
3521 		return false;
3522 	}
3523 }
3524 
3525 static bool tegra210_sfc_volatile_reg(struct device *dev, unsigned int reg)
3526 {
3527 	switch (reg) {
3528 	case TEGRA210_SFC_RX_STATUS:
3529 	case TEGRA210_SFC_RX_INT_STATUS:
3530 	case TEGRA210_SFC_RX_INT_SET:
3531 
3532 	case TEGRA210_SFC_TX_STATUS:
3533 	case TEGRA210_SFC_TX_INT_STATUS:
3534 	case TEGRA210_SFC_TX_INT_SET:
3535 
3536 	case TEGRA210_SFC_SOFT_RESET:
3537 	case TEGRA210_SFC_STATUS:
3538 	case TEGRA210_SFC_INT_STATUS:
3539 	case TEGRA210_SFC_CFG_RAM_CTRL:
3540 	case TEGRA210_SFC_CFG_RAM_DATA:
3541 		return true;
3542 	default:
3543 		return false;
3544 	}
3545 }
3546 
3547 static bool tegra210_sfc_precious_reg(struct device *dev, unsigned int reg)
3548 {
3549 	switch (reg) {
3550 	case TEGRA210_SFC_CFG_RAM_DATA:
3551 		return true;
3552 	default:
3553 		return false;
3554 	}
3555 }
3556 
3557 static const struct regmap_config tegra210_sfc_regmap_config = {
3558 	.reg_bits		= 32,
3559 	.reg_stride		= 4,
3560 	.val_bits		= 32,
3561 	.max_register		= TEGRA210_SFC_CFG_RAM_DATA,
3562 	.writeable_reg		= tegra210_sfc_wr_reg,
3563 	.readable_reg		= tegra210_sfc_rd_reg,
3564 	.volatile_reg		= tegra210_sfc_volatile_reg,
3565 	.precious_reg		= tegra210_sfc_precious_reg,
3566 	.reg_defaults		= tegra210_sfc_reg_defaults,
3567 	.num_reg_defaults	= ARRAY_SIZE(tegra210_sfc_reg_defaults),
3568 	.cache_type		= REGCACHE_FLAT,
3569 };
3570 
3571 static const struct of_device_id tegra210_sfc_of_match[] = {
3572 	{ .compatible = "nvidia,tegra210-sfc" },
3573 	{},
3574 };
3575 MODULE_DEVICE_TABLE(of, tegra210_sfc_of_match);
3576 
3577 static int tegra210_sfc_platform_probe(struct platform_device *pdev)
3578 {
3579 	struct device *dev = &pdev->dev;
3580 	struct tegra210_sfc *sfc;
3581 	void __iomem *regs;
3582 	int err;
3583 
3584 	sfc = devm_kzalloc(dev, sizeof(*sfc), GFP_KERNEL);
3585 	if (!sfc)
3586 		return -ENOMEM;
3587 
3588 	dev_set_drvdata(dev, sfc);
3589 
3590 	regs = devm_platform_ioremap_resource(pdev, 0);
3591 	if (IS_ERR(regs))
3592 		return PTR_ERR(regs);
3593 
3594 	sfc->regmap = devm_regmap_init_mmio(dev, regs,
3595 					    &tegra210_sfc_regmap_config);
3596 	if (IS_ERR(sfc->regmap)) {
3597 		dev_err(dev, "regmap init failed\n");
3598 		return PTR_ERR(sfc->regmap);
3599 	}
3600 
3601 	regcache_cache_only(sfc->regmap, true);
3602 
3603 	err = devm_snd_soc_register_component(dev, &tegra210_sfc_cmpnt,
3604 					      tegra210_sfc_dais,
3605 					      ARRAY_SIZE(tegra210_sfc_dais));
3606 	if (err) {
3607 		dev_err(dev, "can't register SFC component, err: %d\n", err);
3608 		return err;
3609 	}
3610 
3611 	pm_runtime_enable(&pdev->dev);
3612 
3613 	return 0;
3614 }
3615 
3616 static void tegra210_sfc_platform_remove(struct platform_device *pdev)
3617 {
3618 	pm_runtime_disable(&pdev->dev);
3619 }
3620 
3621 static const struct dev_pm_ops tegra210_sfc_pm_ops = {
3622 	SET_RUNTIME_PM_OPS(tegra210_sfc_runtime_suspend,
3623 			   tegra210_sfc_runtime_resume, NULL)
3624 	SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
3625 				pm_runtime_force_resume)
3626 };
3627 
3628 static struct platform_driver tegra210_sfc_driver = {
3629 	.driver = {
3630 		.name = "tegra210-sfc",
3631 		.of_match_table = tegra210_sfc_of_match,
3632 		.pm = &tegra210_sfc_pm_ops,
3633 	},
3634 	.probe = tegra210_sfc_platform_probe,
3635 	.remove_new = tegra210_sfc_platform_remove,
3636 };
3637 module_platform_driver(tegra210_sfc_driver)
3638 
3639 MODULE_AUTHOR("Arun Shamanna Lakshmi <aruns@nvidia.com>");
3640 MODULE_DESCRIPTION("Tegra210 SFC ASoC driver");
3641 MODULE_LICENSE("GPL v2");
3642