xref: /linux-6.15/include/sound/sdca_function.h (revision 9ee6d50a)
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  * enum sdca_entity0_controls - SDCA Controls for Entity 0
86  *
87  * Control Selectors for Entity 0 from SDCA specification v1.0 Section
88  * 6.7.1.1.
89  */
90 enum sdca_entity0_controls {
91 	SDCA_CTL_ENTITY_0_COMMIT_GROUP_MASK		= 0x01,
92 	SDCA_CTL_ENTITY_0_FUNCTION_SDCA_VERSION		= 0x04,
93 	SDCA_CTL_ENTITY_0_FUNCTION_TYPE			= 0x05,
94 	SDCA_CTL_ENTITY_0_FUNCTION_MANUFACTURER_ID	= 0x06,
95 	SDCA_CTL_ENTITY_0_FUNCTION_ID			= 0x07,
96 	SDCA_CTL_ENTITY_0_FUNCTION_VERSION		= 0x08,
97 	SDCA_CTL_ENTITY_0_FUNCTION_EXTENSION_ID		= 0x09,
98 	SDCA_CTL_ENTITY_0_FUNCTION_EXTENSION_VERSION	= 0x0A,
99 	SDCA_CTL_ENTITY_0_FUNCTION_STATUS		= 0x10,
100 	SDCA_CTL_ENTITY_0_FUNCTION_ACTION		= 0x11,
101 	SDCA_CTL_ENTITY_0_MATCHING_GUID			= 0x12,
102 	SDCA_CTL_ENTITY_0_DEVICE_MANUFACTURER_ID	= 0x2C,
103 	SDCA_CTL_ENTITY_0_DEVICE_PART_ID		= 0x2D,
104 	SDCA_CTL_ENTITY_0_DEVICE_VERSION		= 0x2E,
105 	SDCA_CTL_ENTITY_0_DEVICE_SDCA_VERSION		= 0x2F,
106 
107 	/* Function Status Bits */
108 	SDCA_CTL_ENTITY_0_DEVICE_NEWLY_ATTACHED		= BIT(0),
109 	SDCA_CTL_ENTITY_0_INTS_DISABLED_ABNORMALLY	= BIT(1),
110 	SDCA_CTL_ENTITY_0_STREAMING_STOPPED_ABNORMALLY	= BIT(2),
111 	SDCA_CTL_ENTITY_0_FUNCTION_FAULT		= BIT(3),
112 	SDCA_CTL_ENTITY_0_UMP_SEQUENCE_FAULT		= BIT(4),
113 	SDCA_CTL_ENTITY_0_FUNCTION_NEEDS_INITIALIZATION	= BIT(5),
114 	SDCA_CTL_ENTITY_0_FUNCTION_HAS_BEEN_RESET	= BIT(6),
115 	SDCA_CTL_ENTITY_0_FUNCTION_BUSY			= BIT(7),
116 };
117 
118 /**
119  * enum sdca_entity_type - SDCA Entity Type codes
120  * @SDCA_ENTITY_TYPE_ENTITY_0: Entity 0, not actually from the
121  * specification but useful internally as an Entity structure
122  * is allocated for Entity 0, to hold Entity 0 controls.
123  * @SDCA_ENTITY_TYPE_IT: Input Terminal.
124  * @SDCA_ENTITY_TYPE_OT: Output Terminal.
125  * @SDCA_ENTITY_TYPE_MU: Mixer Unit.
126  * @SDCA_ENTITY_TYPE_SU: Selector Unit.
127  * @SDCA_ENTITY_TYPE_FU: Feature Unit.
128  * @SDCA_ENTITY_TYPE_XU: Extension Unit.
129  * @SDCA_ENTITY_TYPE_CS: Clock Source.
130  * @SDCA_ENTITY_TYPE_CX: Clock selector.
131  * @SDCA_ENTITY_TYPE_PDE: Power-Domain Entity.
132  * @SDCA_ENTITY_TYPE_GE: Group Entity.
133  * @SDCA_ENTITY_TYPE_SPE: Security & Privacy Entity.
134  * @SDCA_ENTITY_TYPE_CRU: Channel Remapping Unit.
135  * @SDCA_ENTITY_TYPE_UDMPU: Up-Down Mixer Processing Unit.
136  * @SDCA_ENTITY_TYPE_MFPU: Multi-Function Processing Unit.
137  * @SDCA_ENTITY_TYPE_SMPU: Smart Microphone Processing Unit.
138  * @SDCA_ENTITY_TYPE_SAPU: Smart Amp Processing Unit.
139  * @SDCA_ENTITY_TYPE_PPU: Posture Processing Unit.
140  * @SDCA_ENTITY_TYPE_TG: Tone Generator.
141  * @SDCA_ENTITY_TYPE_HIDE: Human Interface Device Entity.
142  *
143  * SDCA Entity Types from SDCA specification v1.0 Section 6.1.2
144  * all Entity Types not described are reserved.
145  */
146 enum sdca_entity_type {
147 	SDCA_ENTITY_TYPE_ENTITY_0			= 0x00,
148 	SDCA_ENTITY_TYPE_IT				= 0x02,
149 	SDCA_ENTITY_TYPE_OT				= 0x03,
150 	SDCA_ENTITY_TYPE_MU				= 0x05,
151 	SDCA_ENTITY_TYPE_SU				= 0x06,
152 	SDCA_ENTITY_TYPE_FU				= 0x07,
153 	SDCA_ENTITY_TYPE_XU				= 0x0A,
154 	SDCA_ENTITY_TYPE_CS				= 0x0B,
155 	SDCA_ENTITY_TYPE_CX				= 0x0C,
156 	SDCA_ENTITY_TYPE_PDE				= 0x11,
157 	SDCA_ENTITY_TYPE_GE				= 0x12,
158 	SDCA_ENTITY_TYPE_SPE				= 0x13,
159 	SDCA_ENTITY_TYPE_CRU				= 0x20,
160 	SDCA_ENTITY_TYPE_UDMPU				= 0x21,
161 	SDCA_ENTITY_TYPE_MFPU				= 0x22,
162 	SDCA_ENTITY_TYPE_SMPU				= 0x23,
163 	SDCA_ENTITY_TYPE_SAPU				= 0x24,
164 	SDCA_ENTITY_TYPE_PPU				= 0x25,
165 	SDCA_ENTITY_TYPE_TG				= 0x30,
166 	SDCA_ENTITY_TYPE_HIDE				= 0x31,
167 };
168 
169 /**
170  * struct sdca_entity - information for one SDCA Entity
171  * @label: String such as "OT 12".
172  * @id: Identifier used for addressing.
173  * @type: Type code for the Entity.
174  * @sources: Dynamically allocated array pointing to each input Entity
175  * connected to this Entity.
176  * @num_sources: Number of sources for the Entity.
177  */
178 struct sdca_entity {
179 	const char *label;
180 	int id;
181 	enum sdca_entity_type type;
182 
183 	struct sdca_entity **sources;
184 	int num_sources;
185 };
186 
187 /**
188  * struct sdca_function_data - top-level information for one SDCA function
189  * @desc: Pointer to short descriptor from initial parsing.
190  * @init_table: Pointer to a table of initialization writes.
191  * @entities: Dynamically allocated array of Entities.
192  * @num_init_table: Number of initialization writes.
193  * @num_entities: Number of Entities reported in this Function.
194  * @busy_max_delay: Maximum Function busy delay in microseconds, before an
195  * error should be reported.
196  */
197 struct sdca_function_data {
198 	struct sdca_function_desc *desc;
199 
200 	struct sdca_init_write *init_table;
201 	struct sdca_entity *entities;
202 	int num_init_table;
203 	int num_entities;
204 
205 	unsigned int busy_max_delay;
206 };
207 
208 int sdca_parse_function(struct device *dev,
209 			struct sdca_function_desc *desc,
210 			struct sdca_function_data *function);
211 
212 #endif
213