xref: /linux-6.15/include/sound/sdca_function.h (revision f87c2a27)
1 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
2 /*
3  * The MIPI SDCA specification is available for public downloads at
4  * https://www.mipi.org/mipi-sdca-v1-0-download
5  *
6  * Copyright(c) 2024 Intel Corporation
7  */
8 
9 #ifndef __SDCA_FUNCTION_H__
10 #define __SDCA_FUNCTION_H__
11 
12 #include <linux/bits.h>
13 #include <linux/types.h>
14 
15 struct device;
16 struct sdca_function_desc;
17 
18 /*
19  * The addressing space for SDCA relies on 7 bits for Entities, so a
20  * maximum of 128 Entities per function can be represented.
21  */
22 #define SDCA_MAX_ENTITY_COUNT 128
23 
24 /*
25  * Sanity check on number of initialization writes, can be expanded if needed.
26  */
27 #define SDCA_MAX_INIT_COUNT 2048
28 
29 /*
30  * The Cluster IDs are 16-bit, so a maximum of 65535 Clusters per
31  * function can be represented, however limit this to a slightly
32  * more reasonable value. Can be expanded if needed.
33  */
34 #define SDCA_MAX_CLUSTER_COUNT 256
35 
36 /*
37  * Sanity check on number of channels per Cluster, can be expanded if needed.
38  */
39 #define SDCA_MAX_CHANNEL_COUNT 32
40 
41 /**
42  * enum sdca_function_type - SDCA Function Type codes
43  * @SDCA_FUNCTION_TYPE_SMART_AMP: Amplifier with protection features.
44  * @SDCA_FUNCTION_TYPE_SIMPLE_AMP: Subset of SmartAmp.
45  * @SDCA_FUNCTION_TYPE_SMART_MIC: Smart microphone with acoustic triggers.
46  * @SDCA_FUNCTION_TYPE_SIMPLE_MIC: Subset of SmartMic.
47  * @SDCA_FUNCTION_TYPE_SPEAKER_MIC: Combination of SmartMic and SmartAmp.
48  * @SDCA_FUNCTION_TYPE_UAJ: 3.5mm Universal Audio jack.
49  * @SDCA_FUNCTION_TYPE_RJ: Retaskable jack.
50  * @SDCA_FUNCTION_TYPE_SIMPLE_JACK: Subset of UAJ.
51  * @SDCA_FUNCTION_TYPE_HID: Human Interface Device, for e.g. buttons.
52  * @SDCA_FUNCTION_TYPE_IMP_DEF: Implementation-defined function.
53  *
54  * SDCA Function Types from SDCA specification v1.0a Section 5.1.2
55  * all Function types not described are reserved.
56  *
57  * Note that SIMPLE_AMP, SIMPLE_MIC and SIMPLE_JACK Function Types
58  * are NOT defined in SDCA 1.0a, but they were defined in earlier
59  * drafts and are planned for 1.1.
60  */
61 enum sdca_function_type {
62 	SDCA_FUNCTION_TYPE_SMART_AMP			= 0x01,
63 	SDCA_FUNCTION_TYPE_SIMPLE_AMP			= 0x02,
64 	SDCA_FUNCTION_TYPE_SMART_MIC			= 0x03,
65 	SDCA_FUNCTION_TYPE_SIMPLE_MIC			= 0x04,
66 	SDCA_FUNCTION_TYPE_SPEAKER_MIC			= 0x05,
67 	SDCA_FUNCTION_TYPE_UAJ				= 0x06,
68 	SDCA_FUNCTION_TYPE_RJ				= 0x07,
69 	SDCA_FUNCTION_TYPE_SIMPLE_JACK			= 0x08,
70 	SDCA_FUNCTION_TYPE_HID				= 0x0A,
71 	SDCA_FUNCTION_TYPE_IMP_DEF			= 0x1F,
72 };
73 
74 /* Human-readable names used for kernel logs and Function device registration/bind */
75 #define	SDCA_FUNCTION_TYPE_SMART_AMP_NAME		"SmartAmp"
76 #define	SDCA_FUNCTION_TYPE_SIMPLE_AMP_NAME		"SimpleAmp"
77 #define	SDCA_FUNCTION_TYPE_SMART_MIC_NAME		"SmartMic"
78 #define	SDCA_FUNCTION_TYPE_SIMPLE_MIC_NAME		"SimpleMic"
79 #define	SDCA_FUNCTION_TYPE_SPEAKER_MIC_NAME		"SpeakerMic"
80 #define	SDCA_FUNCTION_TYPE_UAJ_NAME			"UAJ"
81 #define	SDCA_FUNCTION_TYPE_RJ_NAME			"RJ"
82 #define	SDCA_FUNCTION_TYPE_SIMPLE_NAME			"SimpleJack"
83 #define	SDCA_FUNCTION_TYPE_HID_NAME			"HID"
84 #define	SDCA_FUNCTION_TYPE_IMP_DEF_NAME			"ImplementationDefined"
85 
86 /**
87  * struct sdca_init_write - a single initialization write
88  * @addr: Register address to be written
89  * @val: Single byte value to be written
90  */
91 struct sdca_init_write {
92 	u32 addr;
93 	u8 val;
94 };
95 
96 /**
97  * define SDCA_CTL_TYPE - create a unique identifier for an SDCA Control
98  * @ent: Entity Type code.
99  * @sel: Control Selector code.
100  *
101  * Sometimes there is a need to identify a type of Control, for example to
102  * determine what name the control should have. SDCA Selectors are reused
103  * across Entity types, as such it is necessary to combine both the Entity
104  * Type and the Control Selector to obtain a unique identifier.
105  */
106 #define SDCA_CTL_TYPE(ent, sel) ((ent) << 8 | (sel))
107 
108 /**
109  * define SDCA_CTL_TYPE_S - static version of SDCA_CTL_TYPE
110  * @ent: Entity name, for example IT, MFPU, etc. this string can be read
111  * from the last characters of the SDCA_ENTITY_TYPE_* macros.
112  * @sel: Control Selector name, for example MIC_BIAS, MUTE, etc. this
113  * string can be read from the last characters of the SDCA_CTL_*_*
114  * macros.
115  *
116  * Short hand to specific a Control type statically for example:
117  * SDAC_CTL_TYPE_S(IT, MIC_BIAS).
118  */
119 #define SDCA_CTL_TYPE_S(ent, sel) SDCA_CTL_TYPE(SDCA_ENTITY_TYPE_##ent, \
120 						SDCA_CTL_##ent##_##sel)
121 
122 /**
123  * enum sdca_it_controls - SDCA Controls for Input Terminal
124  *
125  * Control Selectors for Input Terminal from SDCA specification v1.0
126  * section 6.2.1.3.
127  */
128 enum sdca_it_controls {
129 	SDCA_CTL_IT_MIC_BIAS				= 0x03,
130 	SDCA_CTL_IT_USAGE				= 0x04,
131 	SDCA_CTL_IT_LATENCY				= 0x08,
132 	SDCA_CTL_IT_CLUSTERINDEX			= 0x10,
133 	SDCA_CTL_IT_DATAPORT_SELECTOR			= 0x11,
134 	SDCA_CTL_IT_MATCHING_GUID			= 0x12,
135 	SDCA_CTL_IT_KEEP_ALIVE				= 0x13,
136 	SDCA_CTL_IT_NDAI_STREAM				= 0x14,
137 	SDCA_CTL_IT_NDAI_CATEGORY			= 0x15,
138 	SDCA_CTL_IT_NDAI_CODINGTYPE			= 0x16,
139 	SDCA_CTL_IT_NDAI_PACKETTYPE			= 0x17,
140 };
141 
142 /**
143  * enum sdca_ot_controls - SDCA Controls for Output Terminal
144  *
145  * Control Selectors for Output Terminal from SDCA specification v1.0
146  * section 6.2.2.3.
147  */
148 enum sdca_ot_controls {
149 	SDCA_CTL_OT_USAGE				= 0x04,
150 	SDCA_CTL_OT_LATENCY				= 0x08,
151 	SDCA_CTL_OT_DATAPORT_SELECTOR			= 0x11,
152 	SDCA_CTL_OT_MATCHING_GUID			= 0x12,
153 	SDCA_CTL_OT_KEEP_ALIVE				= 0x13,
154 	SDCA_CTL_OT_NDAI_STREAM				= 0x14,
155 	SDCA_CTL_OT_NDAI_CATEGORY			= 0x15,
156 	SDCA_CTL_OT_NDAI_CODINGTYPE			= 0x16,
157 	SDCA_CTL_OT_NDAI_PACKETTYPE			= 0x17,
158 };
159 
160 /**
161  * enum sdca_mu_controls - SDCA Controls for Mixer Unit
162  *
163  * Control Selectors for Mixer Unit from SDCA specification v1.0
164  * section 6.3.4.2.
165  */
166 enum sdca_mu_controls {
167 	SDCA_CTL_MU_MIXER				= 0x01,
168 	SDCA_CTL_MU_LATENCY				= 0x06,
169 };
170 
171 /**
172  * enum sdca_su_controls - SDCA Controls for Selector Unit
173  *
174  * Control Selectors for Selector Unit from SDCA specification v1.0
175  * section 6.3.8.3.
176  */
177 enum sdca_su_controls {
178 	SDCA_CTL_SU_SELECTOR				= 0x01,
179 	SDCA_CTL_SU_LATENCY				= 0x02,
180 };
181 
182 /**
183  * enum sdca_fu_controls - SDCA Controls for Feature Unit
184  *
185  * Control Selectors for Feature Unit from SDCA specification v1.0
186  * section 6.3.2.3.
187  */
188 enum sdca_fu_controls {
189 	SDCA_CTL_FU_MUTE				= 0x01,
190 	SDCA_CTL_FU_CHANNEL_VOLUME			= 0x02,
191 	SDCA_CTL_FU_AGC					= 0x07,
192 	SDCA_CTL_FU_BASS_BOOST				= 0x09,
193 	SDCA_CTL_FU_LOUDNESS				= 0x0A,
194 	SDCA_CTL_FU_GAIN				= 0x0B,
195 	SDCA_CTL_FU_LATENCY				= 0x10,
196 };
197 
198 /**
199  * enum sdca_xu_controls - SDCA Controls for Extension Unit
200  *
201  * Control Selectors for Extension Unit from SDCA specification v1.0
202  * section 6.3.10.3.
203  */
204 enum sdca_xu_controls {
205 	SDCA_CTL_XU_BYPASS				= 0x01,
206 	SDCA_CTL_XU_LATENCY				= 0x06,
207 	SDCA_CTL_XU_XU_ID				= 0x07,
208 	SDCA_CTL_XU_XU_VERSION				= 0x08,
209 	SDCA_CTL_XU_FDL_CURRENTOWNER			= 0x10,
210 	SDCA_CTL_XU_FDL_MESSAGEOFFSET			= 0x12,
211 	SDCA_CTL_XU_FDL_MESSAGELENGTH			= 0x13,
212 	SDCA_CTL_XU_FDL_STATUS				= 0x14,
213 	SDCA_CTL_XU_FDL_SET_INDEX			= 0x15,
214 	SDCA_CTL_XU_FDL_HOST_REQUEST			= 0x16,
215 };
216 
217 /**
218  * enum sdca_cs_controls - SDCA Controls for Clock Source
219  *
220  * Control Selectors for Clock Source from SDCA specification v1.0
221  * section 6.4.1.3.
222  */
223 enum sdca_cs_controls {
224 	SDCA_CTL_CS_CLOCK_VALID				= 0x02,
225 	SDCA_CTL_CS_SAMPLERATEINDEX			= 0x10,
226 };
227 
228 /**
229  * enum sdca_cx_controls - SDCA Controls for Clock Selector
230  *
231  * Control Selectors for Clock Selector from SDCA specification v1.0
232  * section 6.4.2.3.
233  */
234 enum sdca_cx_controls {
235 	SDCA_CTL_CX_CLOCK_SELECT			= 0x01,
236 };
237 
238 /**
239  * enum sdca_pde_controls - SDCA Controls for Power Domain Entity
240  *
241  * Control Selectors for Power Domain Entity from SDCA specification
242  * v1.0 section 6.5.2.2.
243  */
244 enum sdca_pde_controls {
245 	SDCA_CTL_PDE_REQUESTED_PS			= 0x01,
246 	SDCA_CTL_PDE_ACTUAL_PS				= 0x10,
247 };
248 
249 /**
250  * enum sdca_ge_controls - SDCA Controls for Group Unit
251  *
252  * Control Selectors for Group Unit from SDCA specification v1.0
253  * section 6.5.1.4.
254  */
255 enum sdca_ge_controls {
256 	SDCA_CTL_GE_SELECTED_MODE			= 0x01,
257 	SDCA_CTL_GE_DETECTED_MODE			= 0x02,
258 };
259 
260 /**
261  * enum sdca_spe_controls - SDCA Controls for Security & Privacy Unit
262  *
263  * Control Selectors for Security & Privacy Unit from SDCA
264  * specification v1.0 Section 6.5.3.2.
265  */
266 enum sdca_spe_controls {
267 	SDCA_CTL_SPE_PRIVATE				= 0x01,
268 	SDCA_CTL_SPE_PRIVACY_POLICY			= 0x02,
269 	SDCA_CTL_SPE_PRIVACY_LOCKSTATE			= 0x03,
270 	SDCA_CTL_SPE_PRIVACY_OWNER			= 0x04,
271 	SDCA_CTL_SPE_AUTHTX_CURRENTOWNER		= 0x10,
272 	SDCA_CTL_SPE_AUTHTX_MESSAGEOFFSET		= 0x12,
273 	SDCA_CTL_SPE_AUTHTX_MESSAGELENGTH		= 0x13,
274 	SDCA_CTL_SPE_AUTHRX_CURRENTOWNER		= 0x14,
275 	SDCA_CTL_SPE_AUTHRX_MESSAGEOFFSET		= 0x16,
276 	SDCA_CTL_SPE_AUTHRX_MESSAGELENGTH		= 0x17,
277 };
278 
279 /**
280  * enum sdca_cru_controls - SDCA Controls for Channel Remapping Unit
281  *
282  * Control Selectors for Channel Remapping Unit from SDCA
283  * specification v1.0 Section 6.3.1.3.
284  */
285 enum sdca_cru_controls {
286 	SDCA_CTL_CRU_LATENCY				= 0x06,
287 	SDCA_CTL_CRU_CLUSTERINDEX			= 0x10,
288 };
289 
290 /**
291  * enum sdca_udmpu_controls - SDCA Controls for Up-Down Mixer Processing Unit
292  *
293  * Control Selectors for Up-Down Mixer Processing Unit from SDCA
294  * specification v1.0 Section 6.3.9.3.
295  */
296 enum sdca_udmpu_controls {
297 	SDCA_CTL_UDMPU_LATENCY				= 0x06,
298 	SDCA_CTL_UDMPU_CLUSTERINDEX			= 0x10,
299 	SDCA_CTL_UDMPU_ACOUSTIC_ENERGY_LEVEL_MONITOR	= 0x11,
300 	SDCA_CTL_UDMPU_ULTRASOUND_LOOP_GAIN		= 0x12,
301 	SDCA_CTL_UDMPU_OPAQUESET_0			= 0x18,
302 	SDCA_CTL_UDMPU_OPAQUESET_1			= 0x19,
303 	SDCA_CTL_UDMPU_OPAQUESET_2			= 0x1A,
304 	SDCA_CTL_UDMPU_OPAQUESET_3			= 0x1B,
305 	SDCA_CTL_UDMPU_OPAQUESET_4			= 0x1C,
306 	SDCA_CTL_UDMPU_OPAQUESET_5			= 0x1D,
307 	SDCA_CTL_UDMPU_OPAQUESET_6			= 0x1E,
308 	SDCA_CTL_UDMPU_OPAQUESET_7			= 0x1F,
309 	SDCA_CTL_UDMPU_OPAQUESET_8			= 0x20,
310 	SDCA_CTL_UDMPU_OPAQUESET_9			= 0x21,
311 	SDCA_CTL_UDMPU_OPAQUESET_10			= 0x22,
312 	SDCA_CTL_UDMPU_OPAQUESET_11			= 0x23,
313 	SDCA_CTL_UDMPU_OPAQUESET_12			= 0x24,
314 	SDCA_CTL_UDMPU_OPAQUESET_13			= 0x25,
315 	SDCA_CTL_UDMPU_OPAQUESET_14			= 0x26,
316 	SDCA_CTL_UDMPU_OPAQUESET_15			= 0x27,
317 	SDCA_CTL_UDMPU_OPAQUESET_16			= 0x28,
318 	SDCA_CTL_UDMPU_OPAQUESET_17			= 0x29,
319 	SDCA_CTL_UDMPU_OPAQUESET_18			= 0x2A,
320 	SDCA_CTL_UDMPU_OPAQUESET_19			= 0x2B,
321 	SDCA_CTL_UDMPU_OPAQUESET_20			= 0x2C,
322 	SDCA_CTL_UDMPU_OPAQUESET_21			= 0x2D,
323 	SDCA_CTL_UDMPU_OPAQUESET_22			= 0x2E,
324 	SDCA_CTL_UDMPU_OPAQUESET_23			= 0x2F,
325 };
326 
327 /**
328  * enum sdca_mfpu_controls - SDCA Controls for Multi-Function Processing Unit
329  *
330  * Control Selectors for Multi-Function Processing Unit from SDCA
331  * specification v1.0 Section 6.3.3.4.
332  */
333 enum sdca_mfpu_controls {
334 	SDCA_CTL_MFPU_BYPASS				= 0x01,
335 	SDCA_CTL_MFPU_ALGORITHM_READY			= 0x04,
336 	SDCA_CTL_MFPU_ALGORITHM_ENABLE			= 0x05,
337 	SDCA_CTL_MFPU_LATENCY				= 0x08,
338 	SDCA_CTL_MFPU_ALGORITHM_PREPARE			= 0x09,
339 	SDCA_CTL_MFPU_CLUSTERINDEX			= 0x10,
340 	SDCA_CTL_MFPU_CENTER_FREQUENCY_INDEX		= 0x11,
341 	SDCA_CTL_MFPU_ULTRASOUND_LEVEL			= 0x12,
342 	SDCA_CTL_MFPU_AE_NUMBER				= 0x13,
343 	SDCA_CTL_MFPU_AE_CURRENTOWNER			= 0x14,
344 	SDCA_CTL_MFPU_AE_MESSAGEOFFSET			= 0x16,
345 	SDCA_CTL_MFPU_AE_MESSAGELENGTH			= 0x17,
346 };
347 
348 /**
349  * enum sdca_smpu_controls - SDCA Controls for Smart Mic Processing Unit
350  *
351  * Control Selectors for Smart Mic Processing Unit from SDCA
352  * specification v1.0 Section 6.3.7.3.
353  */
354 enum sdca_smpu_controls {
355 	SDCA_CTL_SMPU_LATENCY				= 0x06,
356 	SDCA_CTL_SMPU_TRIGGER_ENABLE			= 0x10,
357 	SDCA_CTL_SMPU_TRIGGER_STATUS			= 0x11,
358 	SDCA_CTL_SMPU_HIST_BUFFER_MODE			= 0x12,
359 	SDCA_CTL_SMPU_HIST_BUFFER_PREAMBLE		= 0x13,
360 	SDCA_CTL_SMPU_HIST_ERROR			= 0x14,
361 	SDCA_CTL_SMPU_TRIGGER_EXTENSION			= 0x15,
362 	SDCA_CTL_SMPU_TRIGGER_READY			= 0x16,
363 	SDCA_CTL_SMPU_HIST_CURRENTOWNER			= 0x18,
364 	SDCA_CTL_SMPU_HIST_MESSAGEOFFSET		= 0x1A,
365 	SDCA_CTL_SMPU_HIST_MESSAGELENGTH		= 0x1B,
366 	SDCA_CTL_SMPU_DTODTX_CURRENTOWNER		= 0x1C,
367 	SDCA_CTL_SMPU_DTODTX_MESSAGEOFFSET		= 0x1E,
368 	SDCA_CTL_SMPU_DTODTX_MESSAGELENGTH		= 0x1F,
369 	SDCA_CTL_SMPU_DTODRX_CURRENTOWNER		= 0x20,
370 	SDCA_CTL_SMPU_DTODRX_MESSAGEOFFSET		= 0x22,
371 	SDCA_CTL_SMPU_DTODRX_MESSAGELENGTH		= 0x23,
372 };
373 
374 /**
375  * enum sdca_sapu_controls - SDCA Controls for Smart Amp Processing Unit
376  *
377  * Control Selectors for Smart Amp Processing Unit from SDCA
378  * specification v1.0 Section 6.3.6.3.
379  */
380 enum sdca_sapu_controls {
381 	SDCA_CTL_SAPU_LATENCY				= 0x05,
382 	SDCA_CTL_SAPU_PROTECTION_MODE			= 0x10,
383 	SDCA_CTL_SAPU_PROTECTION_STATUS			= 0x11,
384 	SDCA_CTL_SAPU_OPAQUESETREQ_INDEX		= 0x12,
385 	SDCA_CTL_SAPU_DTODTX_CURRENTOWNER		= 0x14,
386 	SDCA_CTL_SAPU_DTODTX_MESSAGEOFFSET		= 0x16,
387 	SDCA_CTL_SAPU_DTODTX_MESSAGELENGTH		= 0x17,
388 	SDCA_CTL_SAPU_DTODRX_CURRENTOWNER		= 0x18,
389 	SDCA_CTL_SAPU_DTODRX_MESSAGEOFFSET		= 0x1A,
390 	SDCA_CTL_SAPU_DTODRX_MESSAGELENGTH		= 0x1B,
391 };
392 
393 /**
394  * enum sdca_ppu_controls - SDCA Controls for Post Processing Unit
395  *
396  * Control Selectors for Post Processing Unit from SDCA specification
397  * v1.0 Section 6.3.5.3.
398  */
399 enum sdca_ppu_controls {
400 	SDCA_CTL_PPU_LATENCY				= 0x06,
401 	SDCA_CTL_PPU_POSTURENUMBER			= 0x10,
402 	SDCA_CTL_PPU_POSTUREEXTENSION			= 0x11,
403 	SDCA_CTL_PPU_HORIZONTALBALANCE			= 0x12,
404 	SDCA_CTL_PPU_VERTICALBALANCE			= 0x13,
405 };
406 
407 /**
408  * enum sdca_tg_controls - SDCA Controls for Tone Generator Entity
409  *
410  * Control Selectors for Tone Generator from SDCA specification v1.0
411  * Section 6.5.4.4.
412  */
413 enum sdca_tg_controls {
414 	SDCA_CTL_TG_TONE_DIVIDER			= 0x10,
415 };
416 
417 /**
418  * enum sdca_hide_controls - SDCA Controls for HIDE Entity
419  *
420  * Control Selectors for HIDE from SDCA specification v1.0 Section
421  * 6.6.1.2.
422  */
423 enum sdca_hide_controls {
424 	SDCA_CTL_HIDE_HIDTX_CURRENTOWNER		= 0x10,
425 	SDCA_CTL_HIDE_HIDTX_MESSAGEOFFSET		= 0x12,
426 	SDCA_CTL_HIDE_HIDTX_MESSAGELENGTH		= 0x13,
427 	SDCA_CTL_HIDE_HIDRX_CURRENTOWNER		= 0x14,
428 	SDCA_CTL_HIDE_HIDRX_MESSAGEOFFSET		= 0x16,
429 	SDCA_CTL_HIDE_HIDRX_MESSAGELENGTH		= 0x17,
430 };
431 
432 /**
433  * enum sdca_entity0_controls - SDCA Controls for Entity 0
434  *
435  * Control Selectors for Entity 0 from SDCA specification v1.0 Section
436  * 6.7.1.1.
437  */
438 enum sdca_entity0_controls {
439 	SDCA_CTL_ENTITY_0_COMMIT_GROUP_MASK		= 0x01,
440 	SDCA_CTL_ENTITY_0_FUNCTION_SDCA_VERSION		= 0x04,
441 	SDCA_CTL_ENTITY_0_FUNCTION_TYPE			= 0x05,
442 	SDCA_CTL_ENTITY_0_FUNCTION_MANUFACTURER_ID	= 0x06,
443 	SDCA_CTL_ENTITY_0_FUNCTION_ID			= 0x07,
444 	SDCA_CTL_ENTITY_0_FUNCTION_VERSION		= 0x08,
445 	SDCA_CTL_ENTITY_0_FUNCTION_EXTENSION_ID		= 0x09,
446 	SDCA_CTL_ENTITY_0_FUNCTION_EXTENSION_VERSION	= 0x0A,
447 	SDCA_CTL_ENTITY_0_FUNCTION_STATUS		= 0x10,
448 	SDCA_CTL_ENTITY_0_FUNCTION_ACTION		= 0x11,
449 	SDCA_CTL_ENTITY_0_MATCHING_GUID			= 0x12,
450 	SDCA_CTL_ENTITY_0_DEVICE_MANUFACTURER_ID	= 0x2C,
451 	SDCA_CTL_ENTITY_0_DEVICE_PART_ID		= 0x2D,
452 	SDCA_CTL_ENTITY_0_DEVICE_VERSION		= 0x2E,
453 	SDCA_CTL_ENTITY_0_DEVICE_SDCA_VERSION		= 0x2F,
454 
455 	/* Function Status Bits */
456 	SDCA_CTL_ENTITY_0_DEVICE_NEWLY_ATTACHED		= BIT(0),
457 	SDCA_CTL_ENTITY_0_INTS_DISABLED_ABNORMALLY	= BIT(1),
458 	SDCA_CTL_ENTITY_0_STREAMING_STOPPED_ABNORMALLY	= BIT(2),
459 	SDCA_CTL_ENTITY_0_FUNCTION_FAULT		= BIT(3),
460 	SDCA_CTL_ENTITY_0_UMP_SEQUENCE_FAULT		= BIT(4),
461 	SDCA_CTL_ENTITY_0_FUNCTION_NEEDS_INITIALIZATION	= BIT(5),
462 	SDCA_CTL_ENTITY_0_FUNCTION_HAS_BEEN_RESET	= BIT(6),
463 	SDCA_CTL_ENTITY_0_FUNCTION_BUSY			= BIT(7),
464 };
465 
466 #define SDCA_CTL_MIC_BIAS_NAME				"Mic Bias"
467 #define SDCA_CTL_USAGE_NAME				"Usage"
468 #define SDCA_CTL_LATENCY_NAME				"Latency"
469 #define SDCA_CTL_CLUSTERINDEX_NAME			"Cluster Index"
470 #define SDCA_CTL_DATAPORT_SELECTOR_NAME			"Dataport Selector"
471 #define SDCA_CTL_MATCHING_GUID_NAME			"Matching GUID"
472 #define SDCA_CTL_KEEP_ALIVE_NAME			"Keep Alive"
473 #define SDCA_CTL_NDAI_STREAM_NAME			"NDAI Stream"
474 #define SDCA_CTL_NDAI_CATEGORY_NAME			"NDAI Category"
475 #define SDCA_CTL_NDAI_CODINGTYPE_NAME			"NDAI Coding Type"
476 #define SDCA_CTL_NDAI_PACKETTYPE_NAME			"NDAI Packet Type"
477 #define SDCA_CTL_MIXER_NAME				"Mixer"
478 #define SDCA_CTL_SELECTOR_NAME				"Selector"
479 #define SDCA_CTL_MUTE_NAME				"Mute"
480 #define SDCA_CTL_CHANNEL_VOLUME_NAME			"Channel Volume"
481 #define SDCA_CTL_AGC_NAME				"AGC"
482 #define SDCA_CTL_BASS_BOOST_NAME			"Bass Boost"
483 #define SDCA_CTL_LOUDNESS_NAME				"Loudness"
484 #define SDCA_CTL_GAIN_NAME				"Gain"
485 #define SDCA_CTL_BYPASS_NAME				"Bypass"
486 #define SDCA_CTL_XU_ID_NAME				"XU ID"
487 #define SDCA_CTL_XU_VERSION_NAME			"XU Version"
488 #define SDCA_CTL_FDL_CURRENTOWNER_NAME			"FDL Current Owner"
489 #define SDCA_CTL_FDL_MESSAGEOFFSET_NAME			"FDL Message Offset"
490 #define SDCA_CTL_FDL_MESSAGELENGTH_NAME			"FDL Message Length"
491 #define SDCA_CTL_FDL_STATUS_NAME			"FDL Status"
492 #define SDCA_CTL_FDL_SET_INDEX_NAME			"FDL Set Index"
493 #define SDCA_CTL_FDL_HOST_REQUEST_NAME			"FDL Host Request"
494 #define SDCA_CTL_CLOCK_VALID_NAME			"Clock Valid"
495 #define SDCA_CTL_SAMPLERATEINDEX_NAME			"Sample Rate Index"
496 #define SDCA_CTL_CLOCK_SELECT_NAME			"Clock Select"
497 #define SDCA_CTL_REQUESTED_PS_NAME			"Requested PS"
498 #define SDCA_CTL_ACTUAL_PS_NAME				"Actual PS"
499 #define SDCA_CTL_SELECTED_MODE_NAME			"Selected Mode"
500 #define SDCA_CTL_DETECTED_MODE_NAME			"Detected Mode"
501 #define SDCA_CTL_PRIVATE_NAME				"Private"
502 #define SDCA_CTL_PRIVACY_POLICY_NAME			"Privacy Policy"
503 #define SDCA_CTL_PRIVACY_LOCKSTATE_NAME			"Privacy Lockstate"
504 #define SDCA_CTL_PRIVACY_OWNER_NAME			"Privacy Owner"
505 #define SDCA_CTL_AUTHTX_CURRENTOWNER_NAME		"AuthTX Current Owner"
506 #define SDCA_CTL_AUTHTX_MESSAGEOFFSET_NAME		"AuthTX Message Offset"
507 #define SDCA_CTL_AUTHTX_MESSAGELENGTH_NAME		"AuthTX Message Length"
508 #define SDCA_CTL_AUTHRX_CURRENTOWNER_NAME		"AuthRX Current Owner"
509 #define SDCA_CTL_AUTHRX_MESSAGEOFFSET_NAME		"AuthRX Message Offset"
510 #define SDCA_CTL_AUTHRX_MESSAGELENGTH_NAME		"AuthRX Message Length"
511 #define SDCA_CTL_ACOUSTIC_ENERGY_LEVEL_MONITOR_NAME	"Acoustic Energy Level Monitor"
512 #define SDCA_CTL_ULTRASOUND_LOOP_GAIN_NAME		"Ultrasound Loop Gain"
513 #define SDCA_CTL_OPAQUESET_0_NAME			"Opaqueset 0"
514 #define SDCA_CTL_OPAQUESET_1_NAME			"Opaqueset 1"
515 #define SDCA_CTL_OPAQUESET_2_NAME			"Opaqueset 2"
516 #define SDCA_CTL_OPAQUESET_3_NAME			"Opaqueset 3"
517 #define SDCA_CTL_OPAQUESET_4_NAME			"Opaqueset 4"
518 #define SDCA_CTL_OPAQUESET_5_NAME			"Opaqueset 5"
519 #define SDCA_CTL_OPAQUESET_6_NAME			"Opaqueset 6"
520 #define SDCA_CTL_OPAQUESET_7_NAME			"Opaqueset 7"
521 #define SDCA_CTL_OPAQUESET_8_NAME			"Opaqueset 8"
522 #define SDCA_CTL_OPAQUESET_9_NAME			"Opaqueset 9"
523 #define SDCA_CTL_OPAQUESET_10_NAME			"Opaqueset 10"
524 #define SDCA_CTL_OPAQUESET_11_NAME			"Opaqueset 11"
525 #define SDCA_CTL_OPAQUESET_12_NAME			"Opaqueset 12"
526 #define SDCA_CTL_OPAQUESET_13_NAME			"Opaqueset 13"
527 #define SDCA_CTL_OPAQUESET_14_NAME			"Opaqueset 14"
528 #define SDCA_CTL_OPAQUESET_15_NAME			"Opaqueset 15"
529 #define SDCA_CTL_OPAQUESET_16_NAME			"Opaqueset 16"
530 #define SDCA_CTL_OPAQUESET_17_NAME			"Opaqueset 17"
531 #define SDCA_CTL_OPAQUESET_18_NAME			"Opaqueset 18"
532 #define SDCA_CTL_OPAQUESET_19_NAME			"Opaqueset 19"
533 #define SDCA_CTL_OPAQUESET_20_NAME			"Opaqueset 20"
534 #define SDCA_CTL_OPAQUESET_21_NAME			"Opaqueset 21"
535 #define SDCA_CTL_OPAQUESET_22_NAME			"Opaqueset 22"
536 #define SDCA_CTL_OPAQUESET_23_NAME			"Opaqueset 23"
537 #define SDCA_CTL_ALGORITHM_READY_NAME			"Algorithm Ready"
538 #define SDCA_CTL_ALGORITHM_ENABLE_NAME			"Algorithm Enable"
539 #define SDCA_CTL_ALGORITHM_PREPARE_NAME			"Algorithm Prepare"
540 #define SDCA_CTL_CENTER_FREQUENCY_INDEX_NAME		"Center Frequency Index"
541 #define SDCA_CTL_ULTRASOUND_LEVEL_NAME			"Ultrasound Level"
542 #define SDCA_CTL_AE_NUMBER_NAME				"AE Number"
543 #define SDCA_CTL_AE_CURRENTOWNER_NAME			"AE Current Owner"
544 #define SDCA_CTL_AE_MESSAGEOFFSET_NAME			"AE Message Offset"
545 #define SDCA_CTL_AE_MESSAGELENGTH_NAME			"AE Message Length"
546 #define SDCA_CTL_TRIGGER_ENABLE_NAME			"Trigger Enable"
547 #define SDCA_CTL_TRIGGER_STATUS_NAME			"Trigger Status"
548 #define SDCA_CTL_HIST_BUFFER_MODE_NAME			"Hist Buffer Mode"
549 #define SDCA_CTL_HIST_BUFFER_PREAMBLE_NAME		"Hist Buffer Preamble"
550 #define SDCA_CTL_HIST_ERROR_NAME			"Hist Error"
551 #define SDCA_CTL_TRIGGER_EXTENSION_NAME			"Trigger Extension"
552 #define SDCA_CTL_TRIGGER_READY_NAME			"Trigger Ready"
553 #define SDCA_CTL_HIST_CURRENTOWNER_NAME			"Hist Current Owner"
554 #define SDCA_CTL_HIST_MESSAGEOFFSET_NAME		"Hist Message Offset"
555 #define SDCA_CTL_HIST_MESSAGELENGTH_NAME		"Hist Message Length"
556 #define SDCA_CTL_DTODTX_CURRENTOWNER_NAME		"DTODTX Current Owner"
557 #define SDCA_CTL_DTODTX_MESSAGEOFFSET_NAME		"DTODTX Message Offset"
558 #define SDCA_CTL_DTODTX_MESSAGELENGTH_NAME		"DTODTX Message Length"
559 #define SDCA_CTL_DTODRX_CURRENTOWNER_NAME		"DTODRX Current Owner"
560 #define SDCA_CTL_DTODRX_MESSAGEOFFSET_NAME		"DTODRX Message Offset"
561 #define SDCA_CTL_DTODRX_MESSAGELENGTH_NAME		"DTODRX Message Length"
562 #define SDCA_CTL_PROTECTION_MODE_NAME			"Protection Mode"
563 #define SDCA_CTL_PROTECTION_STATUS_NAME			"Protection Status"
564 #define SDCA_CTL_OPAQUESETREQ_INDEX_NAME		"Opaqueset Req Index"
565 #define SDCA_CTL_DTODTX_CURRENTOWNER_NAME		"DTODTX Current Owner"
566 #define SDCA_CTL_DTODTX_MESSAGEOFFSET_NAME		"DTODTX Message Offset"
567 #define SDCA_CTL_DTODTX_MESSAGELENGTH_NAME		"DTODTX Message Length"
568 #define SDCA_CTL_DTODRX_CURRENTOWNER_NAME		"DTODRX Current Owner"
569 #define SDCA_CTL_DTODRX_MESSAGEOFFSET_NAME		"DTODRX Message Offset"
570 #define SDCA_CTL_DTODRX_MESSAGELENGTH_NAME		"DTODRX Message Length"
571 #define SDCA_CTL_POSTURENUMBER_NAME			"Posture Number"
572 #define SDCA_CTL_POSTUREEXTENSION_NAME			"Posture Extension"
573 #define SDCA_CTL_HORIZONTALBALANCE_NAME			"Horizontal Balance"
574 #define SDCA_CTL_VERTICALBALANCE_NAME			"Vertical Balance"
575 #define SDCA_CTL_TONE_DIVIDER_NAME			"Tone Divider"
576 #define SDCA_CTL_HIDTX_CURRENTOWNER_NAME		"HIDTX Current Owner"
577 #define SDCA_CTL_HIDTX_MESSAGEOFFSET_NAME		"HIDTX Message Offset"
578 #define SDCA_CTL_HIDTX_MESSAGELENGTH_NAME		"HIDTX Message Length"
579 #define SDCA_CTL_HIDRX_CURRENTOWNER_NAME		"HIDRX Current Owner"
580 #define SDCA_CTL_HIDRX_MESSAGEOFFSET_NAME		"HIDRX Message Offset"
581 #define SDCA_CTL_HIDRX_MESSAGELENGTH_NAME		"HIDRX Message Length"
582 #define SDCA_CTL_COMMIT_GROUP_MASK_NAME			"Commit Group Mask"
583 #define SDCA_CTL_FUNCTION_SDCA_VERSION_NAME		"Function SDCA Version"
584 #define SDCA_CTL_FUNCTION_TYPE_NAME			"Function Type"
585 #define SDCA_CTL_FUNCTION_MANUFACTURER_ID_NAME		"Function Manufacturer ID"
586 #define SDCA_CTL_FUNCTION_ID_NAME			"Function ID"
587 #define SDCA_CTL_FUNCTION_VERSION_NAME			"Function Version"
588 #define SDCA_CTL_FUNCTION_EXTENSION_ID_NAME		"Function Extension ID"
589 #define SDCA_CTL_FUNCTION_EXTENSION_VERSION_NAME	"Function Extension Version"
590 #define SDCA_CTL_FUNCTION_STATUS_NAME			"Function Status"
591 #define SDCA_CTL_FUNCTION_ACTION_NAME			"Function Action"
592 #define SDCA_CTL_DEVICE_MANUFACTURER_ID_NAME		"Device Manufacturer ID"
593 #define SDCA_CTL_DEVICE_PART_ID_NAME			"Device Part ID"
594 #define SDCA_CTL_DEVICE_VERSION_NAME			"Device Version"
595 #define SDCA_CTL_DEVICE_SDCA_VERSION_NAME		"Device SDCA Version"
596 
597 /**
598  * enum sdca_access_mode - SDCA Control access mode
599  *
600  * Access modes as described in the SDCA specification v1.0 section
601  * 7.1.8.2.
602  */
603 enum sdca_access_mode {
604 	SDCA_ACCESS_MODE_RW				= 0x0,
605 	SDCA_ACCESS_MODE_DUAL				= 0x1,
606 	SDCA_ACCESS_MODE_RW1C				= 0x2,
607 	SDCA_ACCESS_MODE_RO				= 0x3,
608 	SDCA_ACCESS_MODE_RW1S				= 0x4,
609 	SDCA_ACCESS_MODE_DC				= 0x5,
610 };
611 
612 /**
613  * enum sdca_access_layer - SDCA Control access layer
614  *
615  * Access layers as described in the SDCA specification v1.0 section
616  * 7.1.9.
617  */
618 enum sdca_access_layer {
619 	SDCA_ACCESS_LAYER_USER				= 1 << 0,
620 	SDCA_ACCESS_LAYER_APPLICATION			= 1 << 1,
621 	SDCA_ACCESS_LAYER_CLASS				= 1 << 2,
622 	SDCA_ACCESS_LAYER_PLATFORM			= 1 << 3,
623 	SDCA_ACCESS_LAYER_DEVICE			= 1 << 4,
624 	SDCA_ACCESS_LAYER_EXTENSION			= 1 << 5,
625 };
626 
627 /**
628  * struct sdca_control_range - SDCA Control range table
629  * @cols: Number of columns in the range table.
630  * @rows: Number of rows in the range table.
631  * @data: Array of values contained in the range table.
632  */
633 struct sdca_control_range {
634 	unsigned int cols;
635 	unsigned int rows;
636 	u32 *data;
637 };
638 
639 /**
640  * struct sdca_control - information for one SDCA Control
641  * @label: Name for the Control, from SDCA Specification v1.0, section 7.1.7.
642  * @sel: Identifier used for addressing.
643  * @value: Holds the Control value for constants and defaults.
644  * @nbits: Number of bits used in the Control.
645  * @interrupt_position: SCDA interrupt line that will alert to changes on this
646  * Control.
647  * @cn_list: A bitmask showing the valid Control Numbers within this Control,
648  * Control Numbers typically represent channels.
649  * @range: Buffer describing valid range of values for the Control.
650  * @mode: Access mode of the Control.
651  * @layers: Bitmask of access layers of the Control.
652  * @deferrable: Indicates if the access to the Control can be deferred.
653  * @has_default: Indicates the Control has a default value to be written.
654  * @has_fixed: Indicates the Control only supports a single value.
655  */
656 struct sdca_control {
657 	const char *label;
658 	int sel;
659 
660 	int value;
661 	int nbits;
662 	int interrupt_position;
663 	u64 cn_list;
664 
665 	struct sdca_control_range range;
666 	enum sdca_access_mode mode;
667 	u8 layers;
668 
669 	bool deferrable;
670 	bool has_default;
671 	bool has_fixed;
672 };
673 
674 /**
675  * enum sdca_entity_type - SDCA Entity Type codes
676  * @SDCA_ENTITY_TYPE_ENTITY_0: Entity 0, not actually from the
677  * specification but useful internally as an Entity structure
678  * is allocated for Entity 0, to hold Entity 0 controls.
679  * @SDCA_ENTITY_TYPE_IT: Input Terminal.
680  * @SDCA_ENTITY_TYPE_OT: Output Terminal.
681  * @SDCA_ENTITY_TYPE_MU: Mixer Unit.
682  * @SDCA_ENTITY_TYPE_SU: Selector Unit.
683  * @SDCA_ENTITY_TYPE_FU: Feature Unit.
684  * @SDCA_ENTITY_TYPE_XU: Extension Unit.
685  * @SDCA_ENTITY_TYPE_CS: Clock Source.
686  * @SDCA_ENTITY_TYPE_CX: Clock selector.
687  * @SDCA_ENTITY_TYPE_PDE: Power-Domain Entity.
688  * @SDCA_ENTITY_TYPE_GE: Group Entity.
689  * @SDCA_ENTITY_TYPE_SPE: Security & Privacy Entity.
690  * @SDCA_ENTITY_TYPE_CRU: Channel Remapping Unit.
691  * @SDCA_ENTITY_TYPE_UDMPU: Up-Down Mixer Processing Unit.
692  * @SDCA_ENTITY_TYPE_MFPU: Multi-Function Processing Unit.
693  * @SDCA_ENTITY_TYPE_SMPU: Smart Microphone Processing Unit.
694  * @SDCA_ENTITY_TYPE_SAPU: Smart Amp Processing Unit.
695  * @SDCA_ENTITY_TYPE_PPU: Posture Processing Unit.
696  * @SDCA_ENTITY_TYPE_TG: Tone Generator.
697  * @SDCA_ENTITY_TYPE_HIDE: Human Interface Device Entity.
698  *
699  * SDCA Entity Types from SDCA specification v1.0 Section 6.1.2
700  * all Entity Types not described are reserved.
701  */
702 enum sdca_entity_type {
703 	SDCA_ENTITY_TYPE_ENTITY_0			= 0x00,
704 	SDCA_ENTITY_TYPE_IT				= 0x02,
705 	SDCA_ENTITY_TYPE_OT				= 0x03,
706 	SDCA_ENTITY_TYPE_MU				= 0x05,
707 	SDCA_ENTITY_TYPE_SU				= 0x06,
708 	SDCA_ENTITY_TYPE_FU				= 0x07,
709 	SDCA_ENTITY_TYPE_XU				= 0x0A,
710 	SDCA_ENTITY_TYPE_CS				= 0x0B,
711 	SDCA_ENTITY_TYPE_CX				= 0x0C,
712 	SDCA_ENTITY_TYPE_PDE				= 0x11,
713 	SDCA_ENTITY_TYPE_GE				= 0x12,
714 	SDCA_ENTITY_TYPE_SPE				= 0x13,
715 	SDCA_ENTITY_TYPE_CRU				= 0x20,
716 	SDCA_ENTITY_TYPE_UDMPU				= 0x21,
717 	SDCA_ENTITY_TYPE_MFPU				= 0x22,
718 	SDCA_ENTITY_TYPE_SMPU				= 0x23,
719 	SDCA_ENTITY_TYPE_SAPU				= 0x24,
720 	SDCA_ENTITY_TYPE_PPU				= 0x25,
721 	SDCA_ENTITY_TYPE_TG				= 0x30,
722 	SDCA_ENTITY_TYPE_HIDE				= 0x31,
723 };
724 
725 /**
726  * struct sdca_entity - information for one SDCA Entity
727  * @label: String such as "OT 12".
728  * @id: Identifier used for addressing.
729  * @type: Type code for the Entity.
730  * @sources: Dynamically allocated array pointing to each input Entity
731  * connected to this Entity.
732  * @controls: Dynamically allocated array of Controls.
733  * @num_sources: Number of sources for the Entity.
734  * @num_controls: Number of Controls for the Entity.
735  */
736 struct sdca_entity {
737 	const char *label;
738 	int id;
739 	enum sdca_entity_type type;
740 
741 	struct sdca_entity **sources;
742 	struct sdca_control *controls;
743 	int num_sources;
744 	int num_controls;
745 };
746 
747 /**
748  * enum sdca_channel_purpose - SDCA Channel Purpose code
749  *
750  * Channel Purpose codes as described in the SDCA specification v1.0
751  * section 11.4.3.
752  */
753 enum sdca_channel_purpose {
754 	/* Table 210 - Purpose */
755 	SDCA_CHAN_PURPOSE_GENERIC_AUDIO			= 0x01,
756 	SDCA_CHAN_PURPOSE_VOICE				= 0x02,
757 	SDCA_CHAN_PURPOSE_SPEECH			= 0x03,
758 	SDCA_CHAN_PURPOSE_AMBIENT			= 0x04,
759 	SDCA_CHAN_PURPOSE_REFERENCE			= 0x05,
760 	SDCA_CHAN_PURPOSE_ULTRASOUND			= 0x06,
761 	SDCA_CHAN_PURPOSE_SENSE				= 0x08,
762 	SDCA_CHAN_PURPOSE_SILENCE			= 0xFE,
763 	SDCA_CHAN_PURPOSE_NON_AUDIO			= 0xFF,
764 	/* Table 211 - Amp Sense */
765 	SDCA_CHAN_PURPOSE_SENSE_V1			= 0x09,
766 	SDCA_CHAN_PURPOSE_SENSE_V2			= 0x0A,
767 	SDCA_CHAN_PURPOSE_SENSE_V12_INTERLEAVED		= 0x10,
768 	SDCA_CHAN_PURPOSE_SENSE_V21_INTERLEAVED		= 0x11,
769 	SDCA_CHAN_PURPOSE_SENSE_V12_PACKED		= 0x12,
770 	SDCA_CHAN_PURPOSE_SENSE_V21_PACKED		= 0x13,
771 	SDCA_CHAN_PURPOSE_SENSE_V1212_INTERLEAVED	= 0x14,
772 	SDCA_CHAN_PURPOSE_SENSE_V2121_INTERLEAVED	= 0x15,
773 	SDCA_CHAN_PURPOSE_SENSE_V1122_INTERLEAVED	= 0x16,
774 	SDCA_CHAN_PURPOSE_SENSE_V2211_INTERLEAVED	= 0x17,
775 	SDCA_CHAN_PURPOSE_SENSE_V1212_PACKED		= 0x18,
776 	SDCA_CHAN_PURPOSE_SENSE_V2121_PACKED		= 0x19,
777 	SDCA_CHAN_PURPOSE_SENSE_V1122_PACKED		= 0x1A,
778 	SDCA_CHAN_PURPOSE_SENSE_V2211_PACKED		= 0x1B,
779 };
780 
781 /**
782  * enum sdca_channel_relationship - SDCA Channel Relationship code
783  *
784  * Channel Relationship codes as described in the SDCA specification
785  * v1.0 section 11.4.2.
786  */
787 enum sdca_channel_relationship {
788 	/* Table 206 - Streaming */
789 	SDCA_CHAN_REL_UNDEFINED				= 0x00,
790 	SDCA_CHAN_REL_GENERIC_MONO			= 0x01,
791 	SDCA_CHAN_REL_GENERIC_LEFT			= 0x02,
792 	SDCA_CHAN_REL_GENERIC_RIGHT			= 0x03,
793 	SDCA_CHAN_REL_GENERIC_TOP			= 0x48,
794 	SDCA_CHAN_REL_GENERIC_BOTTOM			= 0x49,
795 	SDCA_CHAN_REL_CAPTURE_DIRECT			= 0x4E,
796 	SDCA_CHAN_REL_RENDER_DIRECT			= 0x4F,
797 	SDCA_CHAN_REL_FRONT_LEFT			= 0x0B,
798 	SDCA_CHAN_REL_FRONT_RIGHT			= 0x0C,
799 	SDCA_CHAN_REL_FRONT_CENTER			= 0x0D,
800 	SDCA_CHAN_REL_SIDE_LEFT				= 0x12,
801 	SDCA_CHAN_REL_SIDE_RIGHT			= 0x13,
802 	SDCA_CHAN_REL_BACK_LEFT				= 0x16,
803 	SDCA_CHAN_REL_BACK_RIGHT			= 0x17,
804 	SDCA_CHAN_REL_LOW_FREQUENCY_EFFECTS		= 0x43,
805 	SDCA_CHAN_REL_SOUNDWIRE_MIC			= 0x55,
806 	SDCA_CHAN_REL_SENSE_TRANSDUCER_1		= 0x58,
807 	SDCA_CHAN_REL_SENSE_TRANSDUCER_2		= 0x59,
808 	SDCA_CHAN_REL_SENSE_TRANSDUCER_12		= 0x5A,
809 	SDCA_CHAN_REL_SENSE_TRANSDUCER_21		= 0x5B,
810 	SDCA_CHAN_REL_ECHOREF_NONE			= 0x70,
811 	SDCA_CHAN_REL_ECHOREF_1				= 0x71,
812 	SDCA_CHAN_REL_ECHOREF_2				= 0x72,
813 	SDCA_CHAN_REL_ECHOREF_3				= 0x73,
814 	SDCA_CHAN_REL_ECHOREF_4				= 0x74,
815 	SDCA_CHAN_REL_ECHOREF_ALL			= 0x75,
816 	SDCA_CHAN_REL_ECHOREF_LFE_ALL			= 0x76,
817 	/* Table 207 - Speaker */
818 	SDCA_CHAN_REL_PRIMARY_TRANSDUCER		= 0x50,
819 	SDCA_CHAN_REL_SECONDARY_TRANSDUCER		= 0x51,
820 	SDCA_CHAN_REL_TERTIARY_TRANSDUCER		= 0x52,
821 	SDCA_CHAN_REL_LOWER_LEFT_ALLTRANSDUCER		= 0x60,
822 	SDCA_CHAN_REL_LOWER_RIGHT_ALLTRANSDUCER		= 0x61,
823 	SDCA_CHAN_REL_UPPER_LEFT_ALLTRANSDUCER		= 0x62,
824 	SDCA_CHAN_REL_UPPER_RIGHT_ALLTRANSDUCER		= 0x63,
825 	SDCA_CHAN_REL_LOWER_LEFT_PRIMARY		= 0x64,
826 	SDCA_CHAN_REL_LOWER_RIGHT_PRIMARY		= 0x65,
827 	SDCA_CHAN_REL_UPPER_LEFT_PRIMARY		= 0x66,
828 	SDCA_CHAN_REL_UPPER_RIGHT_PRIMARY		= 0x67,
829 	SDCA_CHAN_REL_LOWER_LEFT_SECONDARY		= 0x68,
830 	SDCA_CHAN_REL_LOWER_RIGHT_SECONDARY		= 0x69,
831 	SDCA_CHAN_REL_UPPER_LEFT_SECONDARY		= 0x6A,
832 	SDCA_CHAN_REL_UPPER_RIGHT_SECONDARY		= 0x6B,
833 	SDCA_CHAN_REL_LOWER_LEFT_TERTIARY		= 0x6C,
834 	SDCA_CHAN_REL_LOWER_RIGHT_TERTIARY		= 0x6D,
835 	SDCA_CHAN_REL_UPPER_LEFT_TERTIARY		= 0x6E,
836 	SDCA_CHAN_REL_UPPER_RIGHT_TERTIARY		= 0x6F,
837 	SDCA_CHAN_REL_DERIVED_LOWER_LEFT_PRIMARY	= 0x94,
838 	SDCA_CHAN_REL_DERIVED_LOWER_RIGHT_PRIMARY	= 0x95,
839 	SDCA_CHAN_REL_DERIVED_UPPER_LEFT_PRIMARY	= 0x96,
840 	SDCA_CHAN_REL_DERIVED_UPPER_RIGHT_PRIMARY	= 0x97,
841 	SDCA_CHAN_REL_DERIVED_LOWER_LEFT_SECONDARY	= 0x98,
842 	SDCA_CHAN_REL_DERIVED_LOWER_RIGHT_SECONDARY	= 0x99,
843 	SDCA_CHAN_REL_DERIVED_UPPER_LEFT_SECONDARY	= 0x9A,
844 	SDCA_CHAN_REL_DERIVED_UPPER_RIGHT_SECONDARY	= 0x9B,
845 	SDCA_CHAN_REL_DERIVED_LOWER_LEFT_TERTIARY	= 0x9C,
846 	SDCA_CHAN_REL_DERIVED_LOWER_RIGHT_TERTIARY	= 0x9D,
847 	SDCA_CHAN_REL_DERIVED_UPPER_LEFT_TERTIARY	= 0x9E,
848 	SDCA_CHAN_REL_DERIVED_UPPER_RIGHT_TERTIARY	= 0x9F,
849 	SDCA_CHAN_REL_DERIVED_MONO_PRIMARY		= 0xA0,
850 	SDCA_CHAN_REL_DERIVED_MONO_SECONDARY		= 0xAB,
851 	SDCA_CHAN_REL_DERIVED_MONO_TERTIARY		= 0xAC,
852 	/* Table 208 - Equipment */
853 	SDCA_CHAN_REL_EQUIPMENT_LEFT			= 0x02,
854 	SDCA_CHAN_REL_EQUIPMENT_RIGHT			= 0x03,
855 	SDCA_CHAN_REL_EQUIPMENT_COMBINED		= 0x47,
856 	SDCA_CHAN_REL_EQUIPMENT_TOP			= 0x48,
857 	SDCA_CHAN_REL_EQUIPMENT_BOTTOM			= 0x49,
858 	SDCA_CHAN_REL_EQUIPMENT_TOP_LEFT		= 0x4A,
859 	SDCA_CHAN_REL_EQUIPMENT_BOTTOM_LEFT		= 0x4B,
860 	SDCA_CHAN_REL_EQUIPMENT_TOP_RIGHT		= 0x4C,
861 	SDCA_CHAN_REL_EQUIPMENT_BOTTOM_RIGHT		= 0x4D,
862 	SDCA_CHAN_REL_EQUIPMENT_SILENCED_OUTPUT		= 0x57,
863 	/* Table 209 - Other */
864 	SDCA_CHAN_REL_ARRAY				= 0x04,
865 	SDCA_CHAN_REL_MIC				= 0x53,
866 	SDCA_CHAN_REL_RAW				= 0x54,
867 	SDCA_CHAN_REL_SILENCED_MIC			= 0x56,
868 	SDCA_CHAN_REL_MULTI_SOURCE_1			= 0x78,
869 	SDCA_CHAN_REL_MULTI_SOURCE_2			= 0x79,
870 	SDCA_CHAN_REL_MULTI_SOURCE_3			= 0x7A,
871 	SDCA_CHAN_REL_MULTI_SOURCE_4			= 0x7B,
872 };
873 
874 /**
875  * struct sdca_channel - a single Channel with a Cluster
876  * @id: Identifier used for addressing.
877  * @purpose: Indicates the purpose of the Channel, usually to give
878  * semantic meaning to the audio, eg. voice, ultrasound.
879  * @relationship: Indicates the relationship of this Channel to others
880  * in the Cluster, often used to identify the physical position of the
881  * Channel eg. left.
882  */
883 struct sdca_channel {
884 	int id;
885 	enum sdca_channel_purpose purpose;
886 	enum sdca_channel_relationship relationship;
887 };
888 
889 /**
890  * struct sdca_cluster - information about an SDCA Channel Cluster
891  * @id: Identifier used for addressing.
892  * @num_channels: Number of Channels within this Cluster.
893  * @channels: Dynamically allocated array of Channels.
894  */
895 struct sdca_cluster {
896 	int id;
897 	int num_channels;
898 	struct sdca_channel *channels;
899 };
900 
901 /**
902  * struct sdca_function_data - top-level information for one SDCA function
903  * @desc: Pointer to short descriptor from initial parsing.
904  * @init_table: Pointer to a table of initialization writes.
905  * @entities: Dynamically allocated array of Entities.
906  * @clusters: Dynamically allocated array of Channel Clusters.
907  * @num_init_table: Number of initialization writes.
908  * @num_entities: Number of Entities reported in this Function.
909  * @num_clusters: Number of Channel Clusters reported in this Function.
910  * @busy_max_delay: Maximum Function busy delay in microseconds, before an
911  * error should be reported.
912  */
913 struct sdca_function_data {
914 	struct sdca_function_desc *desc;
915 
916 	struct sdca_init_write *init_table;
917 	struct sdca_entity *entities;
918 	struct sdca_cluster *clusters;
919 	int num_init_table;
920 	int num_entities;
921 	int num_clusters;
922 
923 	unsigned int busy_max_delay;
924 };
925 
926 int sdca_parse_function(struct device *dev,
927 			struct sdca_function_desc *desc,
928 			struct sdca_function_data *function);
929 
930 #endif
931