summaryrefslogtreecommitdiff
path: root/snd-alpx/alpx_reg.h
blob: 276e16d76ba593c95635f038b99e84080e33aaca (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
// SPDX-License-Identifier: GPL-2.0-or-later
/*
*  Support for Digigram AlpX PCI-e boards
*
*  Copyright (c) 2024 Digigram Digital (info@digigram.com)
*/

#ifndef _ALPX_REG_H_
#define _ALPX_REG_H_

/* Macros */

#define ALPX_BASE(variant, group) \
    (variant ## _ ## group ## _BASE)

#define ALPX_OFFSET(variant, group, reg) \
    ((variant ## _ ## group ## _BASE) + \
    (variant ## _ ## group ## _ ## reg ## _REG))

#define ALPX_AREA(alpx_dev, variant, group) \
    ((alpx_dev)->base + ALPX_BASE(variant, group))
    
#define ALPX_ITEM_REG(variant, group, index) \
    ((variant ## _ ## group ## _BASE) + \
    (variant ## _ ## group ## _ ## index))

#define ALPX_REG(alpx_dev, variant, group, reg) \
    ((alpx_dev)->base + ALPX_OFFSET(variant, group, reg))
    
#define ALPX_REG_ARRAY(alpx_dev, variant, group, index) \
    ((alpx_dev)->base + ALPX_ITEM_REG(variant, group, index))

#define ALPX_COMMON_OFFSET(variant, group, reg) \
    ((variant ## _ ## group ## _BASE) + \
    (ALPX_COMMON_ ## reg ## _REG))

#define ALPX_COMMON_REG(alpx_dev, variant, group, reg) \
    ((alpx_dev)->base + ALPX_COMMON_OFFSET(variant, group, reg))
    
/* Conversion Register index to register offset, register are 32 bits words */
#define ALP_INDEX_TO_REG_OFFSET(i) ((i) * 4)

    
/* PCI */

#define ALPX_PCI_BAR				0
#define ALPX_PCI_ID_DEVICE 0x0002

#define ALPX_PCI_ID_SUBSYSTEM_MADI						0x0020
#define ALPX_PCI_ID_SUBSYSTEM_ALP222 				0x0040
#define ALPX_PCI_ID_SUBSYSTEM_ALP222_MIC 			0x0840
#define ALPX_PCI_ID_SUBSYSTEM_ALP442 				0x0080
#define ALPX_PCI_ID_SUBSYSTEM_ALP442_MIC 			0x0880
#define ALPX_PCI_ID_SUBSYSTEM_ALP882 				0x00C0
#define ALPX_PCI_ID_SUBSYSTEM_ALP882_MIC 			0x08C0
#define ALPX_PCI_ID_SUBSYSTEM_MADI_LOOPBACK	0x0000
#define ALPX_PCI_ID_SUBSYSTEM_ALPDANTE 				0x00E0


/* This one is a very special one : The production area is invalid */
#define ALPX_PCI_ID_SUBSYSTEM_MADI_ALP_DEAD	0xDEAD

/* UNKNOWN */
#define ALPUNKNOWN_GPIO_BASE 0xFFFFF

/*  ALPX Base */

#define ALP_SHARED_BASE		0x50000
#define ALP_SHARED_SIZE		8 * 1024
#define ALP_PROC_BASE			0x60000
#define ALP_CONTROL_BASE	0x70000
#define ALP_CLK_MANAGER_BASE		ALP_CONTROL_BASE


/* Alpxxx Flash defs */
/** Common size for all the data areas in Flash, exclude the FIRMWARE **/
#define ALPxxx_FLASH_DATA_AREAS_SIZE (32*1024)

/** PRODUCTION Area in GOLDEN Region **/
#define ALPxxx_FLASH_GOLDEN_PRODUCTION_BASE 0x228000

/* PRODUCTION structure */
#define ALPX_SERIAL_OFFSET_IN_PRODUCTION 0

/* BUILD version register : common addresses */
#define ALP_CONTROL_DESIGN_VERSION_REG 0x100
#define ALP_CONTROL_BUILD_VERSION_REG 0x104

#define ALP_CONTROL_BUILD_VERSION_MASK GENMASK(15,0)


/** Multi-channels cards **/

/* Clock Manager */
#define ALPMC_CLK_MANAGER_CONFIG_REG		0x24
#define ALPMC_CLK_MANAGER_CONFIG_FS(v)		((v) & GENMASK(4, 0))
#define ALPMC_CLK_MANAGER_CONFIG_FS_MASK	GENMASK(4, 0)


#define ALPMC_CLK_MANAGER_EFFECTIVE_FS(v)	(((v) & GENMASK(20, 16)) >> 16)
#define ALPMC_CLK_MANAGER_EFFECTIVE_FS_INVALID	0
#define ALPMC_CLK_MANAGER_EFFECTIVE_FS_32K	5
#define ALPMC_CLK_MANAGER_EFFECTIVE_FS_44_1K	6
#define ALPMC_CLK_MANAGER_EFFECTIVE_FS_48K	7
#define ALPMC_CLK_MANAGER_EFFECTIVE_FS_DOUBLE	BIT(3)
#define ALPMC_CLK_MANAGER_EFFECTIVE_FS_QUAD	BIT(4)
#define ALPMC_CLK_MANAGER_EFFECTIVE_FS_BASE_MASK	GENMASK(2, 0)


#define ALPMC_CLK_MANAGER_CONFIG_CLK_CURRENT_VALUE_MASK	GENMASK(20, 16)
#define ALPMC_CLK_MANAGER_CONFIG_CLK_CURRENT_VALUE_POS		16
#define ALPMC_CLK_MANAGER_CONFIG_CLK_CURRENT_VALUE_QTY		8

#define ALPMC_CLK_MANAGER_SOURCE(v)		(((v) & GENMASK(23, 21)) >> 21)
#define ALPMC_CLK_MANAGER_SOURCE_INTERNAL				0
#define ALPMC_CLK_MANAGER_SOURCE_SIC							1
#define ALPMC_CLK_MANAGER_SOURCE_WCLK_IN				2
#define ALPMC_CLK_MANAGER_SOURCE_AES_SYNC				3
#define ALPMC_CLK_MANAGER_SOURCE_AES_AUDIO_12		4
#define ALPMC_CLK_MANAGER_SOURCE_AES_AUDIO_34		5
#define ALPMC_CLK_MANAGER_SOURCE_AES_AUDIO_56		6
#define ALPMC_CLK_MANAGER_SOURCE_AES_AUDIO_78		7
#define ALPMC_CLK_MANAGER_SOURCE_DANTE					8

/* Pre FW V240 compatibility support */
#define ALP882_APP_PREFW240_CLK_MANAGER_SOURCE_WCLK_IN				0
#define ALP882_APP_PREFW240_CLK_MANAGER_SOURCE_AES_SYNC			1
#define ALP882_APP_PREFW240_CLK_MANAGER_SOURCE_AES_AUDIO_12		2
#define ALP882_APP_PREFW240_CLK_MANAGER_SOURCE_AES_AUDIO_34		3
#define ALP882_APP_PREFW240_CLK_MANAGER_SOURCE_AES_AUDIO_56		4
#define ALP882_APP_PREFW240_CLK_MANAGER_SOURCE_AES_AUDIO_78		5
#define ALP882_APP_PREFW240_CLK_MANAGER_SOURCE_INTERNAL				6

#define ALPMC_CLK_MANAGER_CONFIG_CLK_SRC_MASK	GENMASK(23, 21)
#define ALPMC_CLK_MANAGER_CONFIG_CLK_SRC_POS						21

#define ALPMC_CLK_MANAGER_BASE			ALP_CLK_MANAGER_BASE
#define ALPMC_CONTROL_BASE		        ALP_CLK_MANAGER_BASE
#define ALPMC_GPIO_BASE			0x45000
#define ALPMC_CODEC_CTRL_BASE			0x71000
#define ALPMC_MIXER_BASE			0x74000
#define ALPMC_AMPLI_IN_BASE			0x79000
#define ALPMC_AMPLI_OUT_BASE			0x7c000

/* FS switch delay required by HW (in ms) */
#define ALPMC_FS_SWITCH_DELAY 500

/* Supported Firmware versions */
#define ALPMC_SUPPORTED_BASE_FW_VERSION 247
#define ALP222_SUPPORTED_BASE_FW_VERSION 283
/* The base Firmware version for AlpDANTE supported by this driver */
#define ALPDANTE_SUPPORTED_BASE_FW_VERSION 316



/* GPIO */

#define ALPMC_GPIO_INPUT_REG			0x08
#define ALPMC_GPIO_INPUT_QTY			8
#define ALPMC_GPIO_OUTPUT_REG			0x0C
#define ALPMC_GPIO_OUTPUT_QTY		8

/* ALPMC Gain access*/
#define ALPMC_GAIN_TABLE_BASE(c)		(0xc + (c) * 0x4)

/* Codec */
#define ALPMC_INPUT_PARAMS_REG 0x2C
#define ALPMC_MIC_INPUT_PH_1_MASK BIT(0)
#define ALPMC_MIC_INPUT_PH_2_MASK BIT(1)
#define ALPMC_MIC_INPUT_PH_3_MASK BIT(2)
#define ALPMC_MIC_INPUT_PH_4_MASK BIT(3)
#define ALPMC_MIC_INPUT_PH_5_MASK BIT(4)
#define ALPMC_MIC_INPUT_PH_6_MASK BIT(5)
#define ALPMC_MIC_INPUT_PH_7_MASK BIT(6)
#define ALPMC_MIC_INPUT_PH_8_MASK BIT(7)

#define ALPMC_MIC_INPUT_PH_1_POS 0
#define ALPMC_MIC_INPUT_PH_2_POS 1
#define ALPMC_MIC_INPUT_PH_3_POS 2
#define ALPMC_MIC_INPUT_PH_4_POS 3
#define ALPMC_MIC_INPUT_PH_5_POS 4
#define ALPMC_MIC_INPUT_PH_6_POS 5
#define ALPMC_MIC_INPUT_PH_7_POS 6
#define ALPMC_MIC_INPUT_PH_8_POS 7

#define ALPMC_CODEC_PGA_REGS 0x0C

#define ALPMC_CODEC_AES_SRC_CONTROL_REG	0x08
#define ALPMC_CODEC_AES_SRC_CONTROL_AUTO_DISABLE_1_2	BIT(0)
#define ALPMC_CODEC_AES_SRC_CONTROL_AUTO_DISABLE_3_4	BIT(1)
#define ALPMC_CODEC_AES_SRC_CONTROL_AUTO_DISABLE_5_6	BIT(2)
#define ALPMC_CODEC_AES_SRC_CONTROL_AUTO_DISABLE_7_8	BIT(3)

#define ALPMC_CODEC_AES_SRC_1_2_MASK BIT(0)
#define ALPMC_CODEC_AES_SRC_1_2_POS 			0
#define ALPMC_CODEC_AES_SRC_3_4_MASK BIT(1)
#define ALPMC_CODEC_AES_SRC_3_4_POS 			1
#define ALPMC_CODEC_AES_SRC_5_6_MASK BIT(2)
#define ALPMC_CODEC_AES_SRC_5_6_POS 			2
#define ALPMC_CODEC_AES_SRC_7_8_MASK BIT(3)
#define ALPMC_CODEC_AES_SRC_7_8_POS 			3

/* MC Mixer */
/* One Gain value per register */
#define ALPMC_MIXER_ENTRIES_IN_REG 1

#define ALPMC_MIXER_GAIN_MASK			GENMASK(ALPX_MIXER_GAIN_BITS - 1, 0)

#define ALPMC_MIXER_GAIN_SEL(v)		((v) & GENMASK(ALPX_MIXER_GAIN_BITS - 1, 0))

#define ALPMC_MIXER_GAIN_VALUE(v)		((v) & GENMASK(ALPX_MIXER_GAIN_BITS-1, 0))

#define ALPMC_MIXER_GAIN_REG(size, in, out)		(ALPX_MIXER_REG_ENTRIES_OFFSET + (out) * ((size) * 4 / ALPMC_MIXER_ENTRIES_IN_REG) + ((in) / ALPMC_MIXER_ENTRIES_IN_REG) * 4)


/* Dedicated to ALP882 */

#define ALP882_CHANNELS_DAW_COUNT		16
#define ALP882_CHANNELS_ANALOG_COUNT		8
#define ALP882_CHANNELS_AES_COUNT		8

#define ALP882_CHANNELS_IN_DAW_OFFSET		0
#define ALP882_CHANNELS_IN_ANALOG_OFFSET	(ALP882_CHANNELS_IN_DAW_OFFSET + \
                        ALP882_CHANNELS_DAW_COUNT)
#define ALP882_CHANNELS_IN_AES_OFFSET		(ALP882_CHANNELS_IN_ANALOG_OFFSET + \
                        ALP882_CHANNELS_ANALOG_COUNT)

#define ALP882_CHANNELS_OUT_ANALOG_OFFSET	0
#define ALP882_CHANNELS_OUT_AES_OFFSET		(ALP882_CHANNELS_OUT_ANALOG_OFFSET + \
                        ALP882_CHANNELS_ANALOG_COUNT)
#define ALP882_CHANNELS_OUT_DAW_OFFSET		(ALP882_CHANNELS_OUT_AES_OFFSET + \
                        ALP882_CHANNELS_AES_COUNT)


/* ALP882 Clock Manager */
#define ALP882_CLK_MANAGER_CONFIG_CLK_SRC_QTY						8

/* Alp 882 clk source in Pre 240 FW */
#define ALP882_APP_PREFW240_CLK_MANAGER_CLK_SRC_QTY			7

/* Mixer 882 */
#define ALP882_MIXER_SIZE   32

/* Dedicated to ALP442 */

#define ALP442_CHANNELS_ANALOG_COUNT		4
#define ALP442_CHANNELS_AES_COUNT		4
#define ALP442_CHANNELS_DAW_COUNT		(ALP442_CHANNELS_ANALOG_COUNT + \
                        ALP442_CHANNELS_AES_COUNT)


#define ALP442_CHANNELS_IN_DAW_OFFSET		0
#define ALP442_CHANNELS_IN_ANALOG_OFFSET	(ALP442_CHANNELS_IN_DAW_OFFSET + \
                        ALP442_CHANNELS_DAW_COUNT)
#define ALP442_CHANNELS_IN_AES_OFFSET		(ALP442_CHANNELS_IN_ANALOG_OFFSET + \
                        ALP442_CHANNELS_ANALOG_COUNT)

#define ALP442_CHANNELS_OUT_ANALOG_OFFSET	0
#define ALP442_CHANNELS_OUT_AES_OFFSET		(ALP442_CHANNELS_OUT_ANALOG_OFFSET + \
                        ALP442_CHANNELS_ANALOG_COUNT)
#define ALP442_CHANNELS_OUT_DAW_OFFSET		(ALP442_CHANNELS_OUT_AES_OFFSET + \
                        ALP442_CHANNELS_AES_COUNT)


/* ALP442 Clock Manager */
#define ALP442_CLK_MANAGER_CONFIG_CLK_SRC_QTY						6
#define ALP442_CLK_MANAGER_SOURCE_INTERNAL				ALPMC_CLK_MANAGER_SOURCE_INTERNAL

/* Mixer 442 */
#define ALP442_MIXER_SIZE   (ALP442_CHANNELS_ANALOG_COUNT + \
                                                    ALP442_CHANNELS_AES_COUNT + \
                                                    ALP442_CHANNELS_DAW_COUNT)



/* Alp 222 */

#define ALP222_ANALOG_QTY 0x2
#define ALP222_AES3_QTY 0x2

#define ALP222_EXT_CHANNEL_QTY (ALP222_ANALOG_QTY + ALP222_AES3_QTY)

#define  ALP222_DAW_QTY ALP222_EXT_CHANNEL_QTY


#define ALP222_CLK_MANAGER_BASE		ALP_CLK_MANAGER_BASE
#define ALP222_CONTROL_BASE		        ALP_CLK_MANAGER_BASE
#define ALP222_AMPLI_IN_BASE					0x79000
#define ALP222_AMPLI_OUT_BASE				0x7c000
#define ALP222_CODEC_CTRL_BASE			0x71000
#define ALP222_GPIO_BASE						0x45000
#define ALP222_MIXER_BASE						0x73000

#define ALP222_DAW_PLAYBACK_AMPLI_BASE ALP222_AMPLI_IN_BASE + ALPX_GAIN_REG(0)
#define ALP222_ANALOG_CAPTURE_AMPLI_BASE ALP222_AMPLI_IN_BASE + ALPX_GAIN_REG(ALP222_DAW_QTY)
#define ALP222_AES3_CAPTURE_AMPLI_BASE ALP222_AMPLI_IN_BASE + ALPX_GAIN_REG(ALP222_DAW_QTY + ALP222_ANALOG_QTY)

#define ALP222_ANALOG_PLAYBACK_AMPLI_BASE ALP222_AMPLI_OUT_BASE + ALPX_GAIN_REG(0)
#define ALP222_AES3_PLAYBACK_AMPLI_BASE ALP222_AMPLI_OUT_BASE + ALPX_GAIN_REG(ALP222_ANALOG_QTY)
#define ALP222_DAW_CAPTURE_AMPLI_BASE ALP222_AMPLI_OUT_BASE + ALPX_GAIN_REG(ALP222_ANALOG_QTY + ALP222_AES3_QTY)


/* Alp222 GPIO */
#define ALP222_GPIO_INPUT_REG			0x00
#define ALP222_GPIO_INPUT_QTY			2
#define ALP222_GPIO_OUTPUT_REG		0x08
#define ALP222_GPIO_OUTPUT_QTY		2

/* Alp222 CODEC*/
#define ALP222_CODEC_PGA_REGS 0x08

/* Alp MADI */
#define ALP222_MADI_QTY 0x40

#define ALPMADI_CHANNEL_QTY ALP222_MADI_QTY

//MADI Unit & DAW Unit
#define ALPMADI_AUDIO_UNIT_QTY 2

#define ALPMADI_CLK_MANAGER_BASE		ALP_CLK_MANAGER_BASE
#define ALPMADI_CONTROL_BASE		        ALP_CLK_MANAGER_BASE
#define ALPMADI_ROUTER_IN_BASE		    0x71000
#define ALPMADI_MIXER_BASE		            0x72000
#define ALPMADI_ROUTER_OUT_BASE		0x73000
#define ALPMADI_MEAS_DAW_IN_BASE		0x74000
#define ALPMADI_GAIN_DAW_IN_BASE		0x75000
#define ALPMADI_MEAS_DAW_OUT_BASE	0x76000
#define ALPMADI_GAIN_DAW_OUT_BASE	0x77000
#define ALPMADI_MEAS_MADI_IN_BASE		0x78000
#define ALPMADI_GAIN_MADI_IN_BASE		0x79000
#define ALPMADI_MEAS_MADI_OUT_BASE	0x7A000
#define ALPMADI_GAIN_MADI_OUT_BASE	0x7B000
#define ALPMADI_GPIO_BASE		ALPUNKNOWN_GPIO_BASE

#define ALPMADI_GPIO_INPUT_REG			0xFF
#define ALPMADI_GPIO_OUTPUT_REG			0xFF

/* Common */

#define ALPX_COMMON_ID_REG			0x0


#define ALPX_COMMON_VERSION_REG			0x4
#define ALPX_COMMON_VERSION_VERSION(v)		((v)  >> 16)
#define ALPX_COMMON_VERSION_REVISION(v)		((v) & GENMASK(15, 0))

#define ALPX_DANTE_VERSION_VERSION(v)		((v)  >> 8)
#define ALPX_DANTE_VERSION_REVISION(v)		((v) & GENMASK(7, 0))


/* Common Clock 222/882 models*/

#define ALPxxx_CLK_MANAGER_CLK_VALUES_QTY		14

/* Values below use the full 5 bits of clock definitions : factor | base */
#define ALPxxx_CLK_MANAGER_CLK_VALUE_8K				(0)
#define ALPxxx_CLK_MANAGER_CLK_VALUE_11_025K 	(1)
#define ALPxxx_CLK_MANAGER_CLK_VALUE_16K 			(2)
#define ALPxxx_CLK_MANAGER_CLK_VALUE_22_05K 		(3)
#define ALPxxx_CLK_MANAGER_CLK_VALUE_24K 			(4)
#define ALPxxx_CLK_MANAGER_CLK_VALUE_32K 			(5)
#define ALPxxx_CLK_MANAGER_CLK_VALUE_44_1K 		(6)
#define ALPxxx_CLK_MANAGER_CLK_VALUE_48K 			(7)
#define ALPxxx_CLK_MANAGER_CLK_VALUE_64K 			(0xD)
#define ALPxxx_CLK_MANAGER_CLK_VALUE_128K 		(0x15)
#define ALPxxx_CLK_MANAGER_CLK_VALUE_88_2K 		(0xE)
#define ALPxxx_CLK_MANAGER_CLK_VALUE_176_4K 		(0x16)
#define ALPxxx_CLK_MANAGER_CLK_VALUE_96K 			(0xF)
#define ALPxxx_CLK_MANAGER_CLK_VALUE_192K 		(0x17)

/* ALP222 Clock Manager */

#define ALP222_CLK_MANAGER_CONFIG_REG		0x28
#define ALP222_CLK_MANAGER_CONFIG_FS_MASK	GENMASK(4, 0)
#define ALP222_CLK_MANAGER_CONFIG_CLK_CURRENT_VALUE_MASK	GENMASK(20, 16)
#define ALP222_CLK_MANAGER_CONFIG_CLK_CURRENT_VALUE_POS		16


#define ALP222_CLK_MANAGER_CLK_SRC_MASK	GENMASK(23, 21)
#define ALP222_CLK_MANAGER_CLK_SRC_POS		21
#define ALP222_CLK_MANAGER_CLK_SRC_QTY				5
#define ALP222_CLK_MANAGER_CLK_SRC_INTERNAL		(0)
#define ALP222_CLK_MANAGER_CLK_SRC_SIC				(1)
#define ALP222_CLK_MANAGER_CLK_SRC_WCLK			(2)
#define ALP222_CLK_MANAGER_CLK_SRC_AES_SYNC		(3)
#define ALP222_CLK_MANAGER_CLK_SRC_AES_AUDIO	(4)
#define ALP222_CLK_MANAGER_CLK_SRC_MAX              ALP222_CLK_MANAGER_CLK_SRC_AES_AUDIO

/* Pre FW 283 clock sources definitions */
#define ALP222_APPS_PREFW283_CLK_MANAGER_CLK_SRC_QTY 4
#define  ALP222_CLK_MANAGER_APPSPREFW283_CLK_SRC_WCLK 0
#define ALP222_CLK_MANAGER_APPSPREFW283_CLK_SRC_AES_SYNC 1
#define ALP222_CLK_MANAGER_APPSPREFW283_CLK_SRC_AES_AUDIO 2
#define ALP222_CLK_MANAGER_APPSPREFW283_CLK_SRC_INTERNAL 3

/* ALPMADI Clock Manager */

#define ALPMADI_CLK_MANAGER_CONFIG_REG		0x1C
#define ALPMADI_CLK_MANAGER_CONFIG_FS_MASK	GENMASK(10, 8)
#define ALPMADI_CLK_MANAGER_CONFIG_FS_44_1K	(0 << 8)
#define ALPMADI_CLK_MANAGER_CONFIG_FS_48K	(1 << 8)
#define ALPMADI_CLK_MANAGER_CONFIG_FS_88_2K	(2 << 8)
#define ALPMADI_CLK_MANAGER_CONFIG_FS_96K	(3 << 8)
#define ALPMADI_CLK_MANAGER_CONFIG_FS_176_4K	(4 << 8)
#define ALPMADI_CLK_MANAGER_CONFIG_FS_192K	(5 << 8)

/* AlpDANTE Clock Manager clock registervalues*/
#define ALPDANTE_CLK_MANAGER_CLK_VALUE_44_1K 0x01
#define ALPDANTE_CLK_MANAGER_CLK_VALUE_48K  0x00
#define ALPDANTE_CLK_MANAGER_CLK_VALUE_88_2K 0x03
#define ALPDANTE_CLK_MANAGER_CLK_VALUE_96K 0x02
#define ALPDANTE_CLK_MANAGER_CLK_VALUE_176_4K 0x05
#define ALPDANTE_CLK_MANAGER_CLK_VALUE_192K 0x04

/* ALPX PROC */
/* Embedded processor dedicated area length (in bytes) */
#define ALP_PROC_AREA_LENGTH 0x800U

#define ALP_PROC_VERSION_REG		0x00

#define ALP_PROC_STATUS_REG		0x04
#define ALP_PROC_STATUS_FAIL		BIT(0)
#define ALP_PROC_STATUS_PENDING	BIT(1)

#define ALP_PROC_FAILS_REG		0x08
#define ALP_PROC_FAILS_FAIL_NONE	0

#define ALP_PROC_COMMAND_REG		0x0C

#define ALP_PROC_COMMAND_MAKE_P16(_cmd, _p16) ((((_p16) & 0x0FFFF) << 8) | \
                        (_cmd))
#define ALP_PROC_CMD_READ_FLASH_SECTOR		0x10
#define ALP_PROC_CMD_WRITE_FLASH_SECTOR	0x0A

#define ALP_PROC_FWCONFIG_REG			0x10
#define ALP_PROC_FWCONFIG_CLKSRC_UP_MASK GENMASK(0,0)
#define ALP_PROC_FWCONFIG_CLKSRC_UP_POS 0

#define ALP_PROC_FWCONFIG_CLKSRC_DOWN_MASK GENMASK(1,1)
#define ALP_PROC_FWCONFIG_CLKSRC_DOWN_POS 1


/* PROC Logs base register */
#define ALP_PROC_LOG_OFFSET 0x40U
#define ALP_PROC_LOG_BASE  ALP_PROC_BASE + ALP_PROC_LOG_OFFSET

/* Log length, -8 ?? but done in the reference application from Easii-IC (log.c) */
#define ALP_PROC_LOG_LENGTH ALP_PROC_AREA_LENGTH - ALP_PROC_LOG_OFFSET - 8U

/* Clock source priority def */
#define ALP_PROC_CLK_SOURCE_PRIO_REG	0x14

#define ALP_PROC_CLK_SOURCE_PRIO0_MASK	GENMASK(3,0)
#define ALP_PROC_CLK_SOURCE_PRIO0_POS		0

#define ALP_PROC_CLK_SOURCE_PRIO1_MASK	GENMASK(7,4)
#define ALP_PROC_CLK_SOURCE_PRIO1_POS		4

#define ALP_PROC_CLK_SOURCE_PRIO2_MASK	GENMASK(11,8)
#define ALP_PROC_CLK_SOURCE_PRIO2_POS		8

#define ALP_PROC_CLK_SOURCE_PRIO3_MASK	GENMASK(15,12)
#define ALP_PROC_CLK_SOURCE_PRIO3_POS		12

/* ALPX GPIO */
#define ALPX_GPIO_MASK(i)			BIT(i)
#define ALPX_GPIO_SEL(i, v)			(((v) << (i)) &  ALPX_GPIO_MASK(i))
#define ALPX_GPIO_VALUE(i, v)			(((v) & ALPX_GPIO_MASK(i)) >>  (i))

/* Control */
#define ALP_CONTROL_PCIE_SUBSYS_ID_REG		0x8
#define ALP_CONTROL_SAMPLES_CNT_REG		0x18
#define ALP_CLK_MANAGER_SAMPLES_COUNT_REG	0x18

#define ALP222_CONTROL_PCIE_MASK_IT_REG		0xc
#define ALP222_CONTROL_WC_RTERM_REG		0x1c
#define ALP222_CONTROL_PCIE_WARM_RESET_REG	0x10
#define ALP222_CONTROL_PCIE_WARM_RESET_VALUE	0xc07d8e51
#define ALP222_CONTROL_PCIE_COLD_RESET_REG	0x14
#define ALP222_CONTROL_PCIE_COLD_RESET_VALUE	0x8e5ef96a
#define ALP222_CONTROL_FS_REG			0x28
#define ALP222_CODEC_CTRL_ASRC_REG 		0x10
#define ALP222_MIC_CONTROL_REG					0x24

#define ALPMADI_CONTROL_WARM_REBOOT_FPGA_REG		0x10
#define ALPMADI_CONTROL_COLD_REBOOT_FPGA_REG		0x14
#define ALPMADI_CONTROL_BLINK_LED_REG		0x20
#define ALPMADI_CONTROL_EXT_ITF_CONFIG_REG		0x24
#define ALPMADI_CONTROL_FS_SEL_REG		0x28

#define ALPMADI_CONTROL_EXT0_STATUS_CTRL_REG	0x2c
#define ALPMADI_CONTROL_EXT1_STATUS_CTRL_REG	0x30
#define ALPMADI_CONTROL_EXT2_STATUS_CTRL_REG	0x34
#define ALPMADI_CONTROL_EXT3_STATUS_CTRL_REG	0x38
#define ALPMADI_CONTROL_PI_PARAMS_REG		0x3c


#define ALPMADI_CONTROL_BLINK_LED_EN		BIT(0)
#define ALPMADI_CONTROL_PI_PARAMS_KI(v)		((v) & GENMASK(15, 0))
#define ALPMADI_CONTROL_PI_PARAMS_KP(v)		(((v) << 16) & GENMASK(31, 16))
#define ALPMADI_CONTROL_EXT_ITF_CONFIG_MADI_LINK(v) ((v) & GENMASK(1, 0))
#define ALPMADI_CONTROL_EXT_ITF_CONFIG_BNC_SIGNAL(v) (((v<<8)) & GENMASK(8, 8))

/* Codec */
#define ALPX_CODEC_CTRL_GAIN_REG(i)		((i) * 0x4)

/* Gains */
#define ALPX_GAIN_VALUE_BITS 10
#define ALPX_GAIN_REG_ENTRIES_OFFSET 0xC
#define ALPX_GAIN_REG(i)			(ALPX_GAIN_REG_ENTRIES_OFFSET + (i) * 0x4)

/* Router */
#define ALPMADI_ROUTER_SIZE 128

#define ALPX_ROUTER_REG_ENTRIES_OFFSET 0x8

/* RAW ACCESS to router register i*/
#define ALPX_ROUTER_REG(i)			(0x8 + ((i) / 4) * 0x4)

#define ALPX_ROUTER_SHIFT(i)			(((i) % 4) * 8)
#define ALPX_ROUTER_MASK(i)			(GENMASK(7, 0) << \
                        ALPX_ROUTER_SHIFT(i))
#define ALPX_ROUTER_SEL(i, v)			(((v) & GENMASK(7, 0)) << \
                        ALPX_ROUTER_SHIFT(i))
#define ALPX_ROUTER_VALUE(i, v)			(((v) >> \
                        ALPX_ROUTER_SHIFT(i)) & \
                        GENMASK(7, 0))

#define ALPMADI_ROUTER_PORT(i)  (ALPX_ROUTER_REG_ENTRIES_OFFSET + ((i) * 0x4))

#define ALPMADI_ROUTER_IN_PORT(i)  ALPMADI_ROUTER_PORT(i)

#define ALPMADI_ROUTER_OUT_PORT(i)  ALPMADI_ROUTER_PORT(i)

/* Mixer */
#define ALPX_MIXER_GAIN_BITS 10
#define ALPX_GAIN_0dB         0x385
#define ALPX_GAIN_MUTE       0x000

/** Mixer 222 **/

/* Mixer Input i, output j & j+1*/
#define ALP222_MIXER_SIZE   8
#define ALPMADI_MIXER_SIZE 16

//2 gains per register
#define ALPMADI_MIXER_BANK_SIZE 2

#define ALP222_MIXER_ENTRIES_IN_REG    2

//#define ALPX_GAIN_REG_VALUE_STEP_PER_DB    10   
#define ALPX_GAIN_dB_TO_10ofdB (dB) ((db) * 10)


#define ALPX_GAIN_REG_VALUE_FROM_10ofDB(val10ofdb)   (ALPX_GAIN_0dB + (val10ofdb))

#define ALPX_MIXER_REG_ENTRIES_OFFSET 0x8

/* Return the @reg for the given (input/output) in the mixer. MIND the register structure !! */
//MADI structured as In into Outs
//EDF MADI formula TO BE CHECKED 
//#define ALPMADI_MIXER_GAIN_REG(mixerSize, inputId, outputId) (0x8 + ((((mixerSize) * (inputId) + (outputId)) * 4 / ALPX_MIXER_ENTRIES_IN_REG)))

// Structured as : Out from Ins
#define ALP222_MIXER_GAIN_REG(size, in, out)		(ALPX_MIXER_REG_ENTRIES_OFFSET + (out) * ((size) * 4 / ALP222_MIXER_ENTRIES_IN_REG) + ((in) / ALP222_MIXER_ENTRIES_IN_REG) * 4)

//Odd entry is in higher bits
#define ALP222_MIXER_GAIN_SHIFT_STEP(i)		(((i) & 1) ? ALPX_MIXER_GAIN_BITS : 0)

#define ALP222_MIXER_GAIN_MASK(i)			(GENMASK(ALPX_MIXER_GAIN_BITS-1, 0) << \
                        ALP222_MIXER_GAIN_SHIFT_STEP(i))

#define ALP222_MIXER_GAIN_SEL(i, v)		(((v) & GENMASK(ALPX_MIXER_GAIN_BITS-1, 0)) << \
                        ALP222_MIXER_GAIN_SHIFT_STEP(i))

#define ALP222_MIXER_GAIN_VALUE(i, v)		(((v) >> \
                        ALP222_MIXER_GAIN_SHIFT_STEP(i)) & \
                        GENMASK(ALPX_MIXER_GAIN_BITS-1, 0))


//Build the mixer register
//#define ALP222_MIXER_REG_VALUE(left, right) ((left)<< ALP_GAIN_VALUE_BITS | (right))

// Flags access
#define ALP222_CODEC_CTRL_ASRC_MASK	GENMASK(0, 0)
#define ALP222_CODEC_CTRL_ASRC_POS		0

// MIC Options defs
#define ALP222_MIC_GAIN_L_MASK GENMASK(7,0)
#define ALP222_MIC_GAIN_L_POS 0
#define ALP222_MIC_GAIN_WIDTH 8

#define ALP222_MIC_GAIN_R_MASK GENMASK(15,8)
#define ALP222_MIC_GAIN_R_POS 8


#define ALP222_MIC_DC_L_MASK GENMASK(16,16)
#define ALP222_MIC_DC_L_POS 16
#define ALP222_MIC_CM_L_MASK GENMASK(17,17)
#define ALP222_MIC_CM_L_POS 17
#define ALP222_MIC_PH_L_MASK GENMASK(18,18)
#define ALP222_MIC_PH_L_POS 18

#define ALP222_MIC_DC_R_MASK GENMASK(19,19)
#define ALP222_MIC_DC_R_POS 19
#define ALP222_MIC_CM_R_MASK GENMASK(20,20)
#define ALP222_MIC_CM_R_POS 20
#define ALP222_MIC_PH_R_MASK GENMASK(21,21)
#define ALP222_MIC_PH_R_POS 21

#define ALP222_MIC_EN_L_MASK GENMASK(22,22)
#define ALP222_MIC_EN_R_MASK GENMASK(23,23)
#define ALP222_MIC_EN_L_POS 22
#define ALP222_MIC_EN_R_POS 23


#define ALP222_MIC_HERE_POS	31

#endif