summaryrefslogtreecommitdiff
path: root/snd-alpx/alpx_variants_dante.h
blob: 41a5c822e0e78294cafeec4519d52a4c3f2cb4c9 (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
// 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_VARIANTS_DANTE_H_
#define _ALPX_VARIANTS_DANTE_H_

#include "alpx.h"
#include "alpx_reg.h"

#include <sound/tlv.h>
#include "alpx_variants_common.h"
#include "alpx_axcmem.h"
#include "alpx_controls.h"

/* DANTE card */

#define ALPDANTE_DEFAULT_FS 48000


static struct snd_pcm_hardware alpdante_hardware_specs = {
	.info			= SNDRV_PCM_INFO_MMAP |
				  SNDRV_PCM_INFO_MMAP_VALID |
				  SNDRV_PCM_INFO_INTERLEAVED |
				  SNDRV_PCM_INFO_BLOCK_TRANSFER |
				  SNDRV_PCM_INFO_RESUME,
	.formats		= SNDRV_PCM_FMTBIT_S32_LE,
	.rates			= SNDRV_PCM_RATE_48000,
	.rate_min		= ALPDANTE_DEFAULT_FS,
	.rate_max		= ALPDANTE_DEFAULT_FS,
	.channels_min		= 64,
	.channels_max		= 64,
	.buffer_bytes_max	= SZ_1M * 4, /* period_bytes_max * periods_max */
	.period_bytes_min   = 48, /* min latency 1ms */
	.period_bytes_max	= SZ_1M, /* 20ms at 192kHz * nchans * 4B, rounded at 2^n */
	.periods_min		= 1,
	.periods_max		= 4,
};


/* FFPR Support */

/* FPPR Parameters */
static const u32 ALPDANTE_FLASH_UNLOCK = 1;
static const u32 ALPDANTE_FLASH_WAIT_STEP_TIME = 10;
static const u32 ALPDANTE_FLASH_LOCK_ACCESS_TRY_QTY = 1;
static const u32 ALPDANTE_FPPR_SAVE_REGS_CMD_COMPLETION_WAIT_STEPS_QTY = 200;
static const u32 ALPDANTE_FPPR_NOPE_CMD_ID = 0;
static const u32 ALPDANTE_FPPR_SAVE_REGISTERS_CMD_ID = 6;
static const u32 ALPDANTE_FCAR_STATUS_MASK = 0xFFFFFF;
static const u32 ALPDANTE_SMALAR_AVAILABLE = 0;
static const u32 ALPDANTE_SMALAR_IN_USE = 1;

/* PROD TEST Parameters */
static const u32 ALPDANTE_PROD_TEST_LOOPBACK = BIT(1);

/* FPPR Macros */
#define ALPDANTE_FPPR_CMD_STATUS(reg_val) ((reg_val) & ALPDANTE_FCAR_STATUS_MASK)

/* AXCmem Registers locations */

static const struct alpx_axcmem_loc ALPDANTE_FIR_LOC = {1,0,2};
static const struct alpx_axcmem_loc ALPDANTE_CSPPR_LOC = {1,3,2};

static const struct alpx_axcmem_loc ALPDANTE_CLKPR_LOC = {1,3,1};
#define DEF_ALPDANTE_CLKPR_LOC {1,3,1}

static const struct alpx_axcmem_loc ALPDANTE_FPPR_LOC = {1,4,0};
static const struct alpx_axcmem_loc ALPDANTE_ERRTST_LOC = {1,4,3};


static const struct alpx_axcmem_loc ALPDANTE_UBLAZE_VERSION_LOC = {3,1,2};
static const struct alpx_axcmem_loc ALPDANTE_DESIGN_BLOC_VERSION_LOC = {3,1,0};
static const struct alpx_axcmem_loc ALPDANTE_LOW_SERIAL_NUM_LOC = {3,2,0};
static const struct alpx_axcmem_loc ALPDANTE_HIGH_SERIAL_NUM_LOC = {3,3,0};

static const struct alpx_axcmem_loc ALPDANTE_SRConfig_LOC = {0,6,2};
static const struct alpx_axcmem_loc ALPDANTE_Frequency_Measure_LOC = {0,6,0};
#define DEF_ALPDANTE_Frequency_Measure_LOC {0,6,0}

static const struct alpx_axcmem_loc ALPDANTE_Clock_Status_LOC = {0,3,0};
#define DEF_ALPDANTE_Clock_Status_LOC {0,3,0}
static const struct alpx_axcmem_loc ALPDANTE_CLCSR_LOC = {1,1,0};

static const struct alpx_axcmem_loc ALPDANTE_FSDR_LOC = {0,1,1};
static const struct alpx_axcmem_loc ALPDANTE_FCR_LOC = {0,5,3};
static const struct alpx_axcmem_loc ALPDANTE_FCAR_LOC = {0,6,0};
static const struct alpx_axcmem_loc ALPDANTE_SMALAR_LOC = {0,4,0};

static const struct alpx_axcmem_loc ALPDANTE_CNAMPR_LOC = {1,3,3};
static const struct alpx_axcmem_loc ALPDANTE_NAME_LOC = {0,1,0};

static const struct alpx_axcmem_loc ALPDANTE_SAMPLE_COUNT_LOC = {3,0,0};

static const struct alpx_axcmem_loc  ALPDANTE_PROD_TEST_LOC = {1,0,0};


/* NETWORK NAME support */

#define ALPDANTE_NETWORK_NAME_LENGTH 29

/* Controls support */

/* Clk controls support */
#define ALPDANTE_CLK_MANAGER_CONFIG_CLK_SRC_QTY 2
#define ALPDANTE_CLK_MANAGER_SOURCE_INTERNAL 0
#define ALPDANTE_CLK_MANAGER_SOURCE_SIC 1

static const char* alpdante_control_choice_clk_src_entries[ALPDANTE_CLK_MANAGER_CONFIG_CLK_SRC_QTY] __attribute__((unused)) = {
	"Internal", /* Only this one at the moment */
	"SIC"
};

/* Same order than the constants values */
static u32 alpdante_control_choice_clk_src_entries_values[ALPDANTE_CLK_MANAGER_CONFIG_CLK_SRC_QTY] __attribute__((unused)) = {
	ALPDANTE_CLK_MANAGER_SOURCE_INTERNAL, /* Only this one at the moment */
	ALPDANTE_CLK_MANAGER_SOURCE_SIC,
};


#if 0
#define ALPDANTE_CLK_MANAGER_CLK_VALUES_QTY 6
static const char* alpdante_control_choice_current_clk_values_entries[ALPDANTE_CLK_MANAGER_CLK_VALUES_QTY] __attribute__((unused)) = {
	"44.1kHz", "48kHz",
	"88.2kHz", "96kHz",
	"176,4kHz","192kHz"
};
/* Same order than the constant values above */
static u32 alpdante_control_choice_current_clk_values_entries_values[ALPDANTE_CLK_MANAGER_CLK_VALUES_QTY] __attribute__((unused)) = {
ALPDANTE_CLK_MANAGER_CLK_VALUE_44_1K,
ALPDANTE_CLK_MANAGER_CLK_VALUE_48K,

ALPDANTE_CLK_MANAGER_CLK_VALUE_88_2K,
ALPDANTE_CLK_MANAGER_CLK_VALUE_96K,

ALPDANTE_CLK_MANAGER_CLK_VALUE_176_4K,
ALPDANTE_CLK_MANAGER_CLK_VALUE_192K ,
};
#endif

/* Clock source register access */
#define ALPDANTE_Clock_Status_CLK_SRC_MASK GENMASK(2, 2)
#define ALPDANTE_Clock_Status_CLK_SRC_POS 2

#define ALPDANTE_Clock_Status_Sample_Rate_MASK GENMASK(5,7)
#define ALPDANTE_Clock_Status_Sample_Rate_POS 5

static struct alpx_control_descriptor alpdante_control_descriptors[] = {
	/* Clock sources Read Only */
	{
		.type			= ALPX_CONTROL_TYPE_AXCMEM_REL_CHOICE,
		.base			= 0,
		.prefix			= "Clk Eff Src",
		.access			= SNDRV_CTL_ELEM_ACCESS_READ |
								SNDRV_CTL_ELEM_ACCESS_VOLATILE,
		.data.axcmem_rel_choice		= {
			.base_loc = DEF_ALPDANTE_CLKPR_LOC,
			.reg_loc	= DEF_ALPDANTE_Clock_Status_LOC,
			.mask		= ALPDANTE_Clock_Status_CLK_SRC_MASK,
			.pos = ALPDANTE_Clock_Status_CLK_SRC_POS,
			.getter = alpx_axcmem_getRegU8Value_ptr,
			.setter = NULL,
			.entries		= alpdante_control_choice_clk_src_entries,
			.entries_values	= alpdante_control_choice_clk_src_entries_values,
			.entries_count	= ARRAY_SIZE(alpdante_control_choice_clk_src_entries),
		},
	},
	/* Read Measured Frequency Current Value Read Only */
	{
		.type			= ALPX_CONTROL_TYPE_AXCMEM_REL_VALUE,
		.base			= 0,
		.prefix			= "Clk Eff",
		.access			= SNDRV_CTL_ELEM_ACCESS_READ |
								SNDRV_CTL_ELEM_ACCESS_VOLATILE,
		.data.axcmem_rel_value		= {
			.base_loc = DEF_ALPDANTE_CLKPR_LOC,
			.reg_loc	= DEF_ALPDANTE_Frequency_Measure_LOC,
			.mask		= 0xFF,
			.pos = 0,
			.min = 0,
			.max = 192,
			.getter = alpx_axcmem_getRegU8Value_ptr,
			.setter = NULL,
		},
	},
/* Clock Fail over priority 0 TOP : a constant since no failover yet */
	{
		.type			= ALPX_CONTROL_TYPE_CONSTANT,
		.base			= 0,
		.prefix			= "Clk P0",
		.access			= SNDRV_CTL_ELEM_ACCESS_READ,
		.data.constant		= {
			.value = ALPDANTE_CLK_MANAGER_SOURCE_INTERNAL,
		},
	},
};

/* Alp DANTE Variant */
static struct alpx_variant alpx_dante_variant __attribute__((unused)) = {
	.shortname = "AlpDANTE",
	.longname = "Alp DANTE",
	.model			= ALPX_VARIANT_MODEL_ALPDANTE,
	.mixername		= "AlpX-DANTE_Mix",
	.capture_hw = &alpdante_hardware_specs,
	.playback_hw = &alpdante_hardware_specs,
	.gpios = {
	.base = 0,
	.inputs_reg_offset = 0,
	.inputs_qty = 0,
	.outputs_reg_offset = 0,
	.outputs_qty = 0,
	},

	.flash_golden_production_base = ALPxxx_FLASH_GOLDEN_PRODUCTION_BASE,

	.flash_partitions.partitions = NULL,
	.flash_partitions.qty = 0,
	.flash_partitions.qty_for_fw_update = 0,
	.control_descriptors		= alpdante_control_descriptors,
	.control_descriptors_count	= ARRAY_SIZE(alpdante_control_descriptors),
};


#endif /* _ALPX_VARIANTS_DANTE_H_ */