summaryrefslogtreecommitdiff
path: root/sound/soc/fsl/fsl_easrc.h
blob: aeeb8bcdc12a48f6b3266fbc3c92b8b1b64c8948 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Copyright (C) 2019 NXP
 */

#ifndef _FSL_EASRC_H
#define _FSL_EASRC_H

#include <sound/asound.h>
#include <uapi/linux/mxc_asrc.h>
#include <linux/miscdevice.h>
#include <linux/platform_data/dma-imx.h>

/* EASRC Register Map */

/* ASRC Input Write FIFO */
#define REG_EASRC_WRFIFO(ctx)		(0x000 + 4 * (ctx))
/* ASRC Output Read FIFO */
#define REG_EASRC_RDFIFO(ctx)		(0x010 + 4 * (ctx))
/* ASRC Context Control */
#define REG_EASRC_CC(ctx)		(0x020 + 4 * (ctx))
/* ASRC Context Control Extended 1 */
#define REG_EASRC_CCE1(ctx)		(0x030 + 4 * (ctx))
/* ASRC Context Control Extended 2 */
#define REG_EASRC_CCE2(ctx)		(0x040 + 4 * (ctx))
/* ASRC Control Input Access */
#define REG_EASRC_CIA(ctx)		(0x050 + 4 * (ctx))
/* ASRC Datapath Processor Control Slot0 */
#define REG_EASRC_DPCS0R0(ctx)		(0x060 + 4 * (ctx))
#define REG_EASRC_DPCS0R1(ctx)		(0x070 + 4 * (ctx))
#define REG_EASRC_DPCS0R2(ctx)		(0x080 + 4 * (ctx))
#define REG_EASRC_DPCS0R3(ctx)		(0x090 + 4 * (ctx))
/* ASRC Datapath Processor Control Slot1 */
#define REG_EASRC_DPCS1R0(ctx)		(0x0A0 + 4 * (ctx))
#define REG_EASRC_DPCS1R1(ctx)		(0x0B0 + 4 * (ctx))
#define REG_EASRC_DPCS1R2(ctx)		(0x0C0 + 4 * (ctx))
#define REG_EASRC_DPCS1R3(ctx)		(0x0D0 + 4 * (ctx))
/* ASRC Context Output Control */
#define REG_EASRC_COC(ctx)		(0x0E0 + 4 * (ctx))
/* ASRC Control Output Access */
#define REG_EASRC_COA(ctx)		(0x0F0 + 4 * (ctx))
/* ASRC Sample FIFO Status */
#define REG_EASRC_SFS(ctx)		(0x100 + 4 * (ctx))
/* ASRC Resampling Ratio Low */
#define REG_EASRC_RRL(ctx)		(0x110 + 8 * (ctx))
/* ASRC Resampling Ratio High */
#define REG_EASRC_RRH(ctx)		(0x114 + 8 * (ctx))
/* ASRC Resampling Ratio Update Control */
#define REG_EASRC_RUC(ctx)		(0x130 + 4 * (ctx))
/* ASRC Resampling Ratio Update Rate */
#define REG_EASRC_RUR(ctx)		(0x140 + 4 * (ctx))
/* ASRC Resampling Center Tap Coefficient Low */
#define REG_EASRC_RCTCL			(0x150)
/* ASRC Resampling Center Tap Coefficient High */
#define REG_EASRC_RCTCH			(0x154)
/* ASRC Prefilter Coefficient FIFO */
#define REG_EASRC_PCF(ctx)		(0x160 + 4 * (ctx))
/* ASRC Context Resampling Coefficient Memory */
#define REG_EASRC_CRCM			0x170
/* ASRC Context Resampling Coefficient Control*/
#define REG_EASRC_CRCC			0x174
/* ASRC Interrupt Control */
#define REG_EASRC_IRQC			0x178
/* ASRC Interrupt Status Flags */
#define REG_EASRC_IRQF			0x17C
/* ASRC Channel Status 0 */
#define REG_EASRC_CS0(ctx)		(0x180 + 4 * (ctx))
/* ASRC Channel Status 1 */
#define REG_EASRC_CS1(ctx)		(0x190 + 4 * (ctx))
/* ASRC Channel Status 2 */
#define REG_EASRC_CS2(ctx)		(0x1A0 + 4 * (ctx))
/* ASRC Channel Status 3 */
#define REG_EASRC_CS3(ctx)		(0x1B0 + 4 * (ctx))
/* ASRC Channel Status 4 */
#define REG_EASRC_CS4(ctx)		(0x1C0 + 4 * (ctx))
/* ASRC Channel Status 5 */
#define REG_EASRC_CS5(ctx)		(0x1D0 + 4 * (ctx))
/* ASRC Debug Control Register */
#define REG_EASRC_DBGC			0x1E0
/* ASRC Debug Status Register */
#define REG_EASRC_DBGS			0x1E4

#define REG_EASRC_FIFO(x, ctx)		(x == IN ? REG_EASRC_WRFIFO(ctx) \
						: REG_EASRC_RDFIFO(ctx))

/* ASRC Context Control (CC) */
#define EASRC_CC_EN_SHIFT		31
#define EASRC_CC_EN_MASK		BIT(EASRC_CC_EN_SHIFT)
#define EASRC_CC_EN			BIT(EASRC_CC_EN_SHIFT)
#define EASRC_CC_STOP_SHIFT		29
#define EASRC_CC_STOP_MASK		BIT(EASRC_CC_STOP_SHIFT)
#define EASRC_CC_STOP			BIT(EASRC_CC_STOP_SHIFT)
#define EASRC_CC_FWMDE_SHIFT		28
#define EASRC_CC_FWMDE_MASK		BIT(EASRC_CC_FWMDE_SHIFT)
#define EASRC_CC_FWMDE			BIT(EASRC_CC_FWMDE_SHIFT)
#define EASRC_CC_FIFO_WTMK_SHIFT	16
#define EASRC_CC_FIFO_WTMK_WIDTH	7
#define EASRC_CC_FIFO_WTMK_MASK		((BIT(EASRC_CC_FIFO_WTMK_WIDTH) - 1) \
					 << EASRC_CC_FIFO_WTMK_SHIFT)
#define EASRC_CC_FIFO_WTMK(v)		(((v) << EASRC_CC_FIFO_WTMK_SHIFT) \
					 & EASRC_CC_FIFO_WTMK_MASK)
#define EASRC_CC_SAMPLE_POS_SHIFT	11
#define EASRC_CC_SAMPLE_POS_WIDTH	5
#define EASRC_CC_SAMPLE_POS_MASK	((BIT(EASRC_CC_SAMPLE_POS_WIDTH) - 1) \
					 << EASRC_CC_SAMPLE_POS_SHIFT)
#define EASRC_CC_SAMPLE_POS(v)		(((v) << EASRC_CC_SAMPLE_POS_SHIFT) \
					 & EASRC_CC_SAMPLE_POS_MASK)
#define EASRC_CC_ENDIANNESS_SHIFT	10
#define EASRC_CC_ENDIANNESS_MASK	BIT(EASRC_CC_ENDIANNESS_SHIFT)
#define EASRC_CC_ENDIANNESS		BIT(EASRC_CC_ENDIANNESS_SHIFT)
#define EASRC_CC_BPS_SHIFT		8
#define EASRC_CC_BPS_WIDTH		2
#define EASRC_CC_BPS_MASK		((BIT(EASRC_CC_BPS_WIDTH) - 1) \
					 << EASRC_CC_BPS_SHIFT)
#define EASRC_CC_BPS(v)			(((v) << EASRC_CC_BPS_SHIFT) \
					 & EASRC_CC_BPS_MASK)
#define EASRC_CC_FMT_SHIFT		7
#define EASRC_CC_FMT_MASK		BIT(EASRC_CC_FMT_SHIFT)
#define EASRC_CC_FMT			BIT(EASRC_CC_FMT_SHIFT)
#define EASRC_CC_INSIGN_SHIFT		6
#define EASRC_CC_INSIGN_MASK		BIT(EASRC_CC_INSIGN_SHIFT)
#define EASRC_CC_INSIGN			BIT(EASRC_CC_INSIGN_SHIFT)
#define EASRC_CC_CHEN_SHIFT		0
#define EASRC_CC_CHEN_WIDTH		5
#define EASRC_CC_CHEN_MASK		((BIT(EASRC_CC_CHEN_WIDTH) - 1) \
					 << EASRC_CC_CHEN_SHIFT)
#define EASRC_CC_CHEN(v)		(((v) << EASRC_CC_CHEN_SHIFT) \
					 & EASRC_CC_CHEN_MASK)

/* ASRC Context Control Extended 1 (CCE1) */
#define EASRC_CCE1_COEF_WS_SHIFT	25
#define EASRC_CCE1_COEF_WS_MASK		BIT(EASRC_CCE1_COEF_WS_SHIFT)
#define EASRC_CCE1_COEF_WS		BIT(EASRC_CCE1_COEF_WS_SHIFT)
#define EASRC_CCE1_COEF_MEM_RST_SHIFT	24
#define EASRC_CCE1_COEF_MEM_RST_MASK	BIT(EASRC_CCE1_COEF_MEM_RST_SHIFT)
#define EASRC_CCE1_COEF_MEM_RST		BIT(EASRC_CCE1_COEF_MEM_RST_SHIFT)
#define EASRC_CCE1_PF_EXP_SHIFT		16
#define EASRC_CCE1_PF_EXP_WIDTH		8
#define EASRC_CCE1_PF_EXP_MASK		((BIT(EASRC_CCE1_PF_EXP_WIDTH) - 1) \
					 << EASRC_CCE1_PF_EXP_SHIFT)
#define EASRC_CCE1_PF_EXP(v)		(((v) << EASRC_CCE1_PF_EXP_SHIFT) \
					 & EASRC_CCE1_PF_EXP_MASK)
#define EASRC_CCE1_PF_ST1_WBFP_SHIFT	9
#define EASRC_CCE1_PF_ST1_WBFP_MASK	BIT(EASRC_CCE1_PF_ST1_WBFP_SHIFT)
#define EASRC_CCE1_PF_ST1_WBFP		BIT(EASRC_CCE1_PF_ST1_WBFP_SHIFT)
#define EASRC_CCE1_PF_TSEN_SHIFT	8
#define EASRC_CCE1_PF_TSEN_MASK		BIT(EASRC_CCE1_PF_TSEN_SHIFT)
#define EASRC_CCE1_PF_TSEN		BIT(EASRC_CCE1_PF_TSEN_SHIFT)
#define EASRC_CCE1_RS_BYPASS_SHIFT	7
#define EASRC_CCE1_RS_BYPASS_MASK	BIT(EASRC_CCE1_RS_BYPASS_SHIFT)
#define EASRC_CCE1_RS_BYPASS		BIT(EASRC_CCE1_RS_BYPASS_SHIFT)
#define EASRC_CCE1_PF_BYPASS_SHIFT	6
#define EASRC_CCE1_PF_BYPASS_MASK	BIT(EASRC_CCE1_PF_BYPASS_SHIFT)
#define EASRC_CCE1_PF_BYPASS		BIT(EASRC_CCE1_PF_BYPASS_SHIFT)
#define EASRC_CCE1_RS_STOP_SHIFT	5
#define EASRC_CCE1_RS_STOP_MASK		BIT(EASRC_CCE1_RS_STOP_SHIFT)
#define EASRC_CCE1_RS_STOP		BIT(EASRC_CCE1_RS_STOP_SHIFT)
#define EASRC_CCE1_PF_STOP_SHIFT	4
#define EASRC_CCE1_PF_STOP_MASK		BIT(EASRC_CCE1_PF_STOP_SHIFT)
#define EASRC_CCE1_PF_STOP		BIT(EASRC_CCE1_PF_STOP_SHIFT)
#define EASRC_CCE1_RS_INIT_SHIFT	2
#define EASRC_CCE1_RS_INIT_WIDTH	2
#define EASRC_CCE1_RS_INIT_MASK		((BIT(EASRC_CCE1_RS_INIT_WIDTH) - 1) \
					 << EASRC_CCE1_RS_INIT_SHIFT)
#define EASRC_CCE1_RS_INIT(v)		(((v) << EASRC_CCE1_RS_INIT_SHIFT) \
					 & EASRC_CCE1_RS_INIT_MASK)
#define EASRC_CCE1_PF_INIT_SHIFT	0
#define EASRC_CCE1_PF_INIT_WIDTH	2
#define EASRC_CCE1_PF_INIT_MASK		((BIT(EASRC_CCE1_PF_INIT_WIDTH) - 1) \
					 << EASRC_CCE1_PF_INIT_SHIFT)
#define EASRC_CCE1_PF_INIT(v)		(((v) << EASRC_CCE1_PF_INIT_SHIFT) \
					 & EASRC_CCE1_PF_INIT_MASK)

/* ASRC Context Control Extended 2 (CCE2) */
#define EASRC_CCE2_ST2_TAPS_SHIFT	16
#define EASRC_CCE2_ST2_TAPS_WIDTH	9
#define EASRC_CCE2_ST2_TAPS_MASK	((BIT(EASRC_CCE2_ST2_TAPS_WIDTH) - 1) \
					 << EASRC_CCE2_ST2_TAPS_SHIFT)
#define EASRC_CCE2_ST2_TAPS(v)		(((v) << EASRC_CCE2_ST2_TAPS_SHIFT) \
					 & EASRC_CCE2_ST2_TAPS_MASK)
#define EASRC_CCE2_ST1_TAPS_SHIFT	0
#define EASRC_CCE2_ST1_TAPS_WIDTH	9
#define EASRC_CCE2_ST1_TAPS_MASK	((BIT(EASRC_CCE2_ST1_TAPS_WIDTH) - 1) \
					 << EASRC_CCE2_ST1_TAPS_SHIFT)
#define EASRC_CCE2_ST1_TAPS(v)		(((v) << EASRC_CCE2_ST1_TAPS_SHIFT) \
					 & EASRC_CCE2_ST1_TAPS_MASK)

/* ASRC Control Input Access (CIA) */
#define EASRC_CIA_ITER_SHIFT		16
#define EASRC_CIA_ITER_WIDTH		6
#define EASRC_CIA_ITER_MASK		((BIT(EASRC_CIA_ITER_WIDTH) - 1) \
					 << EASRC_CIA_ITER_SHIFT)
#define EASRC_CIA_ITER(v)		(((v) << EASRC_CIA_ITER_SHIFT) \
					 & EASRC_CIA_ITER_MASK)
#define EASRC_CIA_GRLEN_SHIFT		8
#define EASRC_CIA_GRLEN_WIDTH		6
#define EASRC_CIA_GRLEN_MASK		((BIT(EASRC_CIA_GRLEN_WIDTH) - 1) \
					 << EASRC_CIA_GRLEN_SHIFT)
#define EASRC_CIA_GRLEN(v)		(((v) << EASRC_CIA_GRLEN_SHIFT) \
					 & EASRC_CIA_GRLEN_MASK)
#define EASRC_CIA_ACCLEN_SHIFT		0
#define EASRC_CIA_ACCLEN_WIDTH		6
#define EASRC_CIA_ACCLEN_MASK		((BIT(EASRC_CIA_ACCLEN_WIDTH) - 1) \
					 << EASRC_CIA_ACCLEN_SHIFT)
#define EASRC_CIA_ACCLEN(v)		(((v) << EASRC_CIA_ACCLEN_SHIFT) \
					 & EASRC_CIA_ACCLEN_MASK)

/* ASRC Datapath Processor Control Slot0 Register0 (DPCS0R0) */
#define EASRC_DPCS0R0_MAXCH_SHIFT	24
#define EASRC_DPCS0R0_MAXCH_WIDTH	5
#define EASRC_DPCS0R0_MAXCH_MASK	((BIT(EASRC_DPCS0R0_MAXCH_WIDTH) - 1) \
					 << EASRC_DPCS0R0_MAXCH_SHIFT)
#define EASRC_DPCS0R0_MAXCH(v)		(((v) << EASRC_DPCS0R0_MAXCH_SHIFT) \
					 & EASRC_DPCS0R0_MAXCH_MASK)
#define EASRC_DPCS0R0_MINCH_SHIFT	16
#define EASRC_DPCS0R0_MINCH_WIDTH	5
#define EASRC_DPCS0R0_MINCH_MASK	((BIT(EASRC_DPCS0R0_MINCH_WIDTH) - 1) \
					 << EASRC_DPCS0R0_MINCH_SHIFT)
#define EASRC_DPCS0R0_MINCH(v)		(((v) << EASRC_DPCS0R0_MINCH_SHIFT) \
					 & EASRC_DPCS0R0_MINCH_MASK)
#define EASRC_DPCS0R0_NUMCH_SHIFT	8
#define EASRC_DPCS0R0_NUMCH_WIDTH	5
#define EASRC_DPCS0R0_NUMCH_MASK	((BIT(EASRC_DPCS0R0_NUMCH_WIDTH) - 1) \
					 << EASRC_DPCS0R0_NUMCH_SHIFT)
#define EASRC_DPCS0R0_NUMCH(v)		(((v) << EASRC_DPCS0R0_NUMCH_SHIFT) \
					 & EASRC_DPCS0R0_NUMCH_MASK)
#define EASRC_DPCS0R0_CTXNUM_SHIFT	1
#define EASRC_DPCS0R0_CTXNUM_WIDTH	2
#define EASRC_DPCS0R0_CTXNUM_MASK	((BIT(EASRC_DPCS0R0_CTXNUM_WIDTH) - 1) \
					 << EASRC_DPCS0R0_CTXNUM_SHIFT)
#define EASRC_DPCS0R0_CTXNUM(v)		(((v) << EASRC_DPCS0R0_CTXNUM_SHIFT) \
					 & EASRC_DPCS0R0_CTXNUM_MASK)
#define EASRC_DPCS0R0_EN_SHIFT		0
#define EASRC_DPCS0R0_EN_MASK		BIT(EASRC_DPCS0R0_EN_SHIFT)
#define EASRC_DPCS0R0_EN		BIT(EASRC_DPCS0R0_EN_SHIFT)

/* ASRC Datapath Processor Control Slot0 Register1 (DPCS0R1) */
#define EASRC_DPCS0R1_ST1_EXP_SHIFT	0
#define EASRC_DPCS0R1_ST1_EXP_WIDTH	13
#define EASRC_DPCS0R1_ST1_EXP_MASK	((BIT(EASRC_DPCS0R1_ST1_EXP_WIDTH) - 1) \
					 << EASRC_DPCS0R1_ST1_EXP_SHIFT)
#define EASRC_DPCS0R1_ST1_EXP(v)	(((v) << EASRC_DPCS0R1_ST1_EXP_SHIFT) \
					 & EASRC_DPCS0R1_ST1_EXP_MASK)

/* ASRC Datapath Processor Control Slot0 Register2 (DPCS0R2) */
#define EASRC_DPCS0R2_ST1_MA_SHIFT	16
#define EASRC_DPCS0R2_ST1_MA_WIDTH	13
#define EASRC_DPCS0R2_ST1_MA_MASK	((BIT(EASRC_DPCS0R2_ST1_MA_WIDTH) - 1) \
					 << EASRC_DPCS0R2_ST1_MA_SHIFT)
#define EASRC_DPCS0R2_ST1_MA(v)		(((v) << EASRC_DPCS0R2_ST1_MA_SHIFT) \
					 & EASRC_DPCS0R2_ST1_MA_MASK)
#define EASRC_DPCS0R2_ST1_SA_SHIFT	0
#define EASRC_DPCS0R2_ST1_SA_WIDTH	13
#define EASRC_DPCS0R2_ST1_SA_MASK	((BIT(EASRC_DPCS0R2_ST1_SA_WIDTH) - 1) \
					 << EASRC_DPCS0R2_ST1_SA_SHIFT)
#define EASRC_DPCS0R2_ST1_SA(v)		(((v) << EASRC_DPCS0R2_ST1_SA_SHIFT) \
					 & EASRC_DPCS0R2_ST1_SA_MASK)

/* ASRC Datapath Processor Control Slot0 Register3 (DPCS0R3) */
#define EASRC_DPCS0R3_ST2_MA_SHIFT	16
#define EASRC_DPCS0R3_ST2_MA_WIDTH	13
#define EASRC_DPCS0R3_ST2_MA_MASK	((BIT(EASRC_DPCS0R3_ST2_MA_WIDTH) - 1) \
					 << EASRC_DPCS0R3_ST2_MA_SHIFT)
#define EASRC_DPCS0R3_ST2_MA(v)		(((v) << EASRC_DPCS0R3_ST2_MA_SHIFT) \
					 & EASRC_DPCS0R3_ST2_MA_MASK)
#define EASRC_DPCS0R3_ST2_SA_SHIFT	0
#define EASRC_DPCS0R3_ST2_SA_WIDTH	13
#define EASRC_DPCS0R3_ST2_SA_MASK	((BIT(EASRC_DPCS0R3_ST2_SA_WIDTH) - 1) \
					 << EASRC_DPCS0R3_ST2_SA_SHIFT)
#define EASRC_DPCS0R3_ST2_SA(v)		(((v) << EASRC_DPCS0R3_ST2_SA_SHIFT) \
						 & EASRC_DPCS0R3_ST2_SA_MASK)

/* ASRC Context Output Control (COC) */
#define EASRC_COC_FWMDE_SHIFT		28
#define EASRC_COC_FWMDE_MASK		BIT(EASRC_COC_FWMDE_SHIFT)
#define EASRC_COC_FWMDE			BIT(EASRC_COC_FWMDE_SHIFT)
#define EASRC_COC_FIFO_WTMK_SHIFT	16
#define EASRC_COC_FIFO_WTMK_WIDTH	7
#define EASRC_COC_FIFO_WTMK_MASK	((BIT(EASRC_COC_FIFO_WTMK_WIDTH) - 1) \
					 << EASRC_COC_FIFO_WTMK_SHIFT)
#define EASRC_COC_FIFO_WTMK(v)		(((v) << EASRC_COC_FIFO_WTMK_SHIFT) \
					 & EASRC_COC_FIFO_WTMK_MASK)
#define EASRC_COC_SAMPLE_POS_SHIFT	11
#define EASRC_COC_SAMPLE_POS_WIDTH	5
#define EASRC_COC_SAMPLE_POS_MASK	((BIT(EASRC_COC_SAMPLE_POS_WIDTH) - 1) \
					 << EASRC_COC_SAMPLE_POS_SHIFT)
#define EASRC_COC_SAMPLE_POS(v)		(((v) << EASRC_COC_SAMPLE_POS_SHIFT) \
					 & EASRC_COC_SAMPLE_POS_MASK)
#define EASRC_COC_ENDIANNESS_SHIFT	10
#define EASRC_COC_ENDIANNESS_MASK	BIT(EASRC_COC_ENDIANNESS_SHIFT)
#define EASRC_COC_ENDIANNESS		BIT(EASRC_COC_ENDIANNESS_SHIFT)
#define EASRC_COC_BPS_SHIFT		8
#define EASRC_COC_BPS_WIDTH		2
#define EASRC_COC_BPS_MASK		((BIT(EASRC_COC_BPS_WIDTH) - 1) \
					 << EASRC_COC_BPS_SHIFT)
#define EASRC_COC_BPS(v)		(((v) << EASRC_COC_BPS_SHIFT) \
					 & EASRC_COC_BPS_MASK)
#define EASRC_COC_FMT_SHIFT		7
#define EASRC_COC_FMT_MASK		BIT(EASRC_COC_FMT_SHIFT)
#define EASRC_COC_FMT			BIT(EASRC_COC_FMT_SHIFT)
#define EASRC_COC_OUTSIGN_SHIFT		6
#define EASRC_COC_OUTSIGN_MASK		BIT(EASRC_COC_OUTSIGN_SHIFT)
#define EASRC_COC_OUTSIGN_OUT		BIT(EASRC_COC_OUTSIGN_SHIFT)
#define EASRC_COC_IEC_VDATA_SHIFT	2
#define EASRC_COC_IEC_VDATA_MASK	BIT(EASRC_COC_IEC_VDATA_SHIFT)
#define EASRC_COC_IEC_VDATA		BIT(EASRC_COC_IEC_VDATA_SHIFT)
#define EASRC_COC_IEC_EN_SHIFT		1
#define EASRC_COC_IEC_EN_MASK		BIT(EASRC_COC_IEC_EN_SHIFT)
#define EASRC_COC_IEC_EN		BIT(EASRC_COC_IEC_EN_SHIFT)
#define EASRC_COC_DITHER_EN_SHIFT	0
#define EASRC_COC_DITHER_EN_MASK	BIT(EASRC_COC_DITHER_EN_SHIFT)
#define EASRC_COC_DITHER_EN		BIT(EASRC_COC_DITHER_EN_SHIFT)

/* ASRC Control Output Access (COA) */
#define EASRC_COA_ITER_SHIFT		16
#define EASRC_COA_ITER_WIDTH		6
#define EASRC_COA_ITER_MASK		((BIT(EASRC_COA_ITER_WIDTH) - 1) \
					 << EASRC_COA_ITER_SHIFT)
#define EASRC_COA_ITER(v)		(((v) << EASRC_COA_ITER_SHIFT) \
					 & EASRC_COA_ITER_MASK)
#define EASRC_COA_GRLEN_SHIFT		8
#define EASRC_COA_GRLEN_WIDTH		6
#define EASRC_COA_GRLEN_MASK		((BIT(EASRC_COA_GRLEN_WIDTH) - 1) \
					 << EASRC_COA_GRLEN_SHIFT)
#define EASRC_COA_GRLEN(v)		(((v) << EASRC_COA_GRLEN_SHIFT) \
					 & EASRC_COA_GRLEN_MASK)
#define EASRC_COA_ACCLEN_SHIFT		0
#define EASRC_COA_ACCLEN_WIDTH		6
#define EASRC_COA_ACCLEN_MASK		((BIT(EASRC_COA_ACCLEN_WIDTH) - 1) \
					 << EASRC_COA_ACCLEN_SHIFT)
#define EASRC_COA_ACCLEN(v)		(((v) << EASRC_COA_ACCLEN_SHIFT) \
					 & EASRC_COA_ACCLEN_MASK)

/* ASRC Sample FIFO Status (SFS) */
#define EASRC_SFS_IWTMK_SHIFT		23
#define EASRC_SFS_IWTMK_MASK		BIT(EASRC_SFS_IWTMK_SHIFT)
#define EASRC_SFS_IWTMK			BIT(EASRC_SFS_IWTMK_SHIFT)
#define EASRC_SFS_NSGI_SHIFT		16
#define EASRC_SFS_NSGI_WIDTH		7
#define EASRC_SFS_NSGI_MASK		((BIT(EASRC_SFS_NSGI_WIDTH) - 1) \
					 << EASRC_SFS_NSGI_SHIFT)
#define EASRC_SFS_NSGI(v)		(((v) << EASRC_SFS_NSGI_SHIFT) \
					 & EASRC_SFS_NSGI_MASK)
#define EASRC_SFS_OWTMK_SHIFT		7
#define EASRC_SFS_OWTMK_MASK		BIT(EASRC_SFS_OWTMK_SHIFT)
#define EASRC_SFS_OWTMK			BIT(EASRC_SFS_OWTMK_SHIFT)
#define EASRC_SFS_NSGO_SHIFT		0
#define EASRC_SFS_NSGO_WIDTH		7
#define EASRC_SFS_NSGO_MASK		((BIT(EASRC_SFS_NSGO_WIDTH) - 1) \
					 << EASRC_SFS_NSGO_SHIFT)
#define EASRC_SFS_NSGO(v)		(((v) << EASRC_SFS_NSGO_SHIFT) \
					 & EASRC_SFS_NSGO_MASK)

/* ASRC Resampling Ratio Low (RRL) */
#define EASRC_RRL_RS_RL_SHIFT		0
#define EASRC_RRL_RS_RL_WIDTH		32
#define EASRC_RRL_RS_RL_MASK		((BIT(EASRC_RRL_RS_RL_WIDTH) - 1) \
					 << EASRC_RRL_RS_RL_SHIFT)
#define EASRC_RRL_RS_RL(v)		(((v) << EASRC_RRL_RS_RL_SHIFT) \
					 & EASRC_RRL_RS_RL_MASK)

/* ASRC Resampling Ratio High (RRH) */
#define EASRC_RRH_RS_VLD_SHIFT		31
#define EASRC_RRH_RS_VLD_MASK		BIT(EASRC_RRH_RS_VLD_SHIFT)
#define EASRC_RRH_RS_VLD		BIT(EASRC_RRH_RS_VLD_SHIFT)
#define EASRC_RRH_RS_RH_SHIFT		0
#define EASRC_RRH_RS_RH_WIDTH		12
#define EASRC_RRH_RS_RH_MASK		((BIT(EASRC_RRH_RS_RH_WIDTH) - 1) \
					 << EASRC_RRH_RS_RH_SHIFT)
#define EASRC_RRH_RS_RH(v)		(((v) << EASRC_RRH_RS_RH_SHIFT) \
					 & EASRC_RRH_RS_RH_MASK)

/* ASRC Resampling Ratio Update Control (RSUC) */
#define EASRC_RSUC_RS_RM_SHIFT		0
#define EASRC_RSUC_RS_RM_WIDTH		32
#define EASRC_RSUC_RS_RM_MASK		((BIT(EASRC_RSUC_RS_RM_WIDTH) - 1) \
					 << EASRC_RSUC_RS_RM_SHIFT)
#define EASRC_RSUC_RS_RM(v)		(((v) << EASRC_RSUC_RS_RM_SHIFT) \
					 & EASRC_RSUC_RS_RM_MASK)

/* ASRC Resampling Ratio Update Rate (RRUR) */
#define EASRC_RRUR_RRR_SHIFT		0
#define EASRC_RRUR_RRR_WIDTH		31
#define EASRC_RRUR_RRR_MASK		((BIT(EASRC_RRUR_RRR_WIDTH) - 1) \
					 << EASRC_RRUR_RRR_SHIFT)
#define EASRC_RRUR_RRR(v)		(((v) << EASRC_RRUR_RRR_SHIFT) \
					 & EASRC_RRUR_RRR_MASK)

/* ASRC Resampling Center Tap Coefficient Low (RCTCL) */
#define EASRC_RCTCL_RS_CL_SHIFT		0
#define EASRC_RCTCL_RS_CL_WIDTH		32
#define EASRC_RCTCL_RS_CL_MASK		((BIT(EASRC_RCTCL_RS_CL_WIDTH) - 1) \
					 << EASRC_RCTCL_RS_CL_SHIFT)
#define EASRC_RCTCL_RS_CL(v)		(((v) << EASRC_RCTCL_RS_CL_SHIFT) \
					 & EASRC_RCTCL_RS_CL_MASK)

/* ASRC Resampling Center Tap Coefficient High (RCTCH) */
#define EASRC_RCTCH_RS_CH_SHIFT		0
#define EASRC_RCTCH_RS_CH_WIDTH		32
#define EASRC_RCTCH_RS_CH_MASK		((BIT(EASRC_RCTCH_RS_CH_WIDTH) - 1) \
					 << EASRC_RCTCH_RS_CH_SHIFT)
#define EASRC_RCTCH_RS_CH(v)		(((v) << EASRC_RCTCH_RS_CH_SHIFT) \
					 & EASRC_RCTCH_RS_CH_MASK)

/* ASRC Prefilter Coefficient FIFO (PCF) */
#define EASRC_PCF_CD_SHIFT		0
#define EASRC_PCF_CD_WIDTH		32
#define EASRC_PCF_CD_MASK		((BIT(EASRC_PCF_CD_WIDTH) - 1) \
					 << EASRC_PCF_CD_SHIFT)
#define EASRC_PCF_CD(v)			(((v) << EASRC_PCF_CD_SHIFT) \
					 & EASRC_PCF_CD_MASK)

/* ASRC Context Resampling Coefficient Memory (CRCM) */
#define EASRC_CRCM_RS_CWD_SHIFT		0
#define EASRC_CRCM_RS_CWD_WIDTH		32
#define EASRC_CRCM_RS_CWD_MASK		((BIT(EASRC_CRCM_RS_CWD_WIDTH) - 1) \
					 << EASRC_CRCM_RS_CWD_SHIFT)
#define EASRC_CRCM_RS_CWD(v)		(((v) << EASRC_CRCM_RS_CWD_SHIFT) \
					 & EASRC_CRCM_RS_CWD_MASK)

/* ASRC Context Resampling Coefficient Control (CRCC) */
#define EASRC_CRCC_RS_CA_SHIFT		16
#define EASRC_CRCC_RS_CA_WIDTH		11
#define EASRC_CRCC_RS_CA_MASK		((BIT(EASRC_CRCC_RS_CA_WIDTH) - 1) \
					 << EASRC_CRCC_RS_CA_SHIFT)
#define EASRC_CRCC_RS_CA(v)		(((v) << EASRC_CRCC_RS_CA_SHIFT) \
					 & EASRC_CRCC_RS_CA_MASK)
#define EASRC_CRCC_RS_TAPS_SHIFT	1
#define EASRC_CRCC_RS_TAPS_WIDTH	2
#define EASRC_CRCC_RS_TAPS_MASK		((BIT(EASRC_CRCC_RS_TAPS_WIDTH) - 1) \
					 << EASRC_CRCC_RS_TAPS_SHIFT)
#define EASRC_CRCC_RS_TAPS(v)		(((v) << EASRC_CRCC_RS_TAPS_SHIFT) \
					 & EASRC_CRCC_RS_TAPS_MASK)
#define EASRC_CRCC_RS_CPR_SHIFT		0
#define EASRC_CRCC_RS_CPR_MASK		BIT(EASRC_CRCC_RS_CPR_SHIFT)
#define EASRC_CRCC_RS_CPR		BIT(EASRC_CRCC_RS_CPR_SHIFT)

/* ASRC Interrupt_Control (IC) */
#define EASRC_IRQC_RSDM_SHIFT		8
#define EASRC_IRQC_RSDM_WIDTH		4
#define EASRC_IRQC_RSDM_MASK		((BIT(EASRC_IRQC_RSDM_WIDTH) - 1) \
					 << EASRC_IRQC_RSDM_SHIFT)
#define EASRC_IRQC_RSDM(v)		(((v) << EASRC_IRQC_RSDM_SHIFT) \
					 & EASRC_IRQC_RSDM_MASK)
#define EASRC_IRQC_OERM_SHIFT		4
#define EASRC_IRQC_OERM_WIDTH		4
#define EASRC_IRQC_OERM_MASK		((BIT(EASRC_IRQC_OERM_WIDTH) - 1) \
					 << EASRC_IRQC_OERM_SHIFT)
#define EASRC_IRQC_OERM(v)		(((v) << EASRC_IRQC_OERM_SHIFT) \
					 & EASRC_IEQC_OERM_MASK)
#define EASRC_IRQC_IOM_SHIFT		0
#define EASRC_IRQC_IOM_WIDTH		4
#define EASRC_IRQC_IOM_MASK		((BIT(EASRC_IRQC_IOM_WIDTH) - 1) \
					 << EASRC_IRQC_IOM_SHIFT)
#define EASRC_IRQC_IOM(v)		(((v) << EASRC_IRQC_IOM_SHIFT) \
					 & EASRC_IRQC_IOM_MASK)

/* ASRC Interrupt Status Flags (ISF) */
#define EASRC_IRQF_RSD_SHIFT		8
#define EASRC_IRQF_RSD_WIDTH		4
#define EASRC_IRQF_RSD_MASK		((BIT(EASRC_IRQF_RSD_WIDTH) - 1) \
					 << EASRC_IRQF_RSD_SHIFT)
#define EASRC_IRQF_RSD(v)		(((v) << EASRC_IRQF_RSD_SHIFT) \
					 & EASRC_IRQF_RSD_MASK)
#define EASRC_IRQF_OER_SHIFT		4
#define EASRC_IRQF_OER_WIDTH		4
#define EASRC_IRQF_OER_MASK		((BIT(EASRC_IRQF_OER_WIDTH) - 1) \
					 << EASRC_IRQF_OER_SHIFT)
#define EASRC_IRQF_OER(v)		(((v) << EASRC_IRQF_OER_SHIFT) \
					 & EASRC_IRQF_OER_MASK)
#define EASRC_IRQF_IFO_SHIFT		0
#define EASRC_IRQF_IFO_WIDTH		4
#define EASRC_IRQF_IFO_MASK		((BIT(EASRC_IRQF_IFO_WIDTH) - 1) \
					 << EASRC_IRQF_IFO_SHIFT)
#define EASRC_IRQF_IFO(v)		(((v) << EASRC_IRQF_IFO_SHIFT) \
					 & EASRC_IRQF_IFO_MASK)

/* ASRC Context Channel STAT */
#define EASRC_CSx_CSx_SHIFT		0
#define EASRC_CSx_CSx_WIDTH		32
#define EASRC_CSx_CSx_MASK		((BIT(EASRC_CSx_CSx_WIDTH) - 1) \
					 << EASRC_CSx_CSx_SHIFT)
#define EASRC_CSx_CSx(v)		(((v) << EASRC_CSx_CSx_SHIFT) \
					 & EASRC_CSx_CSx_MASK)

/* ASRC Debug Control Register */
#define EASRC_DBGC_DMS_SHIFT		0
#define EASRC_DBGC_DMS_WIDTH		6
#define EASRC_DBGC_DMS_MASK		((BIT(EASRC_DBGC_DMS_WIDTH) - 1) \
					 << EASRC_DBGC_DMS_SHIFT)
#define EASRC_DBGC_DMS(v)		(((v) << EASRC_DBGC_DMS_SHIFT) \
					 & EASRC_DBGC_DMS_MASK)

/* ASRC Debug Status Register */
#define EASRC_DBGS_DS_SHIFT		0
#define EASRC_DBGS_DS_WIDTH		32
#define EASRC_DBGS_DS_MASK		((BIT(EASRC_DBGS_DS_WIDTH) - 1) \
					 << EASRC_DBGS_DS_SHIFT)
#define EASRC_DBGS_DS(v)		(((v) << EASRC_DBGS_DS_SHIFT) \
					 & EASRC_DBGS_DS_MASK)

/* General Constants */
#define EASRC_CTX_MAX_NUM		4
#define EASRC_32b_MASK			(BIT(32) - 1)
#define EASRC_64b_MASK			(BIT(64) - 1)
#define EASRC_RS_COEFF_MEM		0
#define EASRC_PF_COEFF_MEM		1

/* Prefilter constants */
#define EASRC_PF_ST1_ONLY		0
#define EASRC_PF_TWO_STAGE_MODE		1
#define EASRC_PF_ST1_COEFF_WR		0
#define EASRC_PF_ST2_COEFF_WR		1
#define EASRC_MAX_PF_TAPS		384

/* Resampling constants */
#define EASRC_RS_32_TAPS		0
#define EASRC_RS_64_TAPS		1
#define EASRC_RS_128_TAPS		2

/* Initialization mode */
#define EASRC_INIT_MODE_SW_CONTROL	0
#define EASRC_INIT_MODE_REPLICATE	1
#define EASRC_INIT_MODE_ZERO_FILL	2

/* directions */
#define IN	0
#define OUT	1

/* FIFO watermarks */
#define FSL_EASRC_INPUTFIFO_WML		0x4
#define FSL_EASRC_OUTPUTFIFO_WML	0x1

#define EASRC_INPUTFIFO_THRESHOLD_MIN	0
#define EASRC_INPUTFIFO_THRESHOLD_MAX	127
#define EASRC_OUTPUTFIFO_THRESHOLD_MIN	0
#define EASRC_OUTPUTFIFO_THRESHOLD_MAX	63

#define EASRC_DMA_BUFFER_SIZE		(1024 * 48 * 9)
#define EASRC_MAX_BUFFER_SIZE		(1024 * 48)

#define FIRMWARE_MAGIC			0xDEAD
#define FIRMWARE_VERSION		1

enum easrc_word_width {
	EASRC_WIDTH_16_BIT = 0,
	EASRC_WIDTH_20_BIT = 1,
	EASRC_WIDTH_24_BIT = 2,
	EASRC_WIDTH_32_BIT = 3,
};

struct __attribute__((__packed__))  asrc_firmware_hdr {
	u32 magic;
	u32 interp_scen;
	u32 prefil_scen;
	u32 firmware_version;
};

struct __attribute__((__packed__)) interp_params {
	u32 magic;
	u32 num_taps;
	u32 num_phases;
	u64 center_tap;
	u64 coeff[8192];
};

struct __attribute__((__packed__)) prefil_params {
	u32 magic;
	u32 insr;
	u32 outsr;
	u32 st1_taps;
	u32 st2_taps;
	u32 st1_exp;
	u64 coeff[256];
};

struct dma_block {
	void *dma_vaddr;
	unsigned int length;
	unsigned int max_buf_size;
};

struct fsl_easrc_data_fmt {
	unsigned int width : 2;
	unsigned int endianness : 1;
	unsigned int unsign : 1;
	unsigned int floating_point : 1;
	unsigned int iec958: 1;
	unsigned int sample_pos: 5;
	unsigned int addexp;
};

struct fsl_easrc_io_params {
	struct fsl_easrc_data_fmt fmt;
	unsigned int group_len;
	unsigned int iterations;
	unsigned int access_len;
	unsigned int fifo_wtmk;
	unsigned int sample_rate;
	unsigned int sample_format;
	unsigned int norm_rate;
};

struct fsl_easrc_slot {
	bool busy;
	int ctx_index;
	int num_channel;  /*maximum is 8*/
	int min_channel;
	int max_channel;
	int pf_mem_used;
};

struct fsl_easrc_context {
	enum asrc_pair_index index;
	struct fsl_easrc *easrc;
	struct dma_chan *dma_chan[2];
	struct dma_async_tx_descriptor *desc[2];
	struct fsl_easrc_io_params in_params;
	struct fsl_easrc_io_params out_params;
	struct imx_dma_data dma_data;
	unsigned int channels;
	unsigned int st1_num_taps;
	unsigned int st2_num_taps;
	unsigned int st1_num_exp;
	unsigned int pf_init_mode;
	unsigned int rs_init_mode;
	unsigned int ctx_streams;
	unsigned int pos;
	u64 rs_ratio;
	u64 *st1_coeff;
	u64 *st2_coeff;
	int in_filled_sample;
	int out_missed_sample;
	int st1_addexp;
	int st2_addexp;
	void *private_data;
};

/**
 * fsl_easrc: EASRC private data
 *
 * name : name of EASRC device
 * @pdev: platform device pointer
 * @regmap: regmap handler
 * @dma_params_rx: DMA parameters for receive channel
 * @dma_params_tx: DMA parameters for transmit channel
 * @ctx:  context pointer
 * @slot: slot setting
 * @mem_clk: clock source to access register
 * @firmware_hdr:  the header of firmware
 * @interp: pointer to interpolation filter coeff
 * @prefil: pointer to prefilter coeff
 * @fw: firmware of coeff table
 * @fw_name: firmware name
 * @paddr: physical address to the base address of registers
 * @rs_num_taps:  resample filter taps, 32, 64, or 128
 * @bps_i2c958: bits per sample of iec958
 * @chn_avail: available channels, maximum 32
 * @lock: spin lock for resource protection
 * @easrc_rate: default sample rate for ASoC Back-Ends
 * @easrc_format: default sample format for ASoC Back-Ends
 */

struct fsl_easrc {
	char name[32];
	struct platform_device *pdev;
	struct regmap *regmap;
	struct miscdevice easrc_miscdev;
	struct snd_dmaengine_dai_dma_data dma_params_rx;
	struct snd_dmaengine_dai_dma_data dma_params_tx;
	struct fsl_easrc_context *ctx[EASRC_CTX_MAX_NUM];
	struct fsl_easrc_slot slot[EASRC_CTX_MAX_NUM][2];
	struct clk *mem_clk;
	struct asrc_firmware_hdr *firmware_hdr;
	struct interp_params *interp;
	struct prefil_params *prefil;
	const struct firmware *fw;
	const char *fw_name;
	unsigned long paddr;
	unsigned int rs_num_taps;
	unsigned int bps_iec958[EASRC_CTX_MAX_NUM];
	unsigned int chn_avail;
	u64 *rs_coeff;
	u64 const_coeff;
	int firmware_loaded;
	spinlock_t lock;  /* spin lock for resource protection */
	int easrc_rate;
	int easrc_format;
};

struct dma_chan *fsl_easrc_get_dma_channel(
			struct fsl_easrc_context *ctx, bool dir);
int fsl_easrc_request_context(
			struct fsl_easrc_context *ctx, unsigned int channels);
int fsl_easrc_release_context(struct fsl_easrc_context *ctx);

#define DRV_NAME "fsl-easrc-dma"
#endif /* _FSL_EASRC_H */