xref: /linux-6.15/include/sound/sdca_function.h (revision 64fb5af1)
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  * enum sdca_function_type - SDCA Function Type codes
31  * @SDCA_FUNCTION_TYPE_SMART_AMP: Amplifier with protection features.
32  * @SDCA_FUNCTION_TYPE_SIMPLE_AMP: Subset of SmartAmp.
33  * @SDCA_FUNCTION_TYPE_SMART_MIC: Smart microphone with acoustic triggers.
34  * @SDCA_FUNCTION_TYPE_SIMPLE_MIC: Subset of SmartMic.
35  * @SDCA_FUNCTION_TYPE_SPEAKER_MIC: Combination of SmartMic and SmartAmp.
36  * @SDCA_FUNCTION_TYPE_UAJ: 3.5mm Universal Audio jack.
37  * @SDCA_FUNCTION_TYPE_RJ: Retaskable jack.
38  * @SDCA_FUNCTION_TYPE_SIMPLE_JACK: Subset of UAJ.
39  * @SDCA_FUNCTION_TYPE_HID: Human Interface Device, for e.g. buttons.
40  * @SDCA_FUNCTION_TYPE_IMP_DEF: Implementation-defined function.
41  *
42  * SDCA Function Types from SDCA specification v1.0a Section 5.1.2
43  * all Function types not described are reserved.
44  *
45  * Note that SIMPLE_AMP, SIMPLE_MIC and SIMPLE_JACK Function Types
46  * are NOT defined in SDCA 1.0a, but they were defined in earlier
47  * drafts and are planned for 1.1.
48  */
49 enum sdca_function_type {
50 	SDCA_FUNCTION_TYPE_SMART_AMP			= 0x01,
51 	SDCA_FUNCTION_TYPE_SIMPLE_AMP			= 0x02,
52 	SDCA_FUNCTION_TYPE_SMART_MIC			= 0x03,
53 	SDCA_FUNCTION_TYPE_SIMPLE_MIC			= 0x04,
54 	SDCA_FUNCTION_TYPE_SPEAKER_MIC			= 0x05,
55 	SDCA_FUNCTION_TYPE_UAJ				= 0x06,
56 	SDCA_FUNCTION_TYPE_RJ				= 0x07,
57 	SDCA_FUNCTION_TYPE_SIMPLE_JACK			= 0x08,
58 	SDCA_FUNCTION_TYPE_HID				= 0x0A,
59 	SDCA_FUNCTION_TYPE_IMP_DEF			= 0x1F,
60 };
61 
62 /* Human-readable names used for kernel logs and Function device registration/bind */
63 #define	SDCA_FUNCTION_TYPE_SMART_AMP_NAME		"SmartAmp"
64 #define	SDCA_FUNCTION_TYPE_SIMPLE_AMP_NAME		"SimpleAmp"
65 #define	SDCA_FUNCTION_TYPE_SMART_MIC_NAME		"SmartMic"
66 #define	SDCA_FUNCTION_TYPE_SIMPLE_MIC_NAME		"SimpleMic"
67 #define	SDCA_FUNCTION_TYPE_SPEAKER_MIC_NAME		"SpeakerMic"
68 #define	SDCA_FUNCTION_TYPE_UAJ_NAME			"UAJ"
69 #define	SDCA_FUNCTION_TYPE_RJ_NAME			"RJ"
70 #define	SDCA_FUNCTION_TYPE_SIMPLE_NAME			"SimpleJack"
71 #define	SDCA_FUNCTION_TYPE_HID_NAME			"HID"
72 #define	SDCA_FUNCTION_TYPE_IMP_DEF_NAME			"ImplementationDefined"
73 
74 /**
75  * struct sdca_init_write - a single initialization write
76  * @addr: Register address to be written
77  * @val: Single byte value to be written
78  */
79 struct sdca_init_write {
80 	u32 addr;
81 	u8 val;
82 };
83 
84 /**
85  * define SDCA_CTL_TYPE - create a unique identifier for an SDCA Control
86  * @ent: Entity Type code.
87  * @sel: Control Selector code.
88  *
89  * Sometimes there is a need to identify a type of Control, for example to
90  * determine what name the control should have. SDCA Selectors are reused
91  * across Entity types, as such it is necessary to combine both the Entity
92  * Type and the Control Selector to obtain a unique identifier.
93  */
94 #define SDCA_CTL_TYPE(ent, sel) ((ent) << 8 | (sel))
95 
96 /**
97  * define SDCA_CTL_TYPE_S - static version of SDCA_CTL_TYPE
98  * @ent: Entity name, for example IT, MFPU, etc. this string can be read
99  * from the last characters of the SDCA_ENTITY_TYPE_* macros.
100  * @sel: Control Selector name, for example MIC_BIAS, MUTE, etc. this
101  * string can be read from the last characters of the SDCA_CTL_*_*
102  * macros.
103  *
104  * Short hand to specific a Control type statically for example:
105  * SDAC_CTL_TYPE_S(IT, MIC_BIAS).
106  */
107 #define SDCA_CTL_TYPE_S(ent, sel) SDCA_CTL_TYPE(SDCA_ENTITY_TYPE_##ent, \
108 						SDCA_CTL_##ent##_##sel)
109 
110 /**
111  * enum sdca_it_controls - SDCA Controls for Input Terminal
112  *
113  * Control Selectors for Input Terminal from SDCA specification v1.0
114  * section 6.2.1.3.
115  */
116 enum sdca_it_controls {
117 	SDCA_CTL_IT_MIC_BIAS				= 0x03,
118 	SDCA_CTL_IT_USAGE				= 0x04,
119 	SDCA_CTL_IT_LATENCY				= 0x08,
120 	SDCA_CTL_IT_CLUSTERINDEX			= 0x10,
121 	SDCA_CTL_IT_DATAPORT_SELECTOR			= 0x11,
122 	SDCA_CTL_IT_MATCHING_GUID			= 0x12,
123 	SDCA_CTL_IT_KEEP_ALIVE				= 0x13,
124 	SDCA_CTL_IT_NDAI_STREAM				= 0x14,
125 	SDCA_CTL_IT_NDAI_CATEGORY			= 0x15,
126 	SDCA_CTL_IT_NDAI_CODINGTYPE			= 0x16,
127 	SDCA_CTL_IT_NDAI_PACKETTYPE			= 0x17,
128 };
129 
130 /**
131  * enum sdca_ot_controls - SDCA Controls for Output Terminal
132  *
133  * Control Selectors for Output Terminal from SDCA specification v1.0
134  * section 6.2.2.3.
135  */
136 enum sdca_ot_controls {
137 	SDCA_CTL_OT_USAGE				= 0x04,
138 	SDCA_CTL_OT_LATENCY				= 0x08,
139 	SDCA_CTL_OT_DATAPORT_SELECTOR			= 0x11,
140 	SDCA_CTL_OT_MATCHING_GUID			= 0x12,
141 	SDCA_CTL_OT_KEEP_ALIVE				= 0x13,
142 	SDCA_CTL_OT_NDAI_STREAM				= 0x14,
143 	SDCA_CTL_OT_NDAI_CATEGORY			= 0x15,
144 	SDCA_CTL_OT_NDAI_CODINGTYPE			= 0x16,
145 	SDCA_CTL_OT_NDAI_PACKETTYPE			= 0x17,
146 };
147 
148 /**
149  * enum sdca_mu_controls - SDCA Controls for Mixer Unit
150  *
151  * Control Selectors for Mixer Unit from SDCA specification v1.0
152  * section 6.3.4.2.
153  */
154 enum sdca_mu_controls {
155 	SDCA_CTL_MU_MIXER				= 0x01,
156 	SDCA_CTL_MU_LATENCY				= 0x06,
157 };
158 
159 /**
160  * enum sdca_su_controls - SDCA Controls for Selector Unit
161  *
162  * Control Selectors for Selector Unit from SDCA specification v1.0
163  * section 6.3.8.3.
164  */
165 enum sdca_su_controls {
166 	SDCA_CTL_SU_SELECTOR				= 0x01,
167 	SDCA_CTL_SU_LATENCY				= 0x02,
168 };
169 
170 /**
171  * enum sdca_fu_controls - SDCA Controls for Feature Unit
172  *
173  * Control Selectors for Feature Unit from SDCA specification v1.0
174  * section 6.3.2.3.
175  */
176 enum sdca_fu_controls {
177 	SDCA_CTL_FU_MUTE				= 0x01,
178 	SDCA_CTL_FU_CHANNEL_VOLUME			= 0x02,
179 	SDCA_CTL_FU_AGC					= 0x07,
180 	SDCA_CTL_FU_BASS_BOOST				= 0x09,
181 	SDCA_CTL_FU_LOUDNESS				= 0x0A,
182 	SDCA_CTL_FU_GAIN				= 0x0B,
183 	SDCA_CTL_FU_LATENCY				= 0x10,
184 };
185 
186 /**
187  * enum sdca_xu_controls - SDCA Controls for Extension Unit
188  *
189  * Control Selectors for Extension Unit from SDCA specification v1.0
190  * section 6.3.10.3.
191  */
192 enum sdca_xu_controls {
193 	SDCA_CTL_XU_BYPASS				= 0x01,
194 	SDCA_CTL_XU_LATENCY				= 0x06,
195 	SDCA_CTL_XU_XU_ID				= 0x07,
196 	SDCA_CTL_XU_XU_VERSION				= 0x08,
197 	SDCA_CTL_XU_FDL_CURRENTOWNER			= 0x10,
198 	SDCA_CTL_XU_FDL_MESSAGEOFFSET			= 0x12,
199 	SDCA_CTL_XU_FDL_MESSAGELENGTH			= 0x13,
200 	SDCA_CTL_XU_FDL_STATUS				= 0x14,
201 	SDCA_CTL_XU_FDL_SET_INDEX			= 0x15,
202 	SDCA_CTL_XU_FDL_HOST_REQUEST			= 0x16,
203 };
204 
205 /**
206  * enum sdca_cs_controls - SDCA Controls for Clock Source
207  *
208  * Control Selectors for Clock Source from SDCA specification v1.0
209  * section 6.4.1.3.
210  */
211 enum sdca_cs_controls {
212 	SDCA_CTL_CS_CLOCK_VALID				= 0x02,
213 	SDCA_CTL_CS_SAMPLERATEINDEX			= 0x10,
214 };
215 
216 /**
217  * enum sdca_cx_controls - SDCA Controls for Clock Selector
218  *
219  * Control Selectors for Clock Selector from SDCA specification v1.0
220  * section 6.4.2.3.
221  */
222 enum sdca_cx_controls {
223 	SDCA_CTL_CX_CLOCK_SELECT			= 0x01,
224 };
225 
226 /**
227  * enum sdca_pde_controls - SDCA Controls for Power Domain Entity
228  *
229  * Control Selectors for Power Domain Entity from SDCA specification
230  * v1.0 section 6.5.2.2.
231  */
232 enum sdca_pde_controls {
233 	SDCA_CTL_PDE_REQUESTED_PS			= 0x01,
234 	SDCA_CTL_PDE_ACTUAL_PS				= 0x10,
235 };
236 
237 /**
238  * enum sdca_ge_controls - SDCA Controls for Group Unit
239  *
240  * Control Selectors for Group Unit from SDCA specification v1.0
241  * section 6.5.1.4.
242  */
243 enum sdca_ge_controls {
244 	SDCA_CTL_GE_SELECTED_MODE			= 0x01,
245 	SDCA_CTL_GE_DETECTED_MODE			= 0x02,
246 };
247 
248 /**
249  * enum sdca_spe_controls - SDCA Controls for Security & Privacy Unit
250  *
251  * Control Selectors for Security & Privacy Unit from SDCA
252  * specification v1.0 Section 6.5.3.2.
253  */
254 enum sdca_spe_controls {
255 	SDCA_CTL_SPE_PRIVATE				= 0x01,
256 	SDCA_CTL_SPE_PRIVACY_POLICY			= 0x02,
257 	SDCA_CTL_SPE_PRIVACY_LOCKSTATE			= 0x03,
258 	SDCA_CTL_SPE_PRIVACY_OWNER			= 0x04,
259 	SDCA_CTL_SPE_AUTHTX_CURRENTOWNER		= 0x10,
260 	SDCA_CTL_SPE_AUTHTX_MESSAGEOFFSET		= 0x12,
261 	SDCA_CTL_SPE_AUTHTX_MESSAGELENGTH		= 0x13,
262 	SDCA_CTL_SPE_AUTHRX_CURRENTOWNER		= 0x14,
263 	SDCA_CTL_SPE_AUTHRX_MESSAGEOFFSET		= 0x16,
264 	SDCA_CTL_SPE_AUTHRX_MESSAGELENGTH		= 0x17,
265 };
266 
267 /**
268  * enum sdca_cru_controls - SDCA Controls for Channel Remapping Unit
269  *
270  * Control Selectors for Channel Remapping Unit from SDCA
271  * specification v1.0 Section 6.3.1.3.
272  */
273 enum sdca_cru_controls {
274 	SDCA_CTL_CRU_LATENCY				= 0x06,
275 	SDCA_CTL_CRU_CLUSTERINDEX			= 0x10,
276 };
277 
278 /**
279  * enum sdca_udmpu_controls - SDCA Controls for Up-Down Mixer Processing Unit
280  *
281  * Control Selectors for Up-Down Mixer Processing Unit from SDCA
282  * specification v1.0 Section 6.3.9.3.
283  */
284 enum sdca_udmpu_controls {
285 	SDCA_CTL_UDMPU_LATENCY				= 0x06,
286 	SDCA_CTL_UDMPU_CLUSTERINDEX			= 0x10,
287 	SDCA_CTL_UDMPU_ACOUSTIC_ENERGY_LEVEL_MONITOR	= 0x11,
288 	SDCA_CTL_UDMPU_ULTRASOUND_LOOP_GAIN		= 0x12,
289 	SDCA_CTL_UDMPU_OPAQUESET_0			= 0x18,
290 	SDCA_CTL_UDMPU_OPAQUESET_1			= 0x19,
291 	SDCA_CTL_UDMPU_OPAQUESET_2			= 0x1A,
292 	SDCA_CTL_UDMPU_OPAQUESET_3			= 0x1B,
293 	SDCA_CTL_UDMPU_OPAQUESET_4			= 0x1C,
294 	SDCA_CTL_UDMPU_OPAQUESET_5			= 0x1D,
295 	SDCA_CTL_UDMPU_OPAQUESET_6			= 0x1E,
296 	SDCA_CTL_UDMPU_OPAQUESET_7			= 0x1F,
297 	SDCA_CTL_UDMPU_OPAQUESET_8			= 0x20,
298 	SDCA_CTL_UDMPU_OPAQUESET_9			= 0x21,
299 	SDCA_CTL_UDMPU_OPAQUESET_10			= 0x22,
300 	SDCA_CTL_UDMPU_OPAQUESET_11			= 0x23,
301 	SDCA_CTL_UDMPU_OPAQUESET_12			= 0x24,
302 	SDCA_CTL_UDMPU_OPAQUESET_13			= 0x25,
303 	SDCA_CTL_UDMPU_OPAQUESET_14			= 0x26,
304 	SDCA_CTL_UDMPU_OPAQUESET_15			= 0x27,
305 	SDCA_CTL_UDMPU_OPAQUESET_16			= 0x28,
306 	SDCA_CTL_UDMPU_OPAQUESET_17			= 0x29,
307 	SDCA_CTL_UDMPU_OPAQUESET_18			= 0x2A,
308 	SDCA_CTL_UDMPU_OPAQUESET_19			= 0x2B,
309 	SDCA_CTL_UDMPU_OPAQUESET_20			= 0x2C,
310 	SDCA_CTL_UDMPU_OPAQUESET_21			= 0x2D,
311 	SDCA_CTL_UDMPU_OPAQUESET_22			= 0x2E,
312 	SDCA_CTL_UDMPU_OPAQUESET_23			= 0x2F,
313 };
314 
315 /**
316  * enum sdca_mfpu_controls - SDCA Controls for Multi-Function Processing Unit
317  *
318  * Control Selectors for Multi-Function Processing Unit from SDCA
319  * specification v1.0 Section 6.3.3.4.
320  */
321 enum sdca_mfpu_controls {
322 	SDCA_CTL_MFPU_BYPASS				= 0x01,
323 	SDCA_CTL_MFPU_ALGORITHM_READY			= 0x04,
324 	SDCA_CTL_MFPU_ALGORITHM_ENABLE			= 0x05,
325 	SDCA_CTL_MFPU_LATENCY				= 0x08,
326 	SDCA_CTL_MFPU_ALGORITHM_PREPARE			= 0x09,
327 	SDCA_CTL_MFPU_CLUSTERINDEX			= 0x10,
328 	SDCA_CTL_MFPU_CENTER_FREQUENCY_INDEX		= 0x11,
329 	SDCA_CTL_MFPU_ULTRASOUND_LEVEL			= 0x12,
330 	SDCA_CTL_MFPU_AE_NUMBER				= 0x13,
331 	SDCA_CTL_MFPU_AE_CURRENTOWNER			= 0x14,
332 	SDCA_CTL_MFPU_AE_MESSAGEOFFSET			= 0x16,
333 	SDCA_CTL_MFPU_AE_MESSAGELENGTH			= 0x17,
334 };
335 
336 /**
337  * enum sdca_smpu_controls - SDCA Controls for Smart Mic Processing Unit
338  *
339  * Control Selectors for Smart Mic Processing Unit from SDCA
340  * specification v1.0 Section 6.3.7.3.
341  */
342 enum sdca_smpu_controls {
343 	SDCA_CTL_SMPU_LATENCY				= 0x06,
344 	SDCA_CTL_SMPU_TRIGGER_ENABLE			= 0x10,
345 	SDCA_CTL_SMPU_TRIGGER_STATUS			= 0x11,
346 	SDCA_CTL_SMPU_HIST_BUFFER_MODE			= 0x12,
347 	SDCA_CTL_SMPU_HIST_BUFFER_PREAMBLE		= 0x13,
348 	SDCA_CTL_SMPU_HIST_ERROR			= 0x14,
349 	SDCA_CTL_SMPU_TRIGGER_EXTENSION			= 0x15,
350 	SDCA_CTL_SMPU_TRIGGER_READY			= 0x16,
351 	SDCA_CTL_SMPU_HIST_CURRENTOWNER			= 0x18,
352 	SDCA_CTL_SMPU_HIST_MESSAGEOFFSET		= 0x1A,
353 	SDCA_CTL_SMPU_HIST_MESSAGELENGTH		= 0x1B,
354 	SDCA_CTL_SMPU_DTODTX_CURRENTOWNER		= 0x1C,
355 	SDCA_CTL_SMPU_DTODTX_MESSAGEOFFSET		= 0x1E,
356 	SDCA_CTL_SMPU_DTODTX_MESSAGELENGTH		= 0x1F,
357 	SDCA_CTL_SMPU_DTODRX_CURRENTOWNER		= 0x20,
358 	SDCA_CTL_SMPU_DTODRX_MESSAGEOFFSET		= 0x22,
359 	SDCA_CTL_SMPU_DTODRX_MESSAGELENGTH		= 0x23,
360 };
361 
362 /**
363  * enum sdca_sapu_controls - SDCA Controls for Smart Amp Processing Unit
364  *
365  * Control Selectors for Smart Amp Processing Unit from SDCA
366  * specification v1.0 Section 6.3.6.3.
367  */
368 enum sdca_sapu_controls {
369 	SDCA_CTL_SAPU_LATENCY				= 0x05,
370 	SDCA_CTL_SAPU_PROTECTION_MODE			= 0x10,
371 	SDCA_CTL_SAPU_PROTECTION_STATUS			= 0x11,
372 	SDCA_CTL_SAPU_OPAQUESETREQ_INDEX		= 0x12,
373 	SDCA_CTL_SAPU_DTODTX_CURRENTOWNER		= 0x14,
374 	SDCA_CTL_SAPU_DTODTX_MESSAGEOFFSET		= 0x16,
375 	SDCA_CTL_SAPU_DTODTX_MESSAGELENGTH		= 0x17,
376 	SDCA_CTL_SAPU_DTODRX_CURRENTOWNER		= 0x18,
377 	SDCA_CTL_SAPU_DTODRX_MESSAGEOFFSET		= 0x1A,
378 	SDCA_CTL_SAPU_DTODRX_MESSAGELENGTH		= 0x1B,
379 };
380 
381 /**
382  * enum sdca_ppu_controls - SDCA Controls for Post Processing Unit
383  *
384  * Control Selectors for Post Processing Unit from SDCA specification
385  * v1.0 Section 6.3.5.3.
386  */
387 enum sdca_ppu_controls {
388 	SDCA_CTL_PPU_LATENCY				= 0x06,
389 	SDCA_CTL_PPU_POSTURENUMBER			= 0x10,
390 	SDCA_CTL_PPU_POSTUREEXTENSION			= 0x11,
391 	SDCA_CTL_PPU_HORIZONTALBALANCE			= 0x12,
392 	SDCA_CTL_PPU_VERTICALBALANCE			= 0x13,
393 };
394 
395 /**
396  * enum sdca_tg_controls - SDCA Controls for Tone Generator Entity
397  *
398  * Control Selectors for Tone Generator from SDCA specification v1.0
399  * Section 6.5.4.4.
400  */
401 enum sdca_tg_controls {
402 	SDCA_CTL_TG_TONE_DIVIDER			= 0x10,
403 };
404 
405 /**
406  * enum sdca_hide_controls - SDCA Controls for HIDE Entity
407  *
408  * Control Selectors for HIDE from SDCA specification v1.0 Section
409  * 6.6.1.2.
410  */
411 enum sdca_hide_controls {
412 	SDCA_CTL_HIDE_HIDTX_CURRENTOWNER		= 0x10,
413 	SDCA_CTL_HIDE_HIDTX_MESSAGEOFFSET		= 0x12,
414 	SDCA_CTL_HIDE_HIDTX_MESSAGELENGTH		= 0x13,
415 	SDCA_CTL_HIDE_HIDRX_CURRENTOWNER		= 0x14,
416 	SDCA_CTL_HIDE_HIDRX_MESSAGEOFFSET		= 0x16,
417 	SDCA_CTL_HIDE_HIDRX_MESSAGELENGTH		= 0x17,
418 };
419 
420 /**
421  * enum sdca_entity0_controls - SDCA Controls for Entity 0
422  *
423  * Control Selectors for Entity 0 from SDCA specification v1.0 Section
424  * 6.7.1.1.
425  */
426 enum sdca_entity0_controls {
427 	SDCA_CTL_ENTITY_0_COMMIT_GROUP_MASK		= 0x01,
428 	SDCA_CTL_ENTITY_0_FUNCTION_SDCA_VERSION		= 0x04,
429 	SDCA_CTL_ENTITY_0_FUNCTION_TYPE			= 0x05,
430 	SDCA_CTL_ENTITY_0_FUNCTION_MANUFACTURER_ID	= 0x06,
431 	SDCA_CTL_ENTITY_0_FUNCTION_ID			= 0x07,
432 	SDCA_CTL_ENTITY_0_FUNCTION_VERSION		= 0x08,
433 	SDCA_CTL_ENTITY_0_FUNCTION_EXTENSION_ID		= 0x09,
434 	SDCA_CTL_ENTITY_0_FUNCTION_EXTENSION_VERSION	= 0x0A,
435 	SDCA_CTL_ENTITY_0_FUNCTION_STATUS		= 0x10,
436 	SDCA_CTL_ENTITY_0_FUNCTION_ACTION		= 0x11,
437 	SDCA_CTL_ENTITY_0_MATCHING_GUID			= 0x12,
438 	SDCA_CTL_ENTITY_0_DEVICE_MANUFACTURER_ID	= 0x2C,
439 	SDCA_CTL_ENTITY_0_DEVICE_PART_ID		= 0x2D,
440 	SDCA_CTL_ENTITY_0_DEVICE_VERSION		= 0x2E,
441 	SDCA_CTL_ENTITY_0_DEVICE_SDCA_VERSION		= 0x2F,
442 
443 	/* Function Status Bits */
444 	SDCA_CTL_ENTITY_0_DEVICE_NEWLY_ATTACHED		= BIT(0),
445 	SDCA_CTL_ENTITY_0_INTS_DISABLED_ABNORMALLY	= BIT(1),
446 	SDCA_CTL_ENTITY_0_STREAMING_STOPPED_ABNORMALLY	= BIT(2),
447 	SDCA_CTL_ENTITY_0_FUNCTION_FAULT		= BIT(3),
448 	SDCA_CTL_ENTITY_0_UMP_SEQUENCE_FAULT		= BIT(4),
449 	SDCA_CTL_ENTITY_0_FUNCTION_NEEDS_INITIALIZATION	= BIT(5),
450 	SDCA_CTL_ENTITY_0_FUNCTION_HAS_BEEN_RESET	= BIT(6),
451 	SDCA_CTL_ENTITY_0_FUNCTION_BUSY			= BIT(7),
452 };
453 
454 #define SDCA_CTL_MIC_BIAS_NAME				"Mic Bias"
455 #define SDCA_CTL_USAGE_NAME				"Usage"
456 #define SDCA_CTL_LATENCY_NAME				"Latency"
457 #define SDCA_CTL_CLUSTERINDEX_NAME			"Cluster Index"
458 #define SDCA_CTL_DATAPORT_SELECTOR_NAME			"Dataport Selector"
459 #define SDCA_CTL_MATCHING_GUID_NAME			"Matching GUID"
460 #define SDCA_CTL_KEEP_ALIVE_NAME			"Keep Alive"
461 #define SDCA_CTL_NDAI_STREAM_NAME			"NDAI Stream"
462 #define SDCA_CTL_NDAI_CATEGORY_NAME			"NDAI Category"
463 #define SDCA_CTL_NDAI_CODINGTYPE_NAME			"NDAI Coding Type"
464 #define SDCA_CTL_NDAI_PACKETTYPE_NAME			"NDAI Packet Type"
465 #define SDCA_CTL_MIXER_NAME				"Mixer"
466 #define SDCA_CTL_SELECTOR_NAME				"Selector"
467 #define SDCA_CTL_MUTE_NAME				"Mute"
468 #define SDCA_CTL_CHANNEL_VOLUME_NAME			"Channel Volume"
469 #define SDCA_CTL_AGC_NAME				"AGC"
470 #define SDCA_CTL_BASS_BOOST_NAME			"Bass Boost"
471 #define SDCA_CTL_LOUDNESS_NAME				"Loudness"
472 #define SDCA_CTL_GAIN_NAME				"Gain"
473 #define SDCA_CTL_BYPASS_NAME				"Bypass"
474 #define SDCA_CTL_XU_ID_NAME				"XU ID"
475 #define SDCA_CTL_XU_VERSION_NAME			"XU Version"
476 #define SDCA_CTL_FDL_CURRENTOWNER_NAME			"FDL Current Owner"
477 #define SDCA_CTL_FDL_MESSAGEOFFSET_NAME			"FDL Message Offset"
478 #define SDCA_CTL_FDL_MESSAGELENGTH_NAME			"FDL Message Length"
479 #define SDCA_CTL_FDL_STATUS_NAME			"FDL Status"
480 #define SDCA_CTL_FDL_SET_INDEX_NAME			"FDL Set Index"
481 #define SDCA_CTL_FDL_HOST_REQUEST_NAME			"FDL Host Request"
482 #define SDCA_CTL_CLOCK_VALID_NAME			"Clock Valid"
483 #define SDCA_CTL_SAMPLERATEINDEX_NAME			"Sample Rate Index"
484 #define SDCA_CTL_CLOCK_SELECT_NAME			"Clock Select"
485 #define SDCA_CTL_REQUESTED_PS_NAME			"Requested PS"
486 #define SDCA_CTL_ACTUAL_PS_NAME				"Actual PS"
487 #define SDCA_CTL_SELECTED_MODE_NAME			"Selected Mode"
488 #define SDCA_CTL_DETECTED_MODE_NAME			"Detected Mode"
489 #define SDCA_CTL_PRIVATE_NAME				"Private"
490 #define SDCA_CTL_PRIVACY_POLICY_NAME			"Privacy Policy"
491 #define SDCA_CTL_PRIVACY_LOCKSTATE_NAME			"Privacy Lockstate"
492 #define SDCA_CTL_PRIVACY_OWNER_NAME			"Privacy Owner"
493 #define SDCA_CTL_AUTHTX_CURRENTOWNER_NAME		"AuthTX Current Owner"
494 #define SDCA_CTL_AUTHTX_MESSAGEOFFSET_NAME		"AuthTX Message Offset"
495 #define SDCA_CTL_AUTHTX_MESSAGELENGTH_NAME		"AuthTX Message Length"
496 #define SDCA_CTL_AUTHRX_CURRENTOWNER_NAME		"AuthRX Current Owner"
497 #define SDCA_CTL_AUTHRX_MESSAGEOFFSET_NAME		"AuthRX Message Offset"
498 #define SDCA_CTL_AUTHRX_MESSAGELENGTH_NAME		"AuthRX Message Length"
499 #define SDCA_CTL_ACOUSTIC_ENERGY_LEVEL_MONITOR_NAME	"Acoustic Energy Level Monitor"
500 #define SDCA_CTL_ULTRASOUND_LOOP_GAIN_NAME		"Ultrasound Loop Gain"
501 #define SDCA_CTL_OPAQUESET_0_NAME			"Opaqueset 0"
502 #define SDCA_CTL_OPAQUESET_1_NAME			"Opaqueset 1"
503 #define SDCA_CTL_OPAQUESET_2_NAME			"Opaqueset 2"
504 #define SDCA_CTL_OPAQUESET_3_NAME			"Opaqueset 3"
505 #define SDCA_CTL_OPAQUESET_4_NAME			"Opaqueset 4"
506 #define SDCA_CTL_OPAQUESET_5_NAME			"Opaqueset 5"
507 #define SDCA_CTL_OPAQUESET_6_NAME			"Opaqueset 6"
508 #define SDCA_CTL_OPAQUESET_7_NAME			"Opaqueset 7"
509 #define SDCA_CTL_OPAQUESET_8_NAME			"Opaqueset 8"
510 #define SDCA_CTL_OPAQUESET_9_NAME			"Opaqueset 9"
511 #define SDCA_CTL_OPAQUESET_10_NAME			"Opaqueset 10"
512 #define SDCA_CTL_OPAQUESET_11_NAME			"Opaqueset 11"
513 #define SDCA_CTL_OPAQUESET_12_NAME			"Opaqueset 12"
514 #define SDCA_CTL_OPAQUESET_13_NAME			"Opaqueset 13"
515 #define SDCA_CTL_OPAQUESET_14_NAME			"Opaqueset 14"
516 #define SDCA_CTL_OPAQUESET_15_NAME			"Opaqueset 15"
517 #define SDCA_CTL_OPAQUESET_16_NAME			"Opaqueset 16"
518 #define SDCA_CTL_OPAQUESET_17_NAME			"Opaqueset 17"
519 #define SDCA_CTL_OPAQUESET_18_NAME			"Opaqueset 18"
520 #define SDCA_CTL_OPAQUESET_19_NAME			"Opaqueset 19"
521 #define SDCA_CTL_OPAQUESET_20_NAME			"Opaqueset 20"
522 #define SDCA_CTL_OPAQUESET_21_NAME			"Opaqueset 21"
523 #define SDCA_CTL_OPAQUESET_22_NAME			"Opaqueset 22"
524 #define SDCA_CTL_OPAQUESET_23_NAME			"Opaqueset 23"
525 #define SDCA_CTL_ALGORITHM_READY_NAME			"Algorithm Ready"
526 #define SDCA_CTL_ALGORITHM_ENABLE_NAME			"Algorithm Enable"
527 #define SDCA_CTL_ALGORITHM_PREPARE_NAME			"Algorithm Prepare"
528 #define SDCA_CTL_CENTER_FREQUENCY_INDEX_NAME		"Center Frequency Index"
529 #define SDCA_CTL_ULTRASOUND_LEVEL_NAME			"Ultrasound Level"
530 #define SDCA_CTL_AE_NUMBER_NAME				"AE Number"
531 #define SDCA_CTL_AE_CURRENTOWNER_NAME			"AE Current Owner"
532 #define SDCA_CTL_AE_MESSAGEOFFSET_NAME			"AE Message Offset"
533 #define SDCA_CTL_AE_MESSAGELENGTH_NAME			"AE Message Length"
534 #define SDCA_CTL_TRIGGER_ENABLE_NAME			"Trigger Enable"
535 #define SDCA_CTL_TRIGGER_STATUS_NAME			"Trigger Status"
536 #define SDCA_CTL_HIST_BUFFER_MODE_NAME			"Hist Buffer Mode"
537 #define SDCA_CTL_HIST_BUFFER_PREAMBLE_NAME		"Hist Buffer Preamble"
538 #define SDCA_CTL_HIST_ERROR_NAME			"Hist Error"
539 #define SDCA_CTL_TRIGGER_EXTENSION_NAME			"Trigger Extension"
540 #define SDCA_CTL_TRIGGER_READY_NAME			"Trigger Ready"
541 #define SDCA_CTL_HIST_CURRENTOWNER_NAME			"Hist Current Owner"
542 #define SDCA_CTL_HIST_MESSAGEOFFSET_NAME		"Hist Message Offset"
543 #define SDCA_CTL_HIST_MESSAGELENGTH_NAME		"Hist Message Length"
544 #define SDCA_CTL_DTODTX_CURRENTOWNER_NAME		"DTODTX Current Owner"
545 #define SDCA_CTL_DTODTX_MESSAGEOFFSET_NAME		"DTODTX Message Offset"
546 #define SDCA_CTL_DTODTX_MESSAGELENGTH_NAME		"DTODTX Message Length"
547 #define SDCA_CTL_DTODRX_CURRENTOWNER_NAME		"DTODRX Current Owner"
548 #define SDCA_CTL_DTODRX_MESSAGEOFFSET_NAME		"DTODRX Message Offset"
549 #define SDCA_CTL_DTODRX_MESSAGELENGTH_NAME		"DTODRX Message Length"
550 #define SDCA_CTL_PROTECTION_MODE_NAME			"Protection Mode"
551 #define SDCA_CTL_PROTECTION_STATUS_NAME			"Protection Status"
552 #define SDCA_CTL_OPAQUESETREQ_INDEX_NAME		"Opaqueset Req Index"
553 #define SDCA_CTL_DTODTX_CURRENTOWNER_NAME		"DTODTX Current Owner"
554 #define SDCA_CTL_DTODTX_MESSAGEOFFSET_NAME		"DTODTX Message Offset"
555 #define SDCA_CTL_DTODTX_MESSAGELENGTH_NAME		"DTODTX Message Length"
556 #define SDCA_CTL_DTODRX_CURRENTOWNER_NAME		"DTODRX Current Owner"
557 #define SDCA_CTL_DTODRX_MESSAGEOFFSET_NAME		"DTODRX Message Offset"
558 #define SDCA_CTL_DTODRX_MESSAGELENGTH_NAME		"DTODRX Message Length"
559 #define SDCA_CTL_POSTURENUMBER_NAME			"Posture Number"
560 #define SDCA_CTL_POSTUREEXTENSION_NAME			"Posture Extension"
561 #define SDCA_CTL_HORIZONTALBALANCE_NAME			"Horizontal Balance"
562 #define SDCA_CTL_VERTICALBALANCE_NAME			"Vertical Balance"
563 #define SDCA_CTL_TONE_DIVIDER_NAME			"Tone Divider"
564 #define SDCA_CTL_HIDTX_CURRENTOWNER_NAME		"HIDTX Current Owner"
565 #define SDCA_CTL_HIDTX_MESSAGEOFFSET_NAME		"HIDTX Message Offset"
566 #define SDCA_CTL_HIDTX_MESSAGELENGTH_NAME		"HIDTX Message Length"
567 #define SDCA_CTL_HIDRX_CURRENTOWNER_NAME		"HIDRX Current Owner"
568 #define SDCA_CTL_HIDRX_MESSAGEOFFSET_NAME		"HIDRX Message Offset"
569 #define SDCA_CTL_HIDRX_MESSAGELENGTH_NAME		"HIDRX Message Length"
570 #define SDCA_CTL_COMMIT_GROUP_MASK_NAME			"Commit Group Mask"
571 #define SDCA_CTL_FUNCTION_SDCA_VERSION_NAME		"Function SDCA Version"
572 #define SDCA_CTL_FUNCTION_TYPE_NAME			"Function Type"
573 #define SDCA_CTL_FUNCTION_MANUFACTURER_ID_NAME		"Function Manufacturer ID"
574 #define SDCA_CTL_FUNCTION_ID_NAME			"Function ID"
575 #define SDCA_CTL_FUNCTION_VERSION_NAME			"Function Version"
576 #define SDCA_CTL_FUNCTION_EXTENSION_ID_NAME		"Function Extension ID"
577 #define SDCA_CTL_FUNCTION_EXTENSION_VERSION_NAME	"Function Extension Version"
578 #define SDCA_CTL_FUNCTION_STATUS_NAME			"Function Status"
579 #define SDCA_CTL_FUNCTION_ACTION_NAME			"Function Action"
580 #define SDCA_CTL_DEVICE_MANUFACTURER_ID_NAME		"Device Manufacturer ID"
581 #define SDCA_CTL_DEVICE_PART_ID_NAME			"Device Part ID"
582 #define SDCA_CTL_DEVICE_VERSION_NAME			"Device Version"
583 #define SDCA_CTL_DEVICE_SDCA_VERSION_NAME		"Device SDCA Version"
584 
585 /**
586  * enum sdca_access_mode - SDCA Control access mode
587  *
588  * Access modes as described in the SDCA specification v1.0 section
589  * 7.1.8.2.
590  */
591 enum sdca_access_mode {
592 	SDCA_ACCESS_MODE_RW				= 0x0,
593 	SDCA_ACCESS_MODE_DUAL				= 0x1,
594 	SDCA_ACCESS_MODE_RW1C				= 0x2,
595 	SDCA_ACCESS_MODE_RO				= 0x3,
596 	SDCA_ACCESS_MODE_RW1S				= 0x4,
597 	SDCA_ACCESS_MODE_DC				= 0x5,
598 };
599 
600 /**
601  * enum sdca_access_layer - SDCA Control access layer
602  *
603  * Access layers as described in the SDCA specification v1.0 section
604  * 7.1.9.
605  */
606 enum sdca_access_layer {
607 	SDCA_ACCESS_LAYER_USER				= 1 << 0,
608 	SDCA_ACCESS_LAYER_APPLICATION			= 1 << 1,
609 	SDCA_ACCESS_LAYER_CLASS				= 1 << 2,
610 	SDCA_ACCESS_LAYER_PLATFORM			= 1 << 3,
611 	SDCA_ACCESS_LAYER_DEVICE			= 1 << 4,
612 	SDCA_ACCESS_LAYER_EXTENSION			= 1 << 5,
613 };
614 
615 /**
616  * struct sdca_control_range - SDCA Control range table
617  * @cols: Number of columns in the range table.
618  * @rows: Number of rows in the range table.
619  * @data: Array of values contained in the range table.
620  */
621 struct sdca_control_range {
622 	unsigned int cols;
623 	unsigned int rows;
624 	u32 *data;
625 };
626 
627 /**
628  * struct sdca_control - information for one SDCA Control
629  * @label: Name for the Control, from SDCA Specification v1.0, section 7.1.7.
630  * @sel: Identifier used for addressing.
631  * @value: Holds the Control value for constants and defaults.
632  * @nbits: Number of bits used in the Control.
633  * @interrupt_position: SCDA interrupt line that will alert to changes on this
634  * Control.
635  * @cn_list: A bitmask showing the valid Control Numbers within this Control,
636  * Control Numbers typically represent channels.
637  * @range: Buffer describing valid range of values for the Control.
638  * @mode: Access mode of the Control.
639  * @layers: Bitmask of access layers of the Control.
640  * @deferrable: Indicates if the access to the Control can be deferred.
641  * @has_default: Indicates the Control has a default value to be written.
642  * @has_fixed: Indicates the Control only supports a single value.
643  */
644 struct sdca_control {
645 	const char *label;
646 	int sel;
647 
648 	int value;
649 	int nbits;
650 	int interrupt_position;
651 	u64 cn_list;
652 
653 	struct sdca_control_range range;
654 	enum sdca_access_mode mode;
655 	u8 layers;
656 
657 	bool deferrable;
658 	bool has_default;
659 	bool has_fixed;
660 };
661 
662 /**
663  * enum sdca_entity_type - SDCA Entity Type codes
664  * @SDCA_ENTITY_TYPE_ENTITY_0: Entity 0, not actually from the
665  * specification but useful internally as an Entity structure
666  * is allocated for Entity 0, to hold Entity 0 controls.
667  * @SDCA_ENTITY_TYPE_IT: Input Terminal.
668  * @SDCA_ENTITY_TYPE_OT: Output Terminal.
669  * @SDCA_ENTITY_TYPE_MU: Mixer Unit.
670  * @SDCA_ENTITY_TYPE_SU: Selector Unit.
671  * @SDCA_ENTITY_TYPE_FU: Feature Unit.
672  * @SDCA_ENTITY_TYPE_XU: Extension Unit.
673  * @SDCA_ENTITY_TYPE_CS: Clock Source.
674  * @SDCA_ENTITY_TYPE_CX: Clock selector.
675  * @SDCA_ENTITY_TYPE_PDE: Power-Domain Entity.
676  * @SDCA_ENTITY_TYPE_GE: Group Entity.
677  * @SDCA_ENTITY_TYPE_SPE: Security & Privacy Entity.
678  * @SDCA_ENTITY_TYPE_CRU: Channel Remapping Unit.
679  * @SDCA_ENTITY_TYPE_UDMPU: Up-Down Mixer Processing Unit.
680  * @SDCA_ENTITY_TYPE_MFPU: Multi-Function Processing Unit.
681  * @SDCA_ENTITY_TYPE_SMPU: Smart Microphone Processing Unit.
682  * @SDCA_ENTITY_TYPE_SAPU: Smart Amp Processing Unit.
683  * @SDCA_ENTITY_TYPE_PPU: Posture Processing Unit.
684  * @SDCA_ENTITY_TYPE_TG: Tone Generator.
685  * @SDCA_ENTITY_TYPE_HIDE: Human Interface Device Entity.
686  *
687  * SDCA Entity Types from SDCA specification v1.0 Section 6.1.2
688  * all Entity Types not described are reserved.
689  */
690 enum sdca_entity_type {
691 	SDCA_ENTITY_TYPE_ENTITY_0			= 0x00,
692 	SDCA_ENTITY_TYPE_IT				= 0x02,
693 	SDCA_ENTITY_TYPE_OT				= 0x03,
694 	SDCA_ENTITY_TYPE_MU				= 0x05,
695 	SDCA_ENTITY_TYPE_SU				= 0x06,
696 	SDCA_ENTITY_TYPE_FU				= 0x07,
697 	SDCA_ENTITY_TYPE_XU				= 0x0A,
698 	SDCA_ENTITY_TYPE_CS				= 0x0B,
699 	SDCA_ENTITY_TYPE_CX				= 0x0C,
700 	SDCA_ENTITY_TYPE_PDE				= 0x11,
701 	SDCA_ENTITY_TYPE_GE				= 0x12,
702 	SDCA_ENTITY_TYPE_SPE				= 0x13,
703 	SDCA_ENTITY_TYPE_CRU				= 0x20,
704 	SDCA_ENTITY_TYPE_UDMPU				= 0x21,
705 	SDCA_ENTITY_TYPE_MFPU				= 0x22,
706 	SDCA_ENTITY_TYPE_SMPU				= 0x23,
707 	SDCA_ENTITY_TYPE_SAPU				= 0x24,
708 	SDCA_ENTITY_TYPE_PPU				= 0x25,
709 	SDCA_ENTITY_TYPE_TG				= 0x30,
710 	SDCA_ENTITY_TYPE_HIDE				= 0x31,
711 };
712 
713 /**
714  * struct sdca_entity - information for one SDCA Entity
715  * @label: String such as "OT 12".
716  * @id: Identifier used for addressing.
717  * @type: Type code for the Entity.
718  * @sources: Dynamically allocated array pointing to each input Entity
719  * connected to this Entity.
720  * @controls: Dynamically allocated array of Controls.
721  * @num_sources: Number of sources for the Entity.
722  * @num_controls: Number of Controls for the Entity.
723  */
724 struct sdca_entity {
725 	const char *label;
726 	int id;
727 	enum sdca_entity_type type;
728 
729 	struct sdca_entity **sources;
730 	struct sdca_control *controls;
731 	int num_sources;
732 	int num_controls;
733 };
734 
735 /**
736  * struct sdca_function_data - top-level information for one SDCA function
737  * @desc: Pointer to short descriptor from initial parsing.
738  * @init_table: Pointer to a table of initialization writes.
739  * @entities: Dynamically allocated array of Entities.
740  * @num_init_table: Number of initialization writes.
741  * @num_entities: Number of Entities reported in this Function.
742  * @busy_max_delay: Maximum Function busy delay in microseconds, before an
743  * error should be reported.
744  */
745 struct sdca_function_data {
746 	struct sdca_function_desc *desc;
747 
748 	struct sdca_init_write *init_table;
749 	struct sdca_entity *entities;
750 	int num_init_table;
751 	int num_entities;
752 
753 	unsigned int busy_max_delay;
754 };
755 
756 int sdca_parse_function(struct device *dev,
757 			struct sdca_function_desc *desc,
758 			struct sdca_function_data *function);
759 
760 #endif
761